diff --git a/src/core/Geometry.js b/src/core/Geometry.js index 1beb186e82c8e69a30d3e5959605345259683953..a6c38b96c57806fc5619dcb7c9007ec2c005b487 100644 --- a/src/core/Geometry.js +++ b/src/core/Geometry.js @@ -95,6 +95,92 @@ THREE.Geometry.prototype = { }, + fromBufferGeometry: function ( geometry ) { + + var scope = this; + + var attributes = geometry.attributes; + + var indices = attributes.index !== undefined && attributes.index.array; + var normals = attributes.normal !== undefined && attributes.normal.array; + var colors = attributes.color !== undefined && attributes.color.array; + var uvs = attributes.uv !== undefined && attributes.uv.array; + + var vertices = attributes.position.array; + + var tempNormals = []; + var tempUVs = []; + + for ( var i = 0, j = 0; i < vertices.length; i += 3, j += 2 ) { + + scope.vertices.push( new THREE.Vector3( vertices[ i ], vertices[ i + 1 ], vertices[ i + 2 ] ) ); + + if ( normals !== undefined ) { + + tempNormals.push( new THREE.Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); + + } + + if ( colors !== undefined ) { + + scope.colors.push( new THREE.Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); + + } + + if ( uvs !== undefined ) { + + tempUVs.push( new THREE.Vector2( uvs[ j ], uvs[ j + 1 ] ) ); + + } + + } + + var addFace = function ( a, b, c ) { + + var vertexNormals = normals !== undefined ? [ tempNormals[ a ], tempNormals[ b ], tempNormals[ c ] ] : []; + var vertexColors = colors !== undefined ? [ scope.colors[ a ], scope.colors[ b ], scope.colors[ c ] ] : []; + + scope.faces.push( new THREE.Face3( a, b, c, vertexNormals, vertexColors ) ); + scope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ], tempUVs[ b ], tempUVs[ c ] ] ); + + }; + + if ( indices !== undefined ) { + + var indices = attributes.index.array; + + for ( var i = 0; i < indices.length; i += 3 ) { + + addFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] ); + + } + + } else { + + for ( var i = 0; i < vertices.length / 3; i += 3 ) { + + addFace( i, i + 1, i + 2 ); + + } + + } + + if ( geometry.boundingBox !== null ) { + + this.boundingBox = geometry.boundingBox.clone(); + + } + + if ( geometry.boundingSphere !== null ) { + + this.boundingSphere = geometry.boundingSphere.clone(); + + } + + return this; + + }, + center: function () { this.computeBoundingBox();