|
@@ -0,0 +1,175 @@
|
|
|
+/**
|
|
|
+ * @author spite / http://www.clicktorelease.com/
|
|
|
+ * @author mrdoob / http://mrdoob.com/
|
|
|
+ */
|
|
|
+
|
|
|
+THREE.BufferGeometryUtils = {
|
|
|
+
|
|
|
+ fromGeometry: function geometryToBufferGeometry( geometry ) {
|
|
|
+
|
|
|
+ var vertices = geometry.vertices;
|
|
|
+ var faces = geometry.faces;
|
|
|
+ var faceVertexUvs = geometry.faceVertexUvs;
|
|
|
+ var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0;
|
|
|
+
|
|
|
+ var triangles = 0;
|
|
|
+
|
|
|
+ for ( var i = 0; i < faces.length; i ++ ) {
|
|
|
+
|
|
|
+ triangles += faces[ i ] instanceof THREE.Face3 ? 1 : 2;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log( faces.length, triangles );
|
|
|
+
|
|
|
+ var bufferGeometry = new THREE.BufferGeometry();
|
|
|
+
|
|
|
+ bufferGeometry.attributes = {
|
|
|
+
|
|
|
+ position: {
|
|
|
+ itemSize: 3,
|
|
|
+ array: new Float32Array( triangles * 3 * 3 )
|
|
|
+ },
|
|
|
+ normal: {
|
|
|
+ itemSize: 3,
|
|
|
+ array: new Float32Array( triangles * 3 * 3 )
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ color: {
|
|
|
+ itemSize: 3,
|
|
|
+ array: new Float32Array( triangles * 3 * 3 )
|
|
|
+ }*/
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( hasFaceVertexUv === true ) {
|
|
|
+
|
|
|
+ bufferGeometry.attributes.uv = {
|
|
|
+ itemSize: 2,
|
|
|
+ array: new Float32Array( triangles * 3 * 2 )
|
|
|
+ };
|
|
|
+
|
|
|
+ var uvs = bufferGeometry.attributes.uv.array;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var positions = bufferGeometry.attributes.position.array;
|
|
|
+ var normals = bufferGeometry.attributes.normal.array;
|
|
|
+ // var colors = bufferGeometry.attributes.color.array;
|
|
|
+
|
|
|
+ var i2 = 0, i3 = 0;
|
|
|
+
|
|
|
+ for ( var i = 0; i < faces.length; i ++ ) {
|
|
|
+
|
|
|
+ var face = faces[ i ];
|
|
|
+
|
|
|
+ var a = vertices[ face.a ];
|
|
|
+ var b = vertices[ face.b ];
|
|
|
+ var c = vertices[ face.c ];
|
|
|
+
|
|
|
+ positions[ i3 ] = a.x;
|
|
|
+ positions[ i3 + 1 ] = a.y;
|
|
|
+ positions[ i3 + 2 ] = a.z;
|
|
|
+
|
|
|
+ positions[ i3 + 3 ] = b.x;
|
|
|
+ positions[ i3 + 4 ] = b.y;
|
|
|
+ positions[ i3 + 5 ] = b.z;
|
|
|
+
|
|
|
+ positions[ i3 + 6 ] = c.x;
|
|
|
+ positions[ i3 + 7 ] = c.y;
|
|
|
+ positions[ i3 + 8 ] = c.z;
|
|
|
+
|
|
|
+ var na = face.vertexNormals[ 0 ];
|
|
|
+ var nb = face.vertexNormals[ 1 ];
|
|
|
+ var nc = face.vertexNormals[ 2 ];
|
|
|
+
|
|
|
+ normals[ i3 ] = na.x;
|
|
|
+ normals[ i3 + 1 ] = na.y;
|
|
|
+ normals[ i3 + 2 ] = na.z;
|
|
|
+
|
|
|
+ normals[ i3 + 3 ] = nb.x;
|
|
|
+ normals[ i3 + 4 ] = nb.y;
|
|
|
+ normals[ i3 + 5 ] = nb.z;
|
|
|
+
|
|
|
+ normals[ i3 + 6 ] = nc.x;
|
|
|
+ normals[ i3 + 7 ] = nc.y;
|
|
|
+ normals[ i3 + 8 ] = nc.z;
|
|
|
+
|
|
|
+ if ( hasFaceVertexUv === true ) {
|
|
|
+
|
|
|
+ var uva = faceVertexUvs[ 0 ][ i ][ 0 ];
|
|
|
+ var uvb = faceVertexUvs[ 0 ][ i ][ 1 ];
|
|
|
+ var uvc = faceVertexUvs[ 0 ][ i ][ 2 ];
|
|
|
+
|
|
|
+ uvs[ i2 ] = uva.x;
|
|
|
+ uvs[ i2 + 1 ] = uva.y;
|
|
|
+
|
|
|
+ uvs[ i2 + 2 ] = uvb.x;
|
|
|
+ uvs[ i2 + 3 ] = uvb.y;
|
|
|
+
|
|
|
+ uvs[ i2 + 4 ] = uvc.x;
|
|
|
+ uvs[ i2 + 5 ] = uvc.y;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ i3 += 9;
|
|
|
+ i2 += 6;
|
|
|
+
|
|
|
+ if ( face instanceof THREE.Face4 ) {
|
|
|
+
|
|
|
+ var d = vertices[ face.d ];
|
|
|
+ var nd = face.vertexNormals[ 3 ];
|
|
|
+
|
|
|
+ positions[ i3 ] = a.x;
|
|
|
+ positions[ i3 + 1 ] = a.y;
|
|
|
+ positions[ i3 + 2 ] = a.z;
|
|
|
+
|
|
|
+ positions[ i3 + 3 ] = c.x;
|
|
|
+ positions[ i3 + 4 ] = c.y;
|
|
|
+ positions[ i3 + 5 ] = c.z;
|
|
|
+
|
|
|
+ positions[ i3 + 6 ] = d.x;
|
|
|
+ positions[ i3 + 7 ] = d.y;
|
|
|
+ positions[ i3 + 8 ] = d.z;
|
|
|
+
|
|
|
+ normals[ i3 ] = na.x;
|
|
|
+ normals[ i3 + 1 ] = na.y;
|
|
|
+ normals[ i3 + 2 ] = na.z;
|
|
|
+
|
|
|
+ normals[ i3 + 3 ] = nc.x;
|
|
|
+ normals[ i3 + 4 ] = nc.y;
|
|
|
+ normals[ i3 + 5 ] = nc.z;
|
|
|
+
|
|
|
+ normals[ i3 + 6 ] = nd.x;
|
|
|
+ normals[ i3 + 7 ] = nd.y;
|
|
|
+ normals[ i3 + 8 ] = nd.z;
|
|
|
+
|
|
|
+ if ( hasFaceVertexUv === true ) {
|
|
|
+
|
|
|
+ var uvd = faceVertexUvs[ 0 ][ i ][ 3 ];
|
|
|
+
|
|
|
+ uvs[ i2 ] = uva.x;
|
|
|
+ uvs[ i2 + 1 ] = uva.y;
|
|
|
+
|
|
|
+ uvs[ i2 + 2 ] = uvc.x;
|
|
|
+ uvs[ i2 + 3 ] = uvc.y;
|
|
|
+
|
|
|
+ uvs[ i2 + 4 ] = uvd.x;
|
|
|
+ uvs[ i2 + 5 ] = uvd.y;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ i3 += 9;
|
|
|
+ i2 += 6;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ bufferGeometry.computeBoundingSphere();
|
|
|
+
|
|
|
+ return bufferGeometry;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|