Przeglądaj źródła

Minimizing collider dependencies

In order to minimize the amount of files needed at the worker scope, the
collider had to lose dependencies with the submesh class.
The needed changes were made on all classes using the collider.
The worker not requires the Math file , Collider and
ColliderCoordinator.
Raanan Weber 10 lat temu
rodzic
commit
8f84597465

+ 10 - 11
Babylon/Collisions/babylon.collider.js

@@ -96,18 +96,18 @@ var BABYLON;
                 return false;
                 return false;
             return true;
             return true;
         };
         };
-        Collider.prototype._testTriangle = function (faceIndex, subMesh, p1, p2, p3) {
+        Collider.prototype._testTriangle = function (faceIndex, trianglePlaneArray, p1, p2, p3, hasMaterial) {
             var t0;
             var t0;
             var embeddedInPlane = false;
             var embeddedInPlane = false;
-            if (!subMesh._trianglePlanes) {
-                subMesh._trianglePlanes = [];
+            if (!trianglePlaneArray) {
+                trianglePlaneArray = [];
             }
             }
-            if (!subMesh._trianglePlanes[faceIndex]) {
-                subMesh._trianglePlanes[faceIndex] = new BABYLON.Plane(0, 0, 0, 0);
-                subMesh._trianglePlanes[faceIndex].copyFromPoints(p1, p2, p3);
+            if (!trianglePlaneArray[faceIndex]) {
+                trianglePlaneArray[faceIndex] = new BABYLON.Plane(0, 0, 0, 0);
+                trianglePlaneArray[faceIndex].copyFromPoints(p1, p2, p3);
             }
             }
-            var trianglePlane = subMesh._trianglePlanes[faceIndex];
-            if ((!subMesh.getMaterial()) && !trianglePlane.isFrontFacingTo(this.normalizedVelocity, 0))
+            var trianglePlane = trianglePlaneArray[faceIndex];
+            if ((!hasMaterial) && !trianglePlane.isFrontFacingTo(this.normalizedVelocity, 0))
                 return;
                 return;
             var signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this.basePoint);
             var signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this.basePoint);
             var normalDotVelocity = BABYLON.Vector3.Dot(trianglePlane.normal, this.velocity);
             var normalDotVelocity = BABYLON.Vector3.Dot(trianglePlane.normal, this.velocity);
@@ -241,16 +241,15 @@ var BABYLON;
                     }
                     }
                     this.nearestDistance = distToCollision;
                     this.nearestDistance = distToCollision;
                     this.collisionFound = true;
                     this.collisionFound = true;
-                    this.collidedMesh = subMesh.getMesh();
                 }
                 }
             }
             }
         };
         };
-        Collider.prototype._collide = function (subMesh, pts, indices, indexStart, indexEnd, decal) {
+        Collider.prototype._collide = function (trianglePlaneArray, pts, indices, indexStart, indexEnd, decal, hasMaterial) {
             for (var i = indexStart; i < indexEnd; i += 3) {
             for (var i = indexStart; i < indexEnd; i += 3) {
                 var p1 = pts[indices[i] - decal];
                 var p1 = pts[indices[i] - decal];
                 var p2 = pts[indices[i + 1] - decal];
                 var p2 = pts[indices[i + 1] - decal];
                 var p3 = pts[indices[i + 2] - decal];
                 var p3 = pts[indices[i + 2] - decal];
-                this._testTriangle(i, subMesh, p3, p2, p1);
+                this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial);
             }
             }
         };
         };
         Collider.prototype._getResponse = function (pos, vel) {
         Collider.prototype._getResponse = function (pos, vel) {

+ 11 - 12
Babylon/Collisions/babylon.collider.ts

@@ -68,7 +68,7 @@
         public initialPosition: Vector3;
         public initialPosition: Vector3;
         public nearestDistance: number;
         public nearestDistance: number;
         public intersectionPoint: Vector3;
         public intersectionPoint: Vector3;
-        public collidedMesh: AbstractMesh
+        public collidedMesh: AbstractMesh;
 
 
         private _collisionPoint = BABYLON.Vector3.Zero();
         private _collisionPoint = BABYLON.Vector3.Zero();
         private _planeIntersectionPoint = BABYLON.Vector3.Zero();
         private _planeIntersectionPoint = BABYLON.Vector3.Zero();
@@ -132,22 +132,22 @@
             return true;
             return true;
         }
         }
 
 
-        public _testTriangle(faceIndex: number, subMesh: SubMesh, p1: Vector3, p2: Vector3, p3: Vector3): void {
+        public _testTriangle(faceIndex: number, trianglePlaneArray: Array<Plane>, p1: Vector3, p2: Vector3, p3: Vector3, hasMaterial: boolean): void {
             var t0;
             var t0;
             var embeddedInPlane = false;
             var embeddedInPlane = false;
 
 
-            if (!subMesh._trianglePlanes) {
-                subMesh._trianglePlanes = [];
+            if (!trianglePlaneArray) {
+                trianglePlaneArray = [];
             }
             }
 
 
-            if (!subMesh._trianglePlanes[faceIndex]) {
-                subMesh._trianglePlanes[faceIndex] = new BABYLON.Plane(0, 0, 0, 0);
-                subMesh._trianglePlanes[faceIndex].copyFromPoints(p1, p2, p3);
+            if (!trianglePlaneArray[faceIndex]) {
+                trianglePlaneArray[faceIndex] = new BABYLON.Plane(0, 0, 0, 0);
+                trianglePlaneArray[faceIndex].copyFromPoints(p1, p2, p3);
             }
             }
 
 
-            var trianglePlane = subMesh._trianglePlanes[faceIndex];
+            var trianglePlane = trianglePlaneArray[faceIndex];
 
 
-            if ((!subMesh.getMaterial()) && !trianglePlane.isFrontFacingTo(this.normalizedVelocity, 0))
+            if ((!hasMaterial) && !trianglePlane.isFrontFacingTo(this.normalizedVelocity, 0))
                 return;
                 return;
 
 
             var signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this.basePoint);
             var signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this.basePoint);
@@ -310,18 +310,17 @@
                     }
                     }
                     this.nearestDistance = distToCollision;
                     this.nearestDistance = distToCollision;
                     this.collisionFound = true;
                     this.collisionFound = true;
-                    this.collidedMesh = subMesh.getMesh();
                 }
                 }
             }
             }
         }
         }
 
 
-        public _collide(subMesh, pts: Vector3[], indices: number[], indexStart: number, indexEnd: number, decal: number): void {
+        public _collide(trianglePlaneArray: Array<Plane>, pts: Vector3[], indices: number[], indexStart: number, indexEnd: number, decal: number, hasMaterial: boolean): void {
             for (var i = indexStart; i < indexEnd; i += 3) {
             for (var i = indexStart; i < indexEnd; i += 3) {
                 var p1 = pts[indices[i] - decal];
                 var p1 = pts[indices[i] - decal];
                 var p2 = pts[indices[i + 1] - decal];
                 var p2 = pts[indices[i + 1] - decal];
                 var p3 = pts[indices[i + 2] - decal];
                 var p3 = pts[indices[i + 2] - decal];
 
 
-                this._testTriangle(i, subMesh, p3, p2, p1);
+                this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial);
             }
             }
         }
         }
 
 

+ 2 - 1
Babylon/Collisions/babylon.collisionCoordinator.js

@@ -127,7 +127,8 @@ var BABYLON;
                         verticesStart: sm.verticesStart,
                         verticesStart: sm.verticesStart,
                         verticesCount: sm.verticesCount,
                         verticesCount: sm.verticesCount,
                         indexStart: sm.indexStart,
                         indexStart: sm.indexStart,
-                        indexCount: sm.indexCount
+                        indexCount: sm.indexCount,
+                        hasMaterial: !!sm.getMaterial()
                     };
                     };
                 });
                 });
             }
             }

+ 4 - 2
Babylon/Collisions/babylon.collisionCoordinator.ts

@@ -34,6 +34,7 @@ module BABYLON {
         verticesCount: number;
         verticesCount: number;
         indexStart: number;
         indexStart: number;
         indexCount: number;
         indexCount: number;
+        hasMaterial: boolean;
     }
     }
 
 
     export interface SerializedGeometry {
     export interface SerializedGeometry {
@@ -128,7 +129,7 @@ module BABYLON {
         }
         }
 
 
         public static SerializeMesh = function (mesh: BABYLON.AbstractMesh): SerializedMesh {
         public static SerializeMesh = function (mesh: BABYLON.AbstractMesh): SerializedMesh {
-            var submeshes = [];
+            var submeshes : Array<SerializedSubMesh> = [];
             if (mesh.subMeshes) {
             if (mesh.subMeshes) {
                 submeshes = mesh.subMeshes.map(function (sm, idx) {
                 submeshes = mesh.subMeshes.map(function (sm, idx) {
                     return {
                     return {
@@ -136,7 +137,8 @@ module BABYLON {
                         verticesStart: sm.verticesStart,
                         verticesStart: sm.verticesStart,
                         verticesCount: sm.verticesCount,
                         verticesCount: sm.verticesCount,
                         indexStart: sm.indexStart,
                         indexStart: sm.indexStart,
-                        indexCount: sm.indexCount
+                        indexCount: sm.indexCount,
+                        hasMaterial: !!sm.getMaterial()
                     }
                     }
                 });
                 });
             }
             }

+ 1 - 4
Babylon/Collisions/babylon.collisionWorker.js

@@ -126,12 +126,9 @@ var BABYLON;
                 for (var i = start; i < end; i++) {
                 for (var i = start; i < end; i++) {
                     subMesh['_lastColliderWorldVertices'].push(BABYLON.Vector3.TransformCoordinates(positionsArray[i], transformMatrix));
                     subMesh['_lastColliderWorldVertices'].push(BABYLON.Vector3.TransformCoordinates(positionsArray[i], transformMatrix));
                 }
                 }
-                subMesh['getMaterial'] = function () {
-                    return true;
-                };
                 //}
                 //}
                 // Collide
                 // Collide
-                this.collider._collide(subMesh, subMesh['_lastColliderWorldVertices'], meshGeometry.indices, subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart);
+                this.collider._collide([], subMesh['_lastColliderWorldVertices'], meshGeometry.indices, subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart, subMesh.hasMaterial);
             };
             };
             //TODO - this! :-)
             //TODO - this! :-)
             CollideWorker.prototype.checkSubmeshCollision = function (subMesh) {
             CollideWorker.prototype.checkSubmeshCollision = function (subMesh) {

+ 1 - 4
Babylon/Collisions/babylon.collisionWorker.ts

@@ -149,13 +149,10 @@ module BABYLON.CollisionWorker {
             for (var i = start; i < end; i++) {
             for (var i = start; i < end; i++) {
                 subMesh['_lastColliderWorldVertices'].push(BABYLON.Vector3.TransformCoordinates(positionsArray[i], transformMatrix));
                 subMesh['_lastColliderWorldVertices'].push(BABYLON.Vector3.TransformCoordinates(positionsArray[i], transformMatrix));
             }
             }
-            subMesh['getMaterial'] = function () {
-                return true;
-            }
         
         
             //}
             //}
             // Collide
             // Collide
-            this.collider._collide(subMesh, subMesh['_lastColliderWorldVertices'], <any> meshGeometry.indices, subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart);
+            this.collider._collide([], subMesh['_lastColliderWorldVertices'], <any> meshGeometry.indices, subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart, subMesh.hasMaterial);
         }
         }
 
 
         //TODO - this! :-)
         //TODO - this! :-)

+ 4 - 1
Babylon/Mesh/babylon.abstractMesh.js

@@ -644,7 +644,10 @@ var BABYLON;
                 }
                 }
             }
             }
             // Collide
             // Collide
-            collider._collide(subMesh, subMesh._lastColliderWorldVertices, this.getIndices(), subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart);
+            collider._collide(subMesh._trianglePlanes, subMesh._lastColliderWorldVertices, this.getIndices(), subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart, !!subMesh.getMaterial());
+            if (collider.collisionFound) {
+                collider.collidedMesh = this;
+            }
         };
         };
         AbstractMesh.prototype._processCollisionsForSubMeshes = function (collider, transformMatrix) {
         AbstractMesh.prototype._processCollisionsForSubMeshes = function (collider, transformMatrix) {
             var subMeshes;
             var subMeshes;

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

@@ -760,7 +760,10 @@
                 }
                 }
             }
             }
             // Collide
             // Collide
-            collider._collide(subMesh, subMesh._lastColliderWorldVertices, this.getIndices(), subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart);
+            collider._collide(subMesh._trianglePlanes, subMesh._lastColliderWorldVertices, this.getIndices(), subMesh.indexStart, subMesh.indexStart + subMesh.indexCount, subMesh.verticesStart, !!subMesh.getMaterial());
+            if (collider.collisionFound) {
+                collider.collidedMesh = this;
+            }
         }
         }
 
 
         public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): void {
         public _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): void {