소스 검색

Merge pull request #1432 from Swiftwork/master

Fix HighlightLayer crash when working with an InstancedMesh.
David Catuhe 8 년 전
부모
커밋
6bc6e197f3
2개의 변경된 파일61개의 추가작업 그리고 28개의 파일을 삭제
  1. 11 6
      canvas2D/gulp-addModuleExports.js
  2. 50 22
      src/Layer/babylon.highlightlayer.ts

+ 11 - 6
canvas2D/gulp-addModuleExports.js

@@ -18,11 +18,16 @@ module.exports = function (varName) {
         '};\n';
 
         var decorateAddition =
-        'var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n' +
-            'var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n' +
-            'if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n' +
-            'else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n' +
-            'return c > 3 && r && Object.defineProperty(target, key, r), r;\n' +
+        'var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n' +
+            'var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n' +
+            'if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n' +
+            'else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n' +
+            'return c > 3 && r && Object.defineProperty(target, key, r), r;\n' +
+        '};\n';
+
+        var dependencyAddition =
+        'if (typeof BABYLON === "undefined") {\n' +
+            'throw "BabylonJS is a required dependency, please include it first!"\n' +
         '};\n';
 
         if (file.isNull()) {
@@ -36,7 +41,7 @@ module.exports = function (varName) {
         }
 
         try {
-            file.contents = new Buffer(decorateAddition.concat(new Buffer(extendsAddition.concat(String(file.contents)).concat(moduleExportsAddition))));
+            file.contents = new Buffer(decorateAddition.concat(new Buffer(extendsAddition.concat(dependencyAddition).concat(String(file.contents)).concat(moduleExportsAddition))));
             this.push(file);
 
         } catch (err) {

+ 50 - 22
src/Layer/babylon.highlightlayer.ts

@@ -630,15 +630,22 @@
          * Add a mesh in the exclusion list to prevent it to impact or being impacted by the highlight layer.
          * @param mesh The mesh to exclude from the highlight layer
          */
-        public addExcludedMesh(mesh: Mesh) {
-            var meshExcluded = this._excludedMeshes[mesh.id];
+        public addExcludedMesh(mesh: AbstractMesh) {
+            var sourceMesh: Mesh;
+            if (mesh instanceof InstancedMesh) {
+              sourceMesh = (<InstancedMesh> mesh).sourceMesh;
+            } else {
+              sourceMesh = <Mesh> mesh;
+            }
+
+            var meshExcluded = this._excludedMeshes[sourceMesh.id];
             if (!meshExcluded) {
-                this._excludedMeshes[mesh.id] = {
-                    mesh: mesh,
-                    beforeRender: mesh.onBeforeRenderObservable.add((mesh: Mesh) => {
+                this._excludedMeshes[sourceMesh.id] = {
+                    mesh: sourceMesh,
+                    beforeRender: sourceMesh.onBeforeRenderObservable.add((mesh: Mesh) => {
                         mesh.getEngine().setStencilBuffer(false);
                     }),
-                    afterRender: mesh.onAfterRenderObservable.add((mesh: Mesh) => {
+                    afterRender: sourceMesh.onAfterRenderObservable.add((mesh: Mesh) => {
                         mesh.getEngine().setStencilBuffer(true);
                     }),
                 }
@@ -649,14 +656,21 @@
           * Remove a mesh from the exclusion list to let it impact or being impacted by the highlight layer.
           * @param mesh The mesh to highlight
           */
-        public removeExcludedMesh(mesh: Mesh) {
-            var meshExcluded = this._excludedMeshes[mesh.id];
+        public removeExcludedMesh(mesh: AbstractMesh) {
+            var sourceMesh: Mesh;
+            if (mesh instanceof InstancedMesh) {
+              sourceMesh = (<InstancedMesh> mesh).sourceMesh;
+            } else {
+              sourceMesh = <Mesh> mesh;
+            }
+
+            var meshExcluded = this._excludedMeshes[sourceMesh.id];
             if (meshExcluded) {
-                mesh.onBeforeRenderObservable.remove(meshExcluded.beforeRender);
-                mesh.onAfterRenderObservable.remove(meshExcluded.afterRender);
+                sourceMesh.onBeforeRenderObservable.remove(meshExcluded.beforeRender);
+                sourceMesh.onAfterRenderObservable.remove(meshExcluded.afterRender);
             }
 
-            this._excludedMeshes[mesh.id] = undefined;
+            this._excludedMeshes[sourceMesh.id] = undefined;
         }
 
         /**
@@ -665,17 +679,24 @@
          * @param color The color of the highlight
          * @param glowEmissiveOnly Extract the glow from the emissive texture
          */
-        public addMesh(mesh: Mesh, color: Color3, glowEmissiveOnly = false) {
-            var meshHighlight = this._meshes[mesh.id];
+        public addMesh(mesh: AbstractMesh, color: Color3, glowEmissiveOnly = false) {
+            var sourceMesh: Mesh;
+            if (mesh instanceof InstancedMesh) {
+              sourceMesh = (<InstancedMesh> mesh).sourceMesh;
+            } else {
+              sourceMesh = <Mesh> mesh;
+            }
+
+            var meshHighlight = this._meshes[sourceMesh.id];
             if (meshHighlight) {
                 meshHighlight.color = color;
             }
             else {
-                this._meshes[mesh.id] = {
-                    mesh: mesh,
+                this._meshes[sourceMesh.id] = {
+                    mesh: sourceMesh,
                     color: color,
                     // Lambda required for capture due to Observable this context
-                    observerHighlight: mesh.onBeforeRenderObservable.add((mesh: Mesh) => {
+                    observerHighlight: sourceMesh.onBeforeRenderObservable.add((mesh: Mesh) => {
                         if (this._excludedMeshes[mesh.id]) {
                             this.defaultStencilReference(mesh);
                         }
@@ -683,7 +704,7 @@
                             mesh.getScene().getEngine().setStencilFunctionReference(this._instanceGlowingMeshStencilReference);
                         }
                     }),
-                    observerDefault: mesh.onAfterRenderObservable.add(this.defaultStencilReference),
+                    observerDefault: sourceMesh.onAfterRenderObservable.add(this.defaultStencilReference),
                     glowEmissiveOnly: glowEmissiveOnly
                 };
             }
@@ -695,14 +716,21 @@
          * Remove a mesh from the highlight layer in order to make it stop glowing.
          * @param mesh The mesh to highlight
          */
-        public removeMesh(mesh: Mesh) {
-            var meshHighlight = this._meshes[mesh.id];
+        public removeMesh(mesh: AbstractMesh) {
+            var sourceMesh: Mesh;
+            if (mesh instanceof InstancedMesh) {
+              sourceMesh = (<InstancedMesh> mesh).sourceMesh;
+            } else {
+              sourceMesh = <Mesh> mesh;
+            }
+            
+            var meshHighlight = this._meshes[sourceMesh.id];
             if (meshHighlight) {
-                mesh.onBeforeRenderObservable.remove(meshHighlight.observerHighlight);
-                mesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);
+                sourceMesh.onBeforeRenderObservable.remove(meshHighlight.observerHighlight);
+                sourceMesh.onAfterRenderObservable.remove(meshHighlight.observerDefault);
             }
 
-            this._meshes[mesh.id] = undefined;
+            this._meshes[sourceMesh.id] = undefined;
 
             this._shouldRender = false;
             for (var meshHighlightToCheck in this._meshes) {