Selaa lähdekoodia

Merge pull request #5747 from sebavan/master

 Fix highlight on unready meshes
sebavan 6 vuotta sitten
vanhempi
commit
91266cd5c6
2 muutettua tiedostoa jossa 29 lisäystä ja 9 poistoa
  1. 9 9
      src/Layers/highlightLayer.ts
  2. 20 0
      src/Meshes/mesh.ts

+ 9 - 9
src/Layers/highlightLayer.ts

@@ -157,7 +157,7 @@ interface IHighlightLayerExcludedMesh {
     /**
      * The mesh render callback use to prevent stencil use
      */
-    beforeRender: Nullable<Observer<Mesh>>;
+    beforeBind: Nullable<Observer<Mesh>>;
     /**
      * The mesh render callback use to restore previous stencil use
      */
@@ -572,7 +572,7 @@ export class HighlightLayer extends EffectLayer {
         if (!meshExcluded) {
             this._excludedMeshes[mesh.uniqueId] = {
                 mesh: mesh,
-                beforeRender: mesh.onBeforeRenderObservable.add((mesh: Mesh) => {
+                beforeBind: mesh.onBeforeBindObservable.add((mesh: Mesh) => {
                     mesh.getEngine().setStencilBuffer(false);
                 }),
                 afterRender: mesh.onAfterRenderObservable.add((mesh: Mesh) => {
@@ -593,8 +593,8 @@ export class HighlightLayer extends EffectLayer {
 
         var meshExcluded = this._excludedMeshes[mesh.uniqueId];
         if (meshExcluded) {
-            if (meshExcluded.beforeRender) {
-                mesh.onBeforeRenderObservable.remove(meshExcluded.beforeRender);
+            if (meshExcluded.beforeBind) {
+                mesh.onBeforeBindObservable.remove(meshExcluded.beforeBind);
             }
 
             if (meshExcluded.afterRender) {
@@ -642,7 +642,7 @@ export class HighlightLayer extends EffectLayer {
                 mesh: mesh,
                 color: color,
                 // Lambda required for capture due to Observable this context
-                observerHighlight: mesh.onBeforeRenderObservable.add((mesh: Mesh) => {
+                observerHighlight: mesh.onBeforeBindObservable.add((mesh: Mesh) => {
                     if (this._excludedMeshes && this._excludedMeshes[mesh.uniqueId]) {
                         this._defaultStencilReference(mesh);
                     }
@@ -675,7 +675,7 @@ export class HighlightLayer extends EffectLayer {
         if (meshHighlight) {
 
             if (meshHighlight.observerHighlight) {
-                mesh.onBeforeRenderObservable.remove(meshHighlight.observerHighlight);
+                mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);
             }
 
             if (meshHighlight.observerDefault) {
@@ -722,7 +722,7 @@ export class HighlightLayer extends EffectLayer {
                 if (meshHighlight && meshHighlight.mesh) {
 
                     if (meshHighlight.observerHighlight) {
-                        meshHighlight.mesh.onBeforeRenderObservable.remove(meshHighlight.observerHighlight);
+                        meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.observerHighlight);
                     }
 
                     if (meshHighlight.observerDefault) {
@@ -738,8 +738,8 @@ export class HighlightLayer extends EffectLayer {
                 let meshHighlight = this._excludedMeshes[id];
                 if (meshHighlight) {
 
-                    if (meshHighlight.beforeRender) {
-                        meshHighlight.mesh.onBeforeRenderObservable.remove(meshHighlight.beforeRender);
+                    if (meshHighlight.beforeBind) {
+                        meshHighlight.mesh.onBeforeBindObservable.remove(meshHighlight.beforeBind);
                     }
 
                     if (meshHighlight.afterRender) {

+ 20 - 0
src/Meshes/mesh.ts

@@ -130,6 +130,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
 
     // Events
     private _onBeforeRenderObservable: Nullable<Observable<Mesh>>;
+    private _onBeforeBindObservable: Nullable<Observable<Mesh>>;
     private _onAfterRenderObservable: Nullable<Observable<Mesh>>;
     private _onBeforeDrawObservable: Nullable<Observable<Mesh>>;
 
@@ -145,6 +146,17 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
     }
 
     /**
+     * An event triggered before binding the mesh
+     */
+    public get onBeforeBindObservable(): Observable<Mesh> {
+        if (!this._onBeforeBindObservable) {
+            this._onBeforeBindObservable = new Observable<Mesh>();
+        }
+
+        return this._onBeforeBindObservable;
+    }
+
+    /**
     * An event triggered after rendering the mesh
     */
     public get onAfterRenderObservable(): Observable<Mesh> {
@@ -1578,6 +1590,10 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
         // Bind
         var fillMode = scene.forcePointsCloud ? Material.PointFillMode : (scene.forceWireframe ? Material.WireFrameFillMode : this._effectiveMaterial.fillMode);
 
+        if (this._onBeforeBindObservable) {
+            this._onBeforeBindObservable.notifyObservers(this);
+        }
+
         if (!hardwareInstancedRendering) { // Binding will be done later because we need to add more info to the VB
             this._bind(subMesh, effect, fillMode);
         }
@@ -2005,6 +2021,10 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData {
             this._onBeforeDrawObservable.clear();
         }
 
+        if (this._onBeforeBindObservable) {
+            this._onBeforeBindObservable.clear();
+        }
+
         if (this._onBeforeRenderObservable) {
             this._onBeforeRenderObservable.clear();
         }