KHR_texture_transform.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /// <reference path="../../../../../dist/preview release/gltf2Interface/babylon.glTF2Interface.d.ts"/>
  2. /**
  3. * @hidden
  4. */
  5. module BABYLON.GLTF2.Exporter.Extensions {
  6. const NAME = "KHR_texture_transform";
  7. /**
  8. * Interface for handling KHR texture transform
  9. * @hidden
  10. */
  11. interface IKHRTextureTransform {
  12. offset?: number[];
  13. rotation?: number;
  14. scale?: number[];
  15. texCoord?: number;
  16. }
  17. /**
  18. * @hidden
  19. */
  20. export class KHR_texture_transform implements IGLTFExporterExtension {
  21. /** Name of this extension */
  22. public readonly name = NAME;
  23. /** Defines whether this extension is enabled */
  24. public enabled = true;
  25. /** Defines whether this extension is required */
  26. public required = false;
  27. /** Reference to the glTF exporter */
  28. private _exporter: _Exporter;
  29. constructor(exporter: _Exporter) {
  30. this._exporter = exporter;
  31. }
  32. public dispose() {
  33. delete this._exporter;
  34. }
  35. public preExportTextureAsync(context: string, babylonTexture: Texture, mimeType: ImageMimeType): Nullable<Promise<Texture>> {
  36. return new Promise((resolve, reject) => {
  37. const texture_transform_extension: IKHRTextureTransform = {};
  38. if (babylonTexture.uOffset !== 0 || babylonTexture.vOffset !== 0) {
  39. texture_transform_extension.offset = [babylonTexture.uOffset, babylonTexture.vOffset];
  40. }
  41. if (babylonTexture.uScale !== 1 || babylonTexture.vScale !== 1) {
  42. texture_transform_extension.scale = [babylonTexture.uScale, babylonTexture.vScale];
  43. }
  44. if (babylonTexture.wAng !== 0) {
  45. texture_transform_extension.rotation = babylonTexture.wAng;
  46. }
  47. if (!Object.keys(texture_transform_extension).length) {
  48. resolve(babylonTexture);
  49. }
  50. const scale = texture_transform_extension.scale ? new Vector2(texture_transform_extension.scale[0], texture_transform_extension.scale[1]) : Vector2.One();
  51. const rotation = texture_transform_extension.rotation != null ? texture_transform_extension.rotation : 0;
  52. const offset = texture_transform_extension.offset ? new Vector2(texture_transform_extension.offset[0], texture_transform_extension.offset[1]) : Vector2.Zero();
  53. const scene = babylonTexture.getScene();
  54. if (!scene) {
  55. reject(`${context}: "scene" is not defined for Babylon texture ${babylonTexture.name}!`);
  56. }
  57. else {
  58. this.textureTransformTextureAsync(babylonTexture, offset, rotation, scale, scene).then((texture) => {
  59. resolve(texture as Texture);
  60. });
  61. }
  62. });
  63. }
  64. /**
  65. * Transform the babylon texture by the offset, rotation and scale parameters using a procedural texture
  66. * @param babylonTexture
  67. * @param offset
  68. * @param rotation
  69. * @param scale
  70. * @param scene
  71. */
  72. public textureTransformTextureAsync(babylonTexture: Texture, offset: Vector2, rotation: number, scale: Vector2, scene: Scene): Promise<BaseTexture> {
  73. return new Promise((resolve, reject) => {
  74. const proceduralTexture = new ProceduralTexture(`${babylonTexture.name}`, babylonTexture.getSize(), "textureTransform", scene);
  75. if (!proceduralTexture) {
  76. Tools.Log(`Cannot create procedural texture for ${babylonTexture.name}!`);
  77. resolve(babylonTexture);
  78. }
  79. proceduralTexture.setTexture("textureSampler", babylonTexture);
  80. proceduralTexture.setMatrix("textureTransformMat", babylonTexture.getTextureMatrix());
  81. // isReady trigger creation of effect if it doesnt exist yet
  82. if (proceduralTexture.isReady()) {
  83. proceduralTexture.render();
  84. resolve(proceduralTexture);
  85. }else {
  86. (proceduralTexture as any)._effect.onCompileObservable.add(() => {
  87. proceduralTexture.render();
  88. resolve(proceduralTexture);
  89. });
  90. }
  91. });
  92. }
  93. }
  94. _Exporter.RegisterExtension(NAME, (exporter) => new KHR_texture_transform(exporter));
  95. }