浏览代码

Fix LOD+instances

David Catuhe 6 年之前
父节点
当前提交
7398dcb8ba
共有 3 个文件被更改,包括 23 次插入10 次删除
  1. 7 0
      src/Meshes/abstractMesh.ts
  2. 5 1
      src/Meshes/instancedMesh.ts
  3. 11 9
      src/scene.ts

+ 7 - 0
src/Meshes/abstractMesh.ts

@@ -1076,6 +1076,13 @@ export class AbstractMesh extends TransformNode implements IDisposable, ICullabl
         return super._getWorldMatrixDeterminant();
     }
 
+    /**
+     * Gets a boolean indicating if this mesh is an instance or a regular mesh
+     */
+    public get isAnInstance(): boolean {
+        return false;
+    }
+
     // ================================== Point of View Movement =================================
 
     /**

+ 5 - 1
src/Meshes/instancedMesh.ts

@@ -307,6 +307,10 @@ export class InstancedMesh extends AbstractMesh {
         return super.getWorldMatrix();
     }
 
+    public get isAnInstance(): boolean {
+        return true;
+    }
+
     /**
      * Returns the current associated LOD AbstractMesh.
      */
@@ -320,7 +324,7 @@ export class InstancedMesh extends AbstractMesh {
         this._currentLOD = <Mesh>this.sourceMesh.getLOD(camera, boundingInfo.boundingSphere);
 
         if (this._currentLOD === this.sourceMesh) {
-            return this;
+            return this.sourceMesh;
         }
 
         return this._currentLOD;

+ 11 - 9
src/scene.ts

@@ -3289,14 +3289,14 @@ export class Scene extends AbstractScene implements IAnimatable {
             }
 
             // Switch to current LOD
-            const meshLOD = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera);
-            if (meshLOD === undefined || meshLOD === null) {
+            const meshToRender = this.customLODSelector ? this.customLODSelector(mesh, this.activeCamera) : mesh.getLOD(this.activeCamera);
+            if (meshToRender === undefined || meshToRender === null) {
                 continue;
             }
 
             // Compute world matrix if LOD is billboard
-            if (meshLOD !== mesh && meshLOD.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {
-                meshLOD.computeWorldMatrix();
+            if (meshToRender !== mesh && meshToRender.billboardMode !== TransformNode.BILLBOARDMODE_NONE) {
+                meshToRender.computeWorldMatrix();
             }
 
             mesh._preActivate();
@@ -3305,14 +3305,16 @@ export class Scene extends AbstractScene implements IAnimatable {
                 this._activeMeshes.push(mesh);
                 this.activeCamera._activeMeshes.push(mesh);
 
-                if (meshLOD !== mesh) {
-                    meshLOD._activate(this._renderId);
+                if (meshToRender !== mesh) {
+                    meshToRender._activate(this._renderId);
                 }
-                meshLOD._onlyForInstances = false;
 
                 if (mesh._activate(this._renderId)) {
-                    meshLOD._isActive = true;
-                    this._activeMesh(mesh, meshLOD);
+                    if (!mesh.isAnInstance) {
+                        meshToRender._onlyForInstances = false;
+                    }
+                    meshToRender._isActive = true;
+                    this._activeMesh(mesh, meshToRender);
                 }
             }
         }