/** * @author spite / http://www.clicktorelease.com/ * @author mrdoob / http://mrdoob.com/ */ THREE.BufferGeometryUtils = { fromGeometry: function geometryToBufferGeometry( geometry, settings ) { if ( geometry instanceof THREE.BufferGeometry ) { return geometry; } settings = settings || { 'vertexColors': THREE.NoColors }; var vertices = geometry.vertices; var faces = geometry.faces; var faceVertexUvs = geometry.faceVertexUvs; var vertexColors = settings.vertexColors; var hasFaceVertexUv = faceVertexUvs[ 0 ].length > 0; var hasFaceVertexNormals = faces[ 0 ].vertexNormals.length == 3; var bufferGeometry = new THREE.BufferGeometry(); bufferGeometry.attributes = { position: { itemSize: 3, array: new Float32Array( faces.length * 3 * 3 ) }, normal: { itemSize: 3, array: new Float32Array( faces.length * 3 * 3 ) } } var positions = bufferGeometry.attributes.position.array; var normals = bufferGeometry.attributes.normal.array; if ( vertexColors !== THREE.NoColors ) { bufferGeometry.attributes.color = { itemSize: 3, array: new Float32Array( faces.length * 3 * 3 ) }; var colors = bufferGeometry.attributes.color.array; } if ( hasFaceVertexUv === true ) { bufferGeometry.attributes.uv = { itemSize: 2, array: new Float32Array( faces.length * 3 * 2 ) }; var uvs = bufferGeometry.attributes.uv.array; } for ( var i = 0, i2 = 0, i3 = 0; i < faces.length; i ++, i2 += 6, i3 += 9 ) { 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; if ( hasFaceVertexNormals === true ) { 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; } else { var n = face.normal; normals[ i3 ] = n.x; normals[ i3 + 1 ] = n.y; normals[ i3 + 2 ] = n.z; normals[ i3 + 3 ] = n.x; normals[ i3 + 4 ] = n.y; normals[ i3 + 5 ] = n.z; normals[ i3 + 6 ] = n.x; normals[ i3 + 7 ] = n.y; normals[ i3 + 8 ] = n.z; } if ( vertexColors === THREE.FaceColors ) { var fc = face.color; colors[ i3 ] = fc.r; colors[ i3 + 1 ] = fc.g; colors[ i3 + 2 ] = fc.b; colors[ i3 + 3 ] = fc.r; colors[ i3 + 4 ] = fc.g; colors[ i3 + 5 ] = fc.b; colors[ i3 + 6 ] = fc.r; colors[ i3 + 7 ] = fc.g; colors[ i3 + 8 ] = fc.b; } else if ( vertexColors === THREE.VertexColors ) { var vca = face.vertexColors[ 0 ]; var vcb = face.vertexColors[ 1 ]; var vcc = face.vertexColors[ 2 ]; colors[ i3 ] = vca.r; colors[ i3 + 1 ] = vca.g; colors[ i3 + 2 ] = vca.b; colors[ i3 + 3 ] = vcb.r; colors[ i3 + 4 ] = vcb.g; colors[ i3 + 5 ] = vcb.b; colors[ i3 + 6 ] = vcc.r; colors[ i3 + 7 ] = vcc.g; colors[ i3 + 8 ] = vcc.b; } 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; } } bufferGeometry.computeBoundingSphere(); return bufferGeometry; } }