123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /**
- * @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;
- }
- };
|