فهرست منبع

Now only with original position

Excluding normal, uvs and color data for better performance.
Raanan Weber 10 سال پیش
والد
کامیت
6aaae1a1eb
2فایلهای تغییر یافته به همراه35 افزوده شده و 112 حذف شده
  1. 17 54
      Babylon/Mesh/babylon.meshSimplification.js
  2. 18 58
      Babylon/Mesh/babylon.meshSimplification.ts

+ 17 - 54
Babylon/Mesh/babylon.meshSimplification.js

@@ -99,9 +99,9 @@ var BABYLON;
     })();
     })();
     BABYLON.DecimationTriangle = DecimationTriangle;
     BABYLON.DecimationTriangle = DecimationTriangle;
     var DecimationVertex = (function () {
     var DecimationVertex = (function () {
-        function DecimationVertex(position, normal, id) {
+        function DecimationVertex(position, originalPosition, id) {
             this.position = position;
             this.position = position;
-            this.normal = normal;
+            this.originalPosition = originalPosition;
             this.id = id;
             this.id = id;
             this.isBorder = true;
             this.isBorder = true;
             this.q = new QuadraticMatrix();
             this.q = new QuadraticMatrix();
@@ -277,11 +277,6 @@ var BABYLON;
                                 if (uniqueArray.length % 2 != 0) {
                                 if (uniqueArray.length % 2 != 0) {
                                     continue;
                                     continue;
                                 }
                                 }
-                                v0.normal = n;
-                                if (v0.uv)
-                                    v0.uv = uv;
-                                else if (v0.color)
-                                    v0.color = color;
                                 v0.q = v1.q.add(v0.q);
                                 v0.q = v1.q.add(v0.q);
                                 v0.updatePosition(p);
                                 v0.updatePosition(p);
                                 var tStart = _this.references.length;
                                 var tStart = _this.references.length;
@@ -333,20 +328,11 @@ var BABYLON;
             this._mesh = mesh;
             this._mesh = mesh;
             //It is assumed that a mesh has positions, normals and either uvs or colors.
             //It is assumed that a mesh has positions, normals and either uvs or colors.
             var positionData = this._mesh.getVerticesData(BABYLON.VertexBuffer.PositionKind);
             var positionData = this._mesh.getVerticesData(BABYLON.VertexBuffer.PositionKind);
-            var normalData = this._mesh.getVerticesData(BABYLON.VertexBuffer.NormalKind);
-            var uvs = this._mesh.getVerticesData(BABYLON.VertexBuffer.UVKind);
-            var colorsData = this._mesh.getVerticesData(BABYLON.VertexBuffer.ColorKind);
             var indices = mesh.getIndices();
             var indices = mesh.getIndices();
             var submesh = mesh.subMeshes[submeshIndex];
             var submesh = mesh.subMeshes[submeshIndex];
             var vertexInit = function (i) {
             var vertexInit = function (i) {
                 var offset = i + submesh.verticesStart;
                 var offset = i + submesh.verticesStart;
-                var vertex = new DecimationVertex(BABYLON.Vector3.FromArray(positionData, offset * 3), BABYLON.Vector3.FromArray(normalData, offset * 3), i);
-                if (_this._mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UVKind)) {
-                    vertex.uv = BABYLON.Vector2.FromArray(uvs, offset * 2);
-                }
-                else if (_this._mesh.isVerticesDataPresent(BABYLON.VertexBuffer.ColorKind)) {
-                    vertex.color = BABYLON.Color4.FromArray(colorsData, offset * 4);
-                }
+                var vertex = new DecimationVertex(BABYLON.Vector3.FromArray(positionData, offset * 3), offset, i);
                 _this.vertices.push(vertex);
                 _this.vertices.push(vertex);
             };
             };
             //var totalVertices = mesh.getTotalVertices();
             //var totalVertices = mesh.getTotalVertices();
@@ -413,9 +399,6 @@ var BABYLON;
                 if (this.vertices[i].triangleCount) {
                 if (this.vertices[i].triangleCount) {
                     this.vertices[i].triangleStart = dst;
                     this.vertices[i].triangleStart = dst;
                     this.vertices[dst].position = this.vertices[i].position;
                     this.vertices[dst].position = this.vertices[i].position;
-                    this.vertices[dst].normal = this.vertices[i].normal;
-                    this.vertices[dst].uv = this.vertices[i].uv;
-                    this.vertices[dst].color = this.vertices[i].color;
                     newVerticesOrder.push(dst);
                     newVerticesOrder.push(dst);
                     dst++;
                     dst++;
                 }
                 }
@@ -431,22 +414,25 @@ var BABYLON;
             var newNormalData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.NormalKind) || [];
             var newNormalData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.NormalKind) || [];
             var newUVsData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.UVKind) || [];
             var newUVsData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.UVKind) || [];
             var newColorsData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.ColorKind) || [];
             var newColorsData = this._reconstructedMesh.getVerticesData(BABYLON.VertexBuffer.ColorKind) || [];
+            var normalData = this._mesh.getVerticesData(BABYLON.VertexBuffer.NormalKind);
+            var uvs = this._mesh.getVerticesData(BABYLON.VertexBuffer.UVKind);
+            var colorsData = this._mesh.getVerticesData(BABYLON.VertexBuffer.ColorKind);
             for (i = 0; i < newVerticesOrder.length; ++i) {
             for (i = 0; i < newVerticesOrder.length; ++i) {
                 newPositionData.push(this.vertices[i].position.x);
                 newPositionData.push(this.vertices[i].position.x);
                 newPositionData.push(this.vertices[i].position.y);
                 newPositionData.push(this.vertices[i].position.y);
                 newPositionData.push(this.vertices[i].position.z);
                 newPositionData.push(this.vertices[i].position.z);
-                newNormalData.push(this.vertices[i].normal.x);
-                newNormalData.push(this.vertices[i].normal.y);
-                newNormalData.push(this.vertices[i].normal.z);
-                if (this.vertices[i].uv) {
-                    newUVsData.push(this.vertices[i].uv.x);
-                    newUVsData.push(this.vertices[i].uv.y);
+                newNormalData.push(normalData[this.vertices[i].originalPosition * 3]);
+                newNormalData.push(normalData[(this.vertices[i].originalPosition * 3) + 1]);
+                newNormalData.push(normalData[(this.vertices[i].originalPosition * 3) + 2]);
+                if (uvs.length) {
+                    newUVsData.push(uvs[(this.vertices[i].originalPosition * 2)]);
+                    newUVsData.push(uvs[(this.vertices[i].originalPosition * 2) + 1]);
                 }
                 }
-                else if (this.vertices[i].color) {
-                    newColorsData.push(this.vertices[i].color.r);
-                    newColorsData.push(this.vertices[i].color.g);
-                    newColorsData.push(this.vertices[i].color.b);
-                    newColorsData.push(this.vertices[i].color.a);
+                else if (colorsData.length) {
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4)]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 1]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 2]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 3]);
                 }
                 }
             }
             }
             var startingIndex = this._reconstructedMesh.getTotalIndices();
             var startingIndex = this._reconstructedMesh.getTotalIndices();
@@ -631,14 +617,6 @@ var BABYLON;
                 pointResult.y = 1 / qDet * (q.det(0, 2, 3, 1, 5, 6, 2, 7, 8));
                 pointResult.y = 1 / qDet * (q.det(0, 2, 3, 1, 5, 6, 2, 7, 8));
                 pointResult.z = -1 / qDet * (q.det(0, 1, 3, 1, 4, 6, 2, 5, 8));
                 pointResult.z = -1 / qDet * (q.det(0, 1, 3, 1, 4, 6, 2, 5, 8));
                 error = this.vertexError(q, pointResult);
                 error = this.vertexError(q, pointResult);
-                //TODO this should be correctly calculated
-                if (normalResult) {
-                    normalResult.copyFrom(vertex1.normal);
-                    if (vertex1.uv)
-                        uvResult.copyFrom(vertex1.uv);
-                    else if (vertex1.color)
-                        colorResult.copyFrom(vertex1.color);
-                }
             }
             }
             else {
             else {
                 var p3 = (vertex1.position.add(vertex2.position)).divide(new BABYLON.Vector3(2, 2, 2));
                 var p3 = (vertex1.position.add(vertex2.position)).divide(new BABYLON.Vector3(2, 2, 2));
@@ -650,31 +628,16 @@ var BABYLON;
                 if (error === error1) {
                 if (error === error1) {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(vertex1.position);
                         pointResult.copyFrom(vertex1.position);
-                        normalResult.copyFrom(vertex1.normal);
-                        if (vertex1.uv)
-                            uvResult.copyFrom(vertex1.uv);
-                        else if (vertex1.color)
-                            colorResult.copyFrom(vertex1.color);
                     }
                     }
                 }
                 }
                 else if (error === error2) {
                 else if (error === error2) {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(vertex2.position);
                         pointResult.copyFrom(vertex2.position);
-                        normalResult.copyFrom(vertex2.normal);
-                        if (vertex2.uv)
-                            uvResult.copyFrom(vertex2.uv);
-                        else if (vertex2.color)
-                            colorResult.copyFrom(vertex2.color);
                     }
                     }
                 }
                 }
                 else {
                 else {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(p3);
                         pointResult.copyFrom(p3);
-                        normalResult.copyFrom(vertex1.normal);
-                        if (vertex1.uv)
-                            uvResult.copyFrom(vertex1.uv);
-                        else if (vertex1.color)
-                            colorResult.copyFrom(vertex1.color);
                     }
                     }
                 }
                 }
             }
             }

+ 18 - 58
Babylon/Mesh/babylon.meshSimplification.ts

@@ -144,15 +144,9 @@
         public triangleStart: number;
         public triangleStart: number;
         public triangleCount: number;
         public triangleCount: number;
 
 
-        public uv: Vector2
-        //if color is present instead of uvs.
-        public color: Color4;
-
         public referenceVertices: Array<DecimationVertex>;
         public referenceVertices: Array<DecimationVertex>;
 
 
-        
-
-        constructor(public position: Vector3, public normal: Vector3, public id) {
+        constructor(public position: Vector3, public originalPosition: number, public id) {
             this.isBorder = true;
             this.isBorder = true;
             this.q = new QuadraticMatrix();
             this.q = new QuadraticMatrix();
             this.triangleCount = 0;
             this.triangleCount = 0;
@@ -358,11 +352,6 @@
                                     continue;
                                     continue;
                                 }
                                 }
 
 
-                                v0.normal = n;
-                                if (v0.uv)
-                                    v0.uv = uv;
-                                else if (v0.color)
-                                    v0.color = color;
                                 v0.q = v1.q.add(v0.q);
                                 v0.q = v1.q.add(v0.q);
 
 
                                 v0.updatePosition(p);
                                 v0.updatePosition(p);
@@ -418,20 +407,13 @@
             this._mesh = mesh;
             this._mesh = mesh;
             //It is assumed that a mesh has positions, normals and either uvs or colors.
             //It is assumed that a mesh has positions, normals and either uvs or colors.
             var positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);
             var positionData = this._mesh.getVerticesData(VertexBuffer.PositionKind);
-            var normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);
-            var uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);
-            var colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);
+            
             var indices = mesh.getIndices();
             var indices = mesh.getIndices();
             var submesh = mesh.subMeshes[submeshIndex];
             var submesh = mesh.subMeshes[submeshIndex];
 
 
             var vertexInit = (i) => {
             var vertexInit = (i) => {
                 var offset = i + submesh.verticesStart;
                 var offset = i + submesh.verticesStart;
-                var vertex = new DecimationVertex(Vector3.FromArray(positionData, offset * 3), Vector3.FromArray(normalData, offset * 3), i);
-                if (this._mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {
-                    vertex.uv = Vector2.FromArray(uvs, offset * 2);
-                } else if (this._mesh.isVerticesDataPresent(VertexBuffer.ColorKind)) {
-                    vertex.color = Color4.FromArray(colorsData, offset * 4);
-                }
+                var vertex = new DecimationVertex(Vector3.FromArray(positionData, offset * 3), offset, i);
                 this.vertices.push(vertex);
                 this.vertices.push(vertex);
             };
             };
             //var totalVertices = mesh.getTotalVertices();
             //var totalVertices = mesh.getTotalVertices();
@@ -504,9 +486,6 @@
                 if (this.vertices[i].triangleCount) {
                 if (this.vertices[i].triangleCount) {
                     this.vertices[i].triangleStart = dst;
                     this.vertices[i].triangleStart = dst;
                     this.vertices[dst].position = this.vertices[i].position;
                     this.vertices[dst].position = this.vertices[i].position;
-                    this.vertices[dst].normal = this.vertices[i].normal;
-                    this.vertices[dst].uv = this.vertices[i].uv;
-                    this.vertices[dst].color = this.vertices[i].color;
                     newVerticesOrder.push(dst);
                     newVerticesOrder.push(dst);
                     dst++;
                     dst++;
                 }
                 }
@@ -525,21 +504,25 @@
             var newUVsData = this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || [];
             var newUVsData = this._reconstructedMesh.getVerticesData(VertexBuffer.UVKind) || [];
             var newColorsData = this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || [];
             var newColorsData = this._reconstructedMesh.getVerticesData(VertexBuffer.ColorKind) || [];
 
 
+            var normalData = this._mesh.getVerticesData(VertexBuffer.NormalKind);
+            var uvs = this._mesh.getVerticesData(VertexBuffer.UVKind);
+            var colorsData = this._mesh.getVerticesData(VertexBuffer.ColorKind);
+
             for (i = 0; i < newVerticesOrder.length; ++i) {
             for (i = 0; i < newVerticesOrder.length; ++i) {
                 newPositionData.push(this.vertices[i].position.x);
                 newPositionData.push(this.vertices[i].position.x);
                 newPositionData.push(this.vertices[i].position.y);
                 newPositionData.push(this.vertices[i].position.y);
                 newPositionData.push(this.vertices[i].position.z);
                 newPositionData.push(this.vertices[i].position.z);
-                newNormalData.push(this.vertices[i].normal.x);
-                newNormalData.push(this.vertices[i].normal.y);
-                newNormalData.push(this.vertices[i].normal.z);
-                if (this.vertices[i].uv) {
-                    newUVsData.push(this.vertices[i].uv.x);
-                    newUVsData.push(this.vertices[i].uv.y);
-                } else if (this.vertices[i].color) {
-                    newColorsData.push(this.vertices[i].color.r);
-                    newColorsData.push(this.vertices[i].color.g);
-                    newColorsData.push(this.vertices[i].color.b);
-                    newColorsData.push(this.vertices[i].color.a);
+                newNormalData.push(normalData[this.vertices[i].originalPosition * 3]);
+                newNormalData.push(normalData[(this.vertices[i].originalPosition * 3) + 1]);
+                newNormalData.push(normalData[(this.vertices[i].originalPosition * 3) + 2]);
+                if (uvs.length) {
+                    newUVsData.push(uvs[(this.vertices[i].originalPosition * 2)]);
+                    newUVsData.push(uvs[(this.vertices[i].originalPosition * 2) + 1]);
+                } else if (colorsData.length) {
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4)]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 1]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 2]);
+                    newColorsData.push(colorsData[(this.vertices[i].originalPosition * 4) + 3]);
                 }
                 }
             }
             }
 
 
@@ -746,14 +729,6 @@
                 pointResult.y = 1 / qDet * (q.det(0, 2, 3, 1, 5, 6, 2, 7, 8));
                 pointResult.y = 1 / qDet * (q.det(0, 2, 3, 1, 5, 6, 2, 7, 8));
                 pointResult.z = -1 / qDet * (q.det(0, 1, 3, 1, 4, 6, 2, 5, 8));
                 pointResult.z = -1 / qDet * (q.det(0, 1, 3, 1, 4, 6, 2, 5, 8));
                 error = this.vertexError(q, pointResult);
                 error = this.vertexError(q, pointResult);
-                //TODO this should be correctly calculated
-                if (normalResult) {
-                    normalResult.copyFrom(vertex1.normal);
-                    if (vertex1.uv)
-                        uvResult.copyFrom(vertex1.uv);
-                    else if (vertex1.color)
-                        colorResult.copyFrom(vertex1.color);
-                }
             } else {
             } else {
                 var p3 = (vertex1.position.add(vertex2.position)).divide(new Vector3(2, 2, 2));
                 var p3 = (vertex1.position.add(vertex2.position)).divide(new Vector3(2, 2, 2));
                 //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();
                 //var norm3 = (vertex1.normal.add(vertex2.normal)).divide(new Vector3(2, 2, 2)).normalize();
@@ -764,29 +739,14 @@
                 if (error === error1) {
                 if (error === error1) {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(vertex1.position);
                         pointResult.copyFrom(vertex1.position);
-                        normalResult.copyFrom(vertex1.normal);
-                        if (vertex1.uv)
-                            uvResult.copyFrom(vertex1.uv);
-                        else if (vertex1.color)
-                            colorResult.copyFrom(vertex1.color);
                     }
                     }
                 } else if (error === error2) {
                 } else if (error === error2) {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(vertex2.position);
                         pointResult.copyFrom(vertex2.position);
-                        normalResult.copyFrom(vertex2.normal);
-                        if (vertex2.uv)
-                            uvResult.copyFrom(vertex2.uv);
-                        else if (vertex2.color)
-                            colorResult.copyFrom(vertex2.color);
                     }
                     }
                 } else {
                 } else {
                     if (pointResult) {
                     if (pointResult) {
                         pointResult.copyFrom(p3);
                         pointResult.copyFrom(p3);
-                        normalResult.copyFrom(vertex1.normal);
-                        if (vertex1.uv)
-                            uvResult.copyFrom(vertex1.uv);
-                        else if (vertex1.color)
-                            colorResult.copyFrom(vertex1.color);
                     }
                     }
                 }
                 }
             }
             }