Browse Source

Fix WhenAllReady with CubeTextures

David Catuhe 5 years ago
parent
commit
821ea15632

+ 5 - 3
inspector/src/components/actionTabs/tabs/propertyGrids/meshes/meshPropertyGridComponent.tsx

@@ -286,11 +286,11 @@ export class MeshPropertyGridComponent extends React.Component<IMeshPropertyGrid
             { label: "Strict", value: AbstractMesh.OCCLUSION_TYPE_STRICT },
         ];
 
-        let sortedMaterials = scene.materials.slice(0).sort((a, b) => a.name.localeCompare(b.name));
+        let sortedMaterials = scene.materials.slice(0).sort((a, b) => (a.name || "no name").localeCompare(b.name || "no name"));
 
         var materialOptions = sortedMaterials.map((m, i) => {
             return {
-                label: m.name,
+                label: m.name || "no name",
                 value: i
             }});
 
@@ -325,7 +325,8 @@ export class MeshPropertyGridComponent extends React.Component<IMeshPropertyGrid
                         mesh.material && (!mesh.material.reservedDataStore || !mesh.material.reservedDataStore.hidden) &&
                         <TextLineComponent label="Link to material" value={mesh.material.name} onLink={() => this.onMaterialLink()} />
                     }
-                    <OptionsLineComponent label="Active material" options={materialOptions} 
+                    {   !mesh.isAnInstance &&
+                        <OptionsLineComponent label="Active material" options={materialOptions} 
                             target={mesh} propertyName="material" 
                             noDirectUpdate={true}
                             onSelect={(value: number) => {
@@ -339,6 +340,7 @@ export class MeshPropertyGridComponent extends React.Component<IMeshPropertyGrid
                             }}
                             extractValue={() => mesh.material ? sortedMaterials.indexOf(mesh.material) : -1}
                             onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
+                    }
                     {
                         mesh.isAnInstance &&
                         <TextLineComponent label="Source" value={(mesh as any).sourceMesh.name} onLink={() => this.onSourceMeshLink()} />

+ 10 - 8
src/Materials/Textures/baseTexture.ts

@@ -773,14 +773,16 @@ export class BaseTexture implements IAnimatable {
             else {
                 var onLoadObservable = (texture as any).onLoadObservable as Observable<BaseTexture>;
 
-                let onLoadCallback = () => {
-                    onLoadObservable.removeCallback(onLoadCallback);
-                    if (--numRemaining === 0) {
-                        callback();
-                    }
-                };
-
-                onLoadObservable.add(onLoadCallback);
+                if (onLoadObservable) {
+                    let onLoadCallback = () => {
+                        onLoadObservable.removeCallback(onLoadCallback);
+                        if (--numRemaining === 0) {
+                            callback();
+                        }
+                    };
+
+                    onLoadObservable.add(onLoadCallback);
+                }
             }
         }
     }

+ 18 - 3
src/Materials/Textures/cubeTexture.ts

@@ -10,12 +10,18 @@ import { _TypeStore } from '../../Misc/typeStore';
 
 import "../../Engines/Extensions/engine.cubeTexture";
 import { StringTools } from '../../Misc/stringTools';
+import { Observable } from '../../Misc/observable';
 
 /**
  * Class for creating a cube texture
  */
 export class CubeTexture extends BaseTexture {
     private _delayedOnLoad: Nullable<() => void>;
+    
+    /**
+     * Observable triggered once the texture has been loaded.
+     */
+    public onLoadObservable: Observable<CubeTexture> = new Observable<CubeTexture>();
 
     /**
      * The url of the texture
@@ -212,6 +218,13 @@ export class CubeTexture extends BaseTexture {
 
         this._files = files;
 
+        let onLoadProcessing = () => {
+            this.onLoadObservable.notifyObservers(this);
+            if (onLoad) {
+                onLoad();
+            }
+        }
+
         if (!this._texture) {
             if (!scene.useDelayedTextureLoading) {
                 if (prefiltered) {
@@ -220,14 +233,16 @@ export class CubeTexture extends BaseTexture {
                 else {
                     this._texture = scene.getEngine().createCubeTexture(rootUrl, scene, files, noMipmap, onLoad, onError, this._format, forcedExtension, false, lodScale, lodOffset);
                 }
+                this._texture.onLoadedObservable.add(() => this.onLoadObservable.notifyObservers(this));
+                
             } else {
                 this.delayLoadState = Constants.DELAYLOADSTATE_NOTLOADED;
             }
-        } else if (onLoad) {
+        } else {
             if (this._texture.isReady) {
-                Tools.SetImmediate(() => onLoad());
+                Tools.SetImmediate(() => onLoadProcessing());
             } else {
-                this._texture.onLoadedObservable.add(onLoad);
+                this._texture.onLoadedObservable.add(() => onLoadProcessing());
             }
         }
     }

BIN
tests/validation/ReferenceImages/sprite-maps.png


+ 6 - 1
tests/validation/config.json

@@ -5,7 +5,12 @@
             "title": "Black and White post-process",
             "playgroundId": "#N55Q2M#0",
             "referenceImage": "bwpp.png"
-        },             
+        },           
+        {
+            "title": "Sprite maps",
+            "playgroundId": "#ARLADE#22",
+            "referenceImage": "sprite-maps.png"
+        },              
         {
             "title": "Point light shadows",
             "playgroundId": "#U2F7P9#4",