Bläddra i källkod

Improving frustum computation

David catuhe 10 år sedan
förälder
incheckning
cfa678fdbc

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1317 - 1316
dist/preview release - alpha/babylon.2.2.d.ts


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 20 - 21
dist/preview release - alpha/babylon.2.2.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 34 - 5
dist/preview release - alpha/babylon.2.2.max.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 21 - 22
dist/preview release - alpha/babylon.2.2.noworker.js


+ 32 - 3
src/Culling/babylon.boundingBox.js

@@ -6,6 +6,7 @@ var BABYLON;
             this.maximum = maximum;
             this.vectors = new Array();
             this.vectorsWorld = new Array();
+            this.vectorsWorldAA = new Array();
             // Bounding vectors            
             this.vectors.push(this.minimum.clone());
             this.vectors.push(this.maximum.clone());
@@ -21,12 +22,16 @@ var BABYLON;
             this.vectors[6].x = this.minimum.x;
             this.vectors.push(this.maximum.clone());
             this.vectors[7].y = this.minimum.y;
+            var index;
+            for (index = 0; index < 8; index++) {
+                this.vectorsWorldAA[index] = BABYLON.Vector3.Zero();
+            }
             // OBB
             this.center = this.maximum.add(this.minimum).scale(0.5);
             this.extendSize = this.maximum.subtract(this.minimum).scale(0.5);
             this.directions = [BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero(), BABYLON.Vector3.Zero()];
             // World
-            for (var index = 0; index < this.vectors.length; index++) {
+            for (index = 0; index < this.vectors.length; index++) {
                 this.vectorsWorld[index] = BABYLON.Vector3.Zero();
             }
             this.minimumWorld = BABYLON.Vector3.Zero();
@@ -56,6 +61,30 @@ var BABYLON;
                 if (v.z > this.maximumWorld.z)
                     this.maximumWorld.z = v.z;
             }
+            this.vectorsWorldAA[0].x = this.minimumWorld.x;
+            this.vectorsWorldAA[0].y = this.minimumWorld.y;
+            this.vectorsWorldAA[0].z = this.minimumWorld.z;
+            this.vectorsWorldAA[1].x = this.minimumWorld.x;
+            this.vectorsWorldAA[1].y = this.maximumWorld.y;
+            this.vectorsWorldAA[1].z = this.minimumWorld.z;
+            this.vectorsWorldAA[2].x = this.maximumWorld.x;
+            this.vectorsWorldAA[2].y = this.minimumWorld.y;
+            this.vectorsWorldAA[2].z = this.minimumWorld.z;
+            this.vectorsWorldAA[3].x = this.maximumWorld.x;
+            this.vectorsWorldAA[3].y = this.maximumWorld.y;
+            this.vectorsWorldAA[3].z = this.minimumWorld.z;
+            this.vectorsWorldAA[4].x = this.minimumWorld.x;
+            this.vectorsWorldAA[4].y = this.minimumWorld.y;
+            this.vectorsWorldAA[4].z = this.maximumWorld.z;
+            this.vectorsWorldAA[5].x = this.minimumWorld.x;
+            this.vectorsWorldAA[5].y = this.maximumWorld.y;
+            this.vectorsWorldAA[5].z = this.maximumWorld.z;
+            this.vectorsWorldAA[6].x = this.maximumWorld.x;
+            this.vectorsWorldAA[6].y = this.minimumWorld.y;
+            this.vectorsWorldAA[6].z = this.maximumWorld.z;
+            this.vectorsWorldAA[7].x = this.maximumWorld.x;
+            this.vectorsWorldAA[7].y = this.maximumWorld.y;
+            this.vectorsWorldAA[7].z = this.maximumWorld.z;
             // OBB
             this.maximumWorld.addToRef(this.minimumWorld, this.center);
             this.center.scaleInPlace(0.5);
@@ -65,10 +94,10 @@ var BABYLON;
             this._worldMatrix = world;
         };
         BoundingBox.prototype.isInFrustum = function (frustumPlanes) {
-            return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);
+            return BoundingBox.IsInFrustum(this.vectorsWorldAA, frustumPlanes);
         };
         BoundingBox.prototype.isCompletelyInFrustum = function (frustumPlanes) {
-            return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);
+            return BoundingBox.IsCompletelyInFrustum(this.vectorsWorldAA, frustumPlanes);
         };
         BoundingBox.prototype.intersectsPoint = function (point) {
             var delta = -BABYLON.Engine.Epsilon;

+ 42 - 3
src/Culling/babylon.boundingBox.ts

@@ -5,6 +5,7 @@
         public extendSize: Vector3;
         public directions: Vector3[];
         public vectorsWorld: Vector3[] = new Array<Vector3>();
+        public vectorsWorldAA: Vector3[] = new Array<Vector3>();
         public minimumWorld: Vector3;
         public maximumWorld: Vector3;
 
@@ -33,13 +34,18 @@
             this.vectors.push(this.maximum.clone());
             this.vectors[7].y = this.minimum.y;
 
+            var index: number;
+            for (index = 0; index < 8; index++) {
+                this.vectorsWorldAA[index] = Vector3.Zero();
+            }
+
             // OBB
             this.center = this.maximum.add(this.minimum).scale(0.5);
             this.extendSize = this.maximum.subtract(this.minimum).scale(0.5);
             this.directions = [Vector3.Zero(), Vector3.Zero(), Vector3.Zero()];
 
             // World
-            for (var index = 0; index < this.vectors.length; index++) {
+            for (index = 0; index < this.vectors.length; index++) {
                 this.vectorsWorld[index] = Vector3.Zero();
             }
             this.minimumWorld = Vector3.Zero();
@@ -76,6 +82,39 @@
                     this.maximumWorld.z = v.z;
             }
 
+            this.vectorsWorldAA[0].x = this.minimumWorld.x;
+            this.vectorsWorldAA[0].y = this.minimumWorld.y;
+            this.vectorsWorldAA[0].z = this.minimumWorld.z;
+
+            this.vectorsWorldAA[1].x = this.minimumWorld.x;
+            this.vectorsWorldAA[1].y = this.maximumWorld.y;
+            this.vectorsWorldAA[1].z = this.minimumWorld.z;
+
+            this.vectorsWorldAA[2].x = this.maximumWorld.x;
+            this.vectorsWorldAA[2].y = this.minimumWorld.y;
+            this.vectorsWorldAA[2].z = this.minimumWorld.z;
+
+            this.vectorsWorldAA[3].x = this.maximumWorld.x;
+            this.vectorsWorldAA[3].y = this.maximumWorld.y;
+            this.vectorsWorldAA[3].z = this.minimumWorld.z;
+
+
+            this.vectorsWorldAA[4].x = this.minimumWorld.x;
+            this.vectorsWorldAA[4].y = this.minimumWorld.y;
+            this.vectorsWorldAA[4].z = this.maximumWorld.z;
+
+            this.vectorsWorldAA[5].x = this.minimumWorld.x;
+            this.vectorsWorldAA[5].y = this.maximumWorld.y;
+            this.vectorsWorldAA[5].z = this.maximumWorld.z;
+
+            this.vectorsWorldAA[6].x = this.maximumWorld.x;
+            this.vectorsWorldAA[6].y = this.minimumWorld.y;
+            this.vectorsWorldAA[6].z = this.maximumWorld.z;
+
+            this.vectorsWorldAA[7].x = this.maximumWorld.x;
+            this.vectorsWorldAA[7].y = this.maximumWorld.y;
+            this.vectorsWorldAA[7].z = this.maximumWorld.z;
+
             // OBB
             this.maximumWorld.addToRef(this.minimumWorld, this.center);
             this.center.scaleInPlace(0.5);
@@ -88,11 +127,11 @@
         }
 
         public isInFrustum(frustumPlanes: Plane[]): boolean {
-            return BoundingBox.IsInFrustum(this.vectorsWorld, frustumPlanes);
+            return BoundingBox.IsInFrustum(this.vectorsWorldAA, frustumPlanes);
         }
 
         public isCompletelyInFrustum(frustumPlanes: Plane[]): boolean {
-            return BoundingBox.IsCompletelyInFrustum(this.vectorsWorld, frustumPlanes);
+            return BoundingBox.IsCompletelyInFrustum(this.vectorsWorldAA, frustumPlanes);
         }
 
         public intersectsPoint(point: Vector3): boolean {

+ 1 - 1
src/Math/babylon.math.js

@@ -2363,7 +2363,7 @@ var BABYLON;
             // Near
             frustumPlanes[0].normal.x = transform.m[3] + transform.m[2];
             frustumPlanes[0].normal.y = transform.m[7] + transform.m[6];
-            frustumPlanes[0].normal.z = transform.m[10] + transform.m[10];
+            frustumPlanes[0].normal.z = transform.m[11] + transform.m[10];
             frustumPlanes[0].d = transform.m[15] + transform.m[14];
             frustumPlanes[0].normalize();
             // Far

+ 1 - 1
src/Math/babylon.math.ts

@@ -2969,7 +2969,7 @@
             // Near
             frustumPlanes[0].normal.x = transform.m[3] + transform.m[2];
             frustumPlanes[0].normal.y = transform.m[7] + transform.m[6];
-            frustumPlanes[0].normal.z = transform.m[10] + transform.m[10];
+            frustumPlanes[0].normal.z = transform.m[11] + transform.m[10];
             frustumPlanes[0].d = transform.m[15] + transform.m[14];
             frustumPlanes[0].normalize();