Browse Source

Create more efficient BufferGeometry

And, cache midpoint vertices.
Tyler Hallada 5 years ago
parent
commit
ec1a200aaf
1 changed files with 56 additions and 28 deletions
  1. 56 28
      src/index.js

+ 56 - 28
src/index.js

@@ -5,11 +5,15 @@ var OrbitControls = require("three-orbit-controls")(THREE);
5 5
 const scene = new THREE.Scene();
6 6
 var camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000);
7 7
 
8
-var geometry = new THREE.IcosahedronGeometry(10, 2);
8
+console.time("IcosahedronGeometry");
9
+var geometry = new THREE.IcosahedronGeometry(10, 6);
10
+console.log(geometry);
11
+console.timeEnd("IcosahedronGeometry");
9 12
 
13
+console.time("Hexsphere");
10 14
 var vertToFaces = {};
11
-var newVertices = geometry.vertices;
12
-var newFaces = [];
15
+var newVertices = [];
16
+var colors = [];
13 17
 
14 18
 for (var i = 0; i < geometry.faces.length; i += 1) {
15 19
   var face = geometry.faces[i];
@@ -47,10 +51,12 @@ for (var i = 0; i < geometry.faces.length; i += 1) {
47 51
     (vertexA.z + vertexB.z + vertexC.z) / 3,
48 52
   );
49 53
 
50
-  var centroidIndex = newVertices.push(centroid) - 1;
51
-  faceCentroids[i] = centroidIndex;
54
+  // var centroidIndex = (newVertices.push(centroid.x, centroid.y, centroid.z) / 3) - 1;
55
+  faceCentroids[i] = centroid;
52 56
 }
53 57
 
58
+console.time("find dual");
59
+var midVertCache = {};
54 60
 for (var i = 0; i < originalVertCount; i += 1) {
55 61
   var faces = vertToFaces[i];
56 62
   var color = new THREE.Color(Math.random(), Math.random(), Math.random());
@@ -59,41 +65,62 @@ for (var i = 0; i < originalVertCount; i += 1) {
59 65
     var face = geometry.faces[faceIndex];
60 66
     var nonCenterVerts = [face.a, face.b, face.c].filter(vert => vert !== i);
61 67
     var sortedFace = new THREE.Face3(i, nonCenterVerts[0], nonCenterVerts[1]);
68
+    // var sortedFace = face;
62 69
 
63 70
     var vertexA = geometry.vertices[sortedFace.a];
64 71
     var vertexB = geometry.vertices[sortedFace.b];
65 72
     var vertexC = geometry.vertices[sortedFace.c];
66
-    var halfAB = vertexA.clone().lerp(vertexB, 0.5);
67
-    var halfAC = vertexA.clone().lerp(vertexC, 0.5);
68
-    var halfBC = vertexB.clone().lerp(vertexC, 0.5);
69
-
70
-    // TODO: cache these and retrieve in future iteration (use .toFixed(3) in hash)
71
-    var centroidIndex = faceCentroids[faceIndex];
72
-    var halfABIndex = newVertices.push(halfAB) - 1;
73
-    var halfACIndex = newVertices.push(halfAC) - 1;
74
-    var halfBCIndex = newVertices.push(halfBC) - 1;
75
-
76
-    var face1 = new THREE.Face3(sortedFace.a, centroidIndex, halfABIndex);
77
-    face1.color = color;
78
-    var face2 = new THREE.Face3(sortedFace.a, centroidIndex, halfACIndex);
79
-    face2.color = color;
80
-
81
-    newFaces.push(face1, face2);
73
+
74
+    var midABKey = sortedFace.a + "," + sortedFace.b
75
+    var midAB = midVertCache[midABKey];
76
+    if (!midAB) {
77
+      midAB = vertexA.clone().lerp(vertexB, 0.5);
78
+      midVertCache[midABKey] = midAB;
79
+    }
80
+    var midACKey = sortedFace.a + "," + sortedFace.c
81
+    var midAC = midVertCache[midACKey];
82
+    if (!midAC) {
83
+      midAC = vertexA.clone().lerp(vertexC, 0.5);
84
+      midVertCache[midACKey] = midAC;
85
+    }
86
+    var centroid = faceCentroids[faceIndex];
87
+
88
+    newVertices.push(
89
+      vertexA.x, vertexA.y, vertexA.z,
90
+      centroid.x, centroid.y, centroid.z,
91
+      midAB.x, midAB.y, midAB.z,
92
+
93
+      vertexA.x, vertexA.y, vertexA.z,
94
+      centroid.x, centroid.y, centroid.z,
95
+      midAC.x, midAC.y, midAC.z,
96
+    );
97
+
98
+    colors.push(
99
+      color.r, color.g, color.b,
100
+      color.r, color.g, color.b,
101
+      color.r, color.g, color.b,
102
+
103
+      color.r, color.g, color.b,
104
+      color.r, color.g, color.b,
105
+      color.r, color.g, color.b,
106
+    );
82 107
   }
83 108
 }
109
+console.timeEnd("find dual");
84 110
 
85 111
 function disposeArray() {
86 112
   this.array = null;
87 113
 }
88 114
 
89
-var newGeometry = new THREE.Geometry();
90
-newGeometry.vertices = newVertices;
91
-newGeometry.faces = newFaces;
92
-newGeometry.computeFaceNormals();
93
-newGeometry.computeVertexNormals();
94
-newGeometry.normalize();
115
+var newGeometry = new THREE.BufferGeometry();
116
+newGeometry.addAttribute("position", new THREE.Float32BufferAttribute(newVertices, 3));
117
+newGeometry.addAttribute("color", new THREE.Float32BufferAttribute(colors, 3));
118
+// newGeometry.computeFaceNormals();
119
+// newGeometry.computeVertexNormals();
120
+// newGeometry.normalize();
121
+
95 122
 
96
-var material = new THREE.MeshBasicMaterial({ vertexColors: THREE.FaceColors, side: THREE.DoubleSide });
123
+var material = new THREE.MeshBasicMaterial({ vertexColors: THREE.VertexColors, side: THREE.DoubleSide });
97 124
 var sphere = new THREE.Mesh(newGeometry, material);
98 125
 scene.add(sphere);
99 126
 
@@ -105,6 +132,7 @@ controls.update()
105 132
 var renderer = new THREE.WebGLRenderer();
106 133
 renderer.setSize( window.innerWidth, window.innerHeight );
107 134
 document.body.appendChild( renderer.domElement );
135
+console.timeEnd("Hexsphere");
108 136
 
109 137
 window.addEventListener('resize', onWindowResize, false);
110 138