From 18863f61bdf3c4aebd12758ba27b1ce262a247f9 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 22 Jul 2013 19:36:09 +0200 Subject: [PATCH] Added util for converting Geometry to BufferGeometry. Thx @spite. --- examples/js/BufferGeometryUtils.js | 175 +++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 examples/js/BufferGeometryUtils.js diff --git a/examples/js/BufferGeometryUtils.js b/examples/js/BufferGeometryUtils.js new file mode 100644 index 0000000000..2f1b86ff98 --- /dev/null +++ b/examples/js/BufferGeometryUtils.js @@ -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; + + } + +} -- GitLab