David Catuhe 5 years ago
parent
commit
14df4b3d80

+ 6 - 20
serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts

@@ -67,27 +67,13 @@ export class KHR_lights_punctual implements IGLTFExporterExtensionV2 {
     }
 
     /** @hidden */
+    public get wasUsed() {
+        return !!this._lights;
+    }
+
+    /** @hidden */
     public onExporting(): void {
-        if (this._lights) {
-            if (this._exporter._glTF.extensionsUsed == null) {
-                this._exporter._glTF.extensionsUsed = [];
-            }
-            if (this._exporter._glTF.extensionsUsed.indexOf(NAME) === -1) {
-                this._exporter._glTF.extensionsUsed.push(NAME);
-            }
-            if (this.required) {
-                if (this._exporter._glTF.extensionsRequired == null) {
-                    this._exporter._glTF.extensionsRequired = [];
-                }
-                if (this._exporter._glTF.extensionsRequired.indexOf(NAME) === -1) {
-                    this._exporter._glTF.extensionsRequired.push(NAME);
-                }
-            }
-            if (this._exporter._glTF.extensions == null) {
-                this._exporter._glTF.extensions = {};
-            }
-            this._exporter._glTF.extensions[NAME] = this._lights;
-        }
+        this._exporter!._glTF.extensions![NAME] = this._lights;
     }
     /**
      * Define this method to modify the default behavior when exporting a node

+ 2 - 20
serializers/src/glTF/2.0/Extensions/KHR_materials_sheen.ts

@@ -44,26 +44,8 @@ export class KHR_materials_sheen implements IGLTFExporterExtensionV2 {
     }
 
     /** @hidden */
-    public onExporting(): void {
-        if (this._wasUsed) {
-            if (this._exporter._glTF.extensionsUsed == null) {
-                this._exporter._glTF.extensionsUsed = [];
-            }
-            if (this._exporter._glTF.extensionsUsed.indexOf(NAME) === -1) {
-                this._exporter._glTF.extensionsUsed.push(NAME);
-            }
-            if (this.required) {
-                if (this._exporter._glTF.extensionsRequired == null) {
-                    this._exporter._glTF.extensionsRequired = [];
-                }
-                if (this._exporter._glTF.extensionsRequired.indexOf(NAME) === -1) {
-                    this._exporter._glTF.extensionsRequired.push(NAME);
-                }
-            }
-            if (this._exporter._glTF.extensions == null) {
-                this._exporter._glTF.extensions = {};
-            }
-        }
+    public get wasUsed() {
+        return this._wasUsed;
     }
 
     public postExportTexture?(context: string, textureInfo: ITextureInfo, babylonTexture: Texture): void {

+ 53 - 10
serializers/src/glTF/2.0/Extensions/KHR_texture_transform.ts

@@ -1,4 +1,4 @@
-import { ImageMimeType } from "babylonjs-gltf2interface";
+import { ImageMimeType, ITextureInfo } from "babylonjs-gltf2interface";
 import { Tools } from "babylonjs/Misc/tools";
 import { Texture } from "babylonjs/Materials/Textures/texture";
 import { ProceduralTexture } from "babylonjs/Materials/Textures/Procedurals/proceduralTexture";
@@ -39,6 +39,7 @@ export class KHR_texture_transform implements IGLTFExporterExtensionV2 {
 
     /** Reference to the glTF exporter */
     private _exporter: _Exporter;
+    private _isUsed = true;
 
     constructor(exporter: _Exporter) {
         this._exporter = exporter;
@@ -52,6 +53,48 @@ export class KHR_texture_transform implements IGLTFExporterExtensionV2 {
         delete this._exporter;
     }
 
+    /** @hidden */
+    public get wasUsed() {
+        return this._isUsed;
+    }
+
+    public postExportTexture?(context: string, textureInfo: ITextureInfo, babylonTexture: Texture): void {
+        if (babylonTexture && babylonTexture.uRotationCenter === 0 && babylonTexture.vRotationCenter === 0) {
+            let textureTransform: IKHRTextureTransform = {};
+            let transformIsRequired = false;
+
+            if (babylonTexture.uOffset !== 0 || babylonTexture.vOffset !== 0) {
+                textureTransform.offset = [babylonTexture.uOffset, babylonTexture.vOffset];
+                transformIsRequired = true;
+            }
+
+            if (babylonTexture.uScale !== 1 || babylonTexture.vScale !== 1) {
+                textureTransform.scale = [babylonTexture.uScale, babylonTexture.vScale];
+                transformIsRequired = true;
+            }
+
+            if (babylonTexture.wAng !== 0) {
+                textureTransform.rotation = babylonTexture.wAng;
+                transformIsRequired = true;
+            }
+
+            if (babylonTexture.coordinatesIndex !== 0) {
+                textureTransform.texCoord = babylonTexture.coordinatesIndex;
+                transformIsRequired = true;
+            }
+
+            if (!transformIsRequired) {
+                return;
+            }
+
+            this._isUsed = true;
+            if (!textureInfo.extensions) {
+                textureInfo.extensions = {};
+            }
+            textureInfo.extensions[NAME] = textureTransform;
+        }
+    }
+
     public preExportTextureAsync(context: string, babylonTexture: Texture, mimeType: ImageMimeType): Promise<Texture> {
         return new Promise((resolve, reject) => {
             const scene = babylonTexture.getScene();
@@ -60,27 +103,27 @@ export class KHR_texture_transform implements IGLTFExporterExtensionV2 {
                 return;
             }
 
-            // TODO: this doesn't take into account rotation center values
-
-            const texture_transform_extension: IKHRTextureTransform = {};
+            let transformIsRequired = false;
 
             if (babylonTexture.uOffset !== 0 || babylonTexture.vOffset !== 0) {
-                texture_transform_extension.offset = [babylonTexture.uOffset, babylonTexture.vOffset];
+                transformIsRequired = true;
             }
 
             if (babylonTexture.uScale !== 1 || babylonTexture.vScale !== 1) {
-                texture_transform_extension.scale = [babylonTexture.uScale, babylonTexture.vScale];
+                transformIsRequired = true;
             }
 
             if (babylonTexture.wAng !== 0) {
-                texture_transform_extension.rotation = babylonTexture.wAng;
+                transformIsRequired = true;
             }
 
-            if (babylonTexture.coordinatesIndex !== 0) {
-                texture_transform_extension.texCoord = babylonTexture.coordinatesIndex;
+            if (!transformIsRequired) {
+                resolve(babylonTexture);
+                return;
             }
 
-            if (!Object.keys(texture_transform_extension).length) {
+            // Do we need to flatten the transform?
+            if (babylonTexture.uRotationCenter === 0 && babylonTexture.vRotationCenter === 0) {
                 resolve(babylonTexture);
                 return;
             }

+ 25 - 1
serializers/src/glTF/2.0/glTFExporter.ts

@@ -215,7 +215,31 @@ export class _Exporter {
     }
 
     private _extensionsOnExporting(): void {
-        this._forEachExtensions((extension) => extension.onExporting && extension.onExporting());
+        this._forEachExtensions((extension) => {
+            if (extension.wasUsed) {
+                if (this._glTF.extensionsUsed == null) {
+                    this._glTF.extensionsUsed = [];
+                }
+                if (this._glTF.extensionsUsed.indexOf(extension.name) === -1) {
+                    this._glTF.extensionsUsed.push(extension.name);
+                }
+                if (extension.required) {
+                    if (this._glTF.extensionsRequired == null) {
+                        this._glTF.extensionsRequired = [];
+                    }
+                    if (this._glTF.extensionsRequired.indexOf(extension.name) === -1) {
+                        this._glTF.extensionsRequired.push(extension.name);
+                    }
+                }
+                if (this._glTF.extensions == null) {
+                    this._glTF.extensions = {};
+                }
+
+                if (extension.onExporting) {
+                    extension.onExporting();
+                }
+            }
+        });
     }
 
     /**

+ 7 - 1
serializers/src/glTF/2.0/glTFExporterExtension.ts

@@ -63,13 +63,19 @@ export interface IGLTFExporterExtensionV2 extends IGLTFExporterExtension, IDispo
     postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
 
     /**
-     * Defint this method to return additional textures to export from a material
+     * Define this method to return additional textures to export from a material
      * @param material glTF material
      * @param babylonMaterial BabylonJS material
      * @returns List of textures
      */
     postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[];
 
+    /** Gets a boolean indicating that this extension was used */
+    wasUsed: boolean;
+
+    /** Gets a boolean indicating that this extension is required for the file to work */
+    required: boolean;
+
     /**
      * Called after the exporter state changes to EXPORTING
      */