Преглед изворни кода

Merge pull request #1745 from aWeirdo/patch-4

collisionMask, allows filtering of which meshes should collide.
David Catuhe пре 8 година
родитељ
комит
a90c5cb48e

+ 13 - 1
src/Cameras/babylon.freeCamera.ts

@@ -103,6 +103,17 @@
             this.cameraRotation = new Vector2(0, 0);
         }
 
+	 // Collisions
+	private _collisionMask = -1;
+	 
+	public get collisionMask(): number {
+	    return this._collisionMask;
+	}
+	 
+	public set collisionMask(mask: number) {
+	    this._collisionMask = !isNaN(mask) ? mask : -1;
+	}
+	 
         public _collideWithWorld(velocity: Vector3): void {
             var globalPosition: Vector3;
 
@@ -114,7 +125,8 @@
 
             globalPosition.subtractFromFloatsToRef(0, this.ellipsoid.y, 0, this._oldPosition);
             this._collider.radius = this.ellipsoid;
-
+	    this._collider._collisionMask = (!isNaN(this._collisionMask) ? this._collisionMask : -1);
+		
             //no need for clone, as long as gravity is not on.
             var actualVelocity = velocity;
 			

+ 6 - 1
src/Collisions/babylon.collisionCoordinator.ts

@@ -385,12 +385,17 @@ module BABYLON {
                 return;
             }
 
+            // Check if this is a camera else -1
+            collider._collisionMask = (!isNaN(collider._collisionMask) ? collider._collisionMask : -1)
+            // Check if this is a mesh else camera or -1
+            var collisionMask = (excludedMesh ? excludedMesh._collisionMask : collider._collisionMask);
+
             collider._initialize(position, velocity, closeDistance);
 
             // Check all meshes
             for (var index = 0; index < this._scene.meshes.length; index++) {
                 var mesh = this._scene.meshes[index];
-                if (mesh.isEnabled() && mesh.checkCollisions && mesh.subMeshes && mesh !== excludedMesh) {
+                if (mesh.isEnabled() && mesh.checkCollisions && mesh.subMeshes && mesh !== excludedMesh &&  ((collisionMask & mesh._collisionMask) !== 0)) {
                     mesh._checkCollision(collider);
                 }
             }

+ 12 - 1
src/Mesh/babylon.abstractMesh.ts

@@ -166,12 +166,23 @@
 
         // Collisions
         private _checkCollisions = false;
+        private _collisionMask = -1;
         public ellipsoid = new Vector3(0.5, 1, 0.5);
         public ellipsoidOffset = new Vector3(0, 0, 0);
         private _collider = new Collider();
         private _oldPositionForCollisions = new Vector3(0, 0, 0);
         private _diffPositionForCollisions = new Vector3(0, 0, 0);
         private _newPositionForCollisions = new Vector3(0, 0, 0);
+        
+        private _collisionMask = -1;
+        
+        public get collisionMask(): number {
+            return this._collisionMask;
+        }
+        
+        public set collisionMask(mask: number) {
+            this._collisionMask = !isNaN(mask) ? mask : -1;
+        }
 
         // Attach to bone
         private _meshToBoneReferal: AbstractMesh;
@@ -1894,4 +1905,4 @@
         } 
 
     }
-}
+}