浏览代码

+ layerMask for meshes and cameras (bitmask for displayed meshes)

Marco Lebdech 11 年之前
父节点
当前提交
a362bf4533

+ 1 - 0
Babylon/Cameras/babylon.camera.ts

@@ -17,6 +17,7 @@
         public mode = Camera.PERSPECTIVE_CAMERA;
         public isIntermediate = false;
         public viewport = new Viewport(0, 0, 1.0, 1.0);
+        public layerMask: number = 0xFFFFFFFF;
         public subCameras = [];
 
         private _computedViewMatrix = BABYLON.Matrix.Identity();

+ 18 - 3
Babylon/Loading/Plugins/babylon.babylonFileLoader.js

@@ -303,7 +303,7 @@ var BABYLON = BABYLON || {};
     var parseCamera = function (parsedCamera, scene) {
         var camera = new BABYLON.FreeCamera(parsedCamera.name, BABYLON.Vector3.FromArray(parsedCamera.position), scene);
         camera.id = parsedCamera.id;
-
+        
         BABYLON.Tags.AddTagsTo(camera, parsedCamera.tags);
 
         // Parent
@@ -349,6 +349,14 @@ var BABYLON = BABYLON || {};
             scene.beginAnimation(camera, parsedCamera.autoAnimateFrom, parsedCamera.autoAnimateTo, parsedCamera.autoAnimateLoop, 1.0);
         }
 
+        
+        // Layer Mask
+        if (parsedCamera.layerMask && (parseInt(parsedCamera.layerMask) != NaN)) {
+          camera.layerMask = Math.abs(parseInt(parsedCamera.layerMask));
+        } else {
+          camera.layerMask = 0xFFFFFFFF;
+        }
+        
         return camera;
     };
 
@@ -496,7 +504,7 @@ var BABYLON = BABYLON || {};
     var parseMesh = function (parsedMesh, scene, rootUrl) {
         var mesh = new BABYLON.Mesh(parsedMesh.name, scene);
         mesh.id = parsedMesh.id;
-
+        
         BABYLON.Tags.AddTagsTo(mesh, parsedMesh.tags);
 
         mesh.position = BABYLON.Vector3.FromArray(parsedMesh.position);
@@ -536,7 +544,7 @@ var BABYLON = BABYLON || {};
         if (parsedMesh.parentId) {
             mesh.parent = scene.getLastEntryByID(parsedMesh.parentId);
         }
-
+        
         // Geometry
         if (parsedMesh.delayLoadingFile) {
             mesh.delayLoadState = BABYLON.Engine.DELAYLOADSTATE_NOTLOADED;
@@ -615,6 +623,13 @@ var BABYLON = BABYLON || {};
             scene.beginAnimation(mesh, parsedMesh.autoAnimateFrom, parsedMesh.autoAnimateTo, parsedMesh.autoAnimateLoop, 1.0);
         }
 
+        // Layer Mask
+        if (parsedMesh.layerMask && (parseInt(parsedMesh.layerMask) != NaN)) {
+          mesh.layerMask = Math.abs(parseInt(parsedMesh.layerMask));
+        } else {
+          mesh.layerMask = 0xFFFFFFFF;
+        }
+
         return mesh;
     };
 

+ 1 - 0
Babylon/Mesh/babylon.abstractMesh.ts

@@ -45,6 +45,7 @@
         public material: Material;
         public receiveShadows = false;
         public actionManager: ActionManager;
+        public layerMask: number = 0xFFFFFFFF;
 
         // Physics
         public _physicImpostor = PhysicsEngine.NoImpostor;

+ 1 - 1
Babylon/babylon.scene.ts

@@ -750,7 +750,7 @@
                     mesh.computeWorldMatrix();
                     mesh._preActivate();
 
-                    if (mesh.isEnabled() && mesh.isVisible && mesh.visibility > 0 && mesh.isInFrustum(this._frustumPlanes)) {
+                    if (mesh.isEnabled() && ((mesh.layerMask & this.activeCamera.layerMask) != 0) && mesh.isVisible && mesh.visibility > 0 && mesh.isInFrustum(this._frustumPlanes)) {
                         this._activeMeshes.push(mesh);
                         mesh._activate(this._renderId);