/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ THREE.GeometryUtils = { merge: function ( geometry1, object2 /* mesh | geometry */ ) { var isMesh = object2 instanceof THREE.Mesh, vertexOffset = geometry1.vertices.length, uvPosition = geometry1.faceVertexUvs[ 0 ].length, geometry2 = isMesh ? object2.geometry : object2, vertices1 = geometry1.vertices, vertices2 = geometry2.vertices, faces1 = geometry1.faces, faces2 = geometry2.faces, uvs1 = geometry1.faceVertexUvs[ 0 ], uvs2 = geometry2.faceVertexUvs[ 0 ]; isMesh && object2.matrixAutoUpdate && object2.updateMatrix(); // vertices for ( var i = 0, il = vertices2.length; i < il; i ++ ) { var vertex = vertices2[ i ]; var vertexCopy = new THREE.Vertex( vertex.position.clone() ); isMesh && object2.matrix.multiplyVector3( vertexCopy.position ); vertices1.push( vertexCopy ); } // faces for ( i = 0, il = faces2.length; i < il; i ++ ) { var face = faces2[ i ], faceCopy, normal, color, faceVertexNormals = face.vertexNormals, faceVertexColors = face.vertexColors; if ( face instanceof THREE.Face3 ) { faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset ); } else if ( face instanceof THREE.Face4 ) { faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset ); } faceCopy.normal.copy( face.normal ); for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { normal = faceVertexNormals[ j ]; faceCopy.vertexNormals.push( normal.clone() ); } faceCopy.color.copy( face.color ); for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { color = faceVertexColors[ j ]; faceCopy.vertexColors.push( color.clone() ); } faceCopy.materials = face.materials.slice(); faceCopy.centroid.copy( face.centroid ); faces1.push( faceCopy ); } // uvs for ( i = 0, il = uvs2.length; i < il; i ++ ) { var uv = uvs2[ i ], uvCopy = []; for ( var j = 0, jl = uv.length; j < jl; j ++ ) { uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) ); } uvs1.push( uvCopy ); } }, clone: function ( geometry ) { var cloneGeo = new THREE.Geometry(); var i, il; var vertices = geometry.vertices, faces = geometry.faces, uvs = geometry.faceVertexUvs[ 0 ]; // vertices for ( i = 0, il = vertices.length; i < il; i ++ ) { var vertex = vertices[ i ]; var vertexCopy = new THREE.Vertex( vertex.position.clone() ); cloneGeo.vertices.push( vertexCopy ); } // faces for ( i = 0, il = faces.length; i < il; i ++ ) { var face = faces[ i ], faceCopy, normal, color, faceVertexNormals = face.vertexNormals, faceVertexColors = face.vertexColors; if ( face instanceof THREE.Face3 ) { faceCopy = new THREE.Face3( face.a, face.b, face.c ); } else if ( face instanceof THREE.Face4 ) { faceCopy = new THREE.Face4( face.a, face.b, face.c, face.d ); } faceCopy.normal.copy( face.normal ); for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) { normal = faceVertexNormals[ j ]; faceCopy.vertexNormals.push( normal.clone() ); } faceCopy.color.copy( face.color ); for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) { color = faceVertexColors[ j ]; faceCopy.vertexColors.push( color.clone() ); } faceCopy.materials = face.materials.slice(); faceCopy.centroid.copy( face.centroid ); cloneGeo.faces.push( faceCopy ); } // uvs for ( i = 0, il = uvs.length; i < il; i ++ ) { var uv = uvs[ i ], uvCopy = []; for ( var j = 0, jl = uv.length; j < jl; j ++ ) { uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) ); } cloneGeo.faceVertexUvs[ 0 ].push( uvCopy ); } return cloneGeo; } };