فهرست منبع

Added method updateCoordinateHeights()

jbousquie 9 سال پیش
والد
کامیت
b29645d6a7
1فایلهای تغییر یافته به همراه44 افزوده شده و 18 حذف شده
  1. 44 18
      src/Mesh/babylon.groundMesh.ts

+ 44 - 18
src/Mesh/babylon.groundMesh.ts

@@ -1,4 +1,4 @@
-module BABYLON {
+module BABYLON {
     export class GroundMesh extends Mesh {
         public generateOctree = false;
 
@@ -42,6 +42,7 @@
                 return this.position.y;
             }
             if (!this._heightQuads || this._heightQuads.length == 0) {
+                this._initHeightQuads();
                 this._computeHeightQuads();
             }
             var facet = this._getFacetAt(x, z);
@@ -78,6 +79,7 @@
                 return;
             }
             if (!this._heightQuads || this._heightQuads.length == 0) {
+                this._initHeightQuads();
                 this._computeHeightQuads();
             }
             var facet = this._getFacetAt(x, z);
@@ -86,6 +88,18 @@
             ref.z = facet.z;
         }
 
+        /**
+        * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()
+        * if the ground has been updated.
+        * This can be used in the render loop
+        */
+        public updateCoordinateHeights(): void {
+            if (!this._heightQuads || this._heightQuads.length == 0) {
+                this._initHeightQuads();
+            }
+            this._computeHeightQuads();
+        }
+
         // Returns the element "facet" from the heightQuads array relative to (x, z) local coordinates
         private _getFacetAt(x: number, z: number): Vector4 {
             // retrieve col and row from x, z coordinates in the ground local system
@@ -101,23 +115,36 @@
             return facet;
         }
 
-        // Populates the heightMap array with "facet" elements :
+        //  Creates and populates the heightMap array with "facet" elements :
         // a quad is two triangular facets separated by a slope, so a "facet" element is 1 slope + 2 facets
         // slope : Vector2(c, h) = 2D diagonal line equation setting appart two triangular facets in a quad : z = cx + h
         // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0
         // facet2 :  Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0
-        private _computeHeightQuads(): void {
+        private _initHeightQuads(): void {
             this._heightQuads = new Array();
+            for (var row = 0; row < this._subdivisions; row++) {
+                for (var col = 0; col < this._subdivisions; col++) {
+                    var quad = { slope: BABYLON.Vector2.Zero(), facet1: new BABYLON.Vector4(0, 0, 0,0), facet2: new BABYLON.Vector4(0, 0, 0,0) };
+                    this._heightQuads[row * this._subdivisions + col] = quad;
+                }
+            }
+        }
+
+        // Compute each quad element values and update the the heightMap array :
+        // slope : Vector2(c, h) = 2D diagonal line equation setting appart two triangular facets in a quad : z = cx + h
+        // facet1 : Vector4(a, b, c, d) = first facet 3D plane equation : ax + by + cz + d = 0
+        // facet2 :  Vector4(a, b, c, d) = second facet 3D plane equation : ax + by + cz + d = 0
+        private _computeHeightQuads(): void {
             var positions = this.getVerticesData(VertexBuffer.PositionKind);
-            var v1 = Vector3.Zero();
-            var v2 = Vector3.Zero();
-            var v3 = Vector3.Zero();
-            var v4 = Vector3.Zero();
-            var v1v2 = Vector3.Zero();
-            var v1v3 = Vector3.Zero();
-            var v1v4 = Vector3.Zero();
-            var norm1 = Vector3.Zero();
-            var norm2 = Vector3.Zero();
+            var v1 = Tmp.Vector3[0];
+            var v2 = Tmp.Vector3[1];
+            var v3 = Tmp.Vector3[2];
+            var v4 = Tmp.Vector3[3];
+            var v1v2 = Tmp.Vector3[4];
+            var v1v3 = Tmp.Vector3[5];
+            var v1v4 = Tmp.Vector3[6];
+            var norm1 = Tmp.Vector3[7];
+            var norm2 = Tmp.Vector3[8];
             var i = 0;
             var j = 0;
             var k = 0;
@@ -147,7 +174,6 @@
                     // 2D slope V1V4
                     cd = (v4.z - v1.z) / (v4.x - v1.x);
                     h = v1.z - cd * v1.x;             // v1 belongs to the slope
-                    var slope = new Vector2(cd, h);
 
                     // facet equations :
                     // we compute each facet normal vector
@@ -163,14 +189,14 @@
                     norm2.normalize();
                     d1 = -(norm1.x * v1.x + norm1.y * v1.y + norm1.z * v1.z);
                     d2 = -(norm2.x * v2.x + norm2.y * v2.y + norm2.z * v2.z);
-                    var facet1 = new BABYLON.Vector4(norm1.x, norm1.y, norm1.z, d1);
-                    var facet2 = new BABYLON.Vector4(norm2.x, norm2.y, norm2.z, d2);
 
-                    var quad = { slope: slope, facet1: facet1, facet2: facet2 };
-                    this._heightQuads.push(quad);
+                    var quad = this._heightQuads[row * this._subdivisions + col];
+                    quad.slope.copyFromFloats(cd, h);
+                    quad.facet1.copyFromFloats(norm1.x, norm1.y, norm1.z, d1);
+                    quad.facet2.copyFromFloats(norm2.x, norm2.y, norm2.z, d2);
+                    this._heightQuads[row * this._subdivisions + col] = quad;
                 }
             }
         }
     }
 }
-