|
@@ -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
|
|