GeometryUtils.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author alteredq / http://alteredqualia.com/
  4. */
  5. THREE.GeometryUtils = {
  6. merge: function ( geometry1, object2 /* mesh | geometry */ ) {
  7. var isMesh = object2 instanceof THREE.Mesh,
  8. vertexOffset = geometry1.vertices.length,
  9. uvPosition = geometry1.faceVertexUvs[ 0 ].length,
  10. geometry2 = isMesh ? object2.geometry : object2,
  11. vertices1 = geometry1.vertices,
  12. vertices2 = geometry2.vertices,
  13. faces1 = geometry1.faces,
  14. faces2 = geometry2.faces,
  15. uvs1 = geometry1.faceVertexUvs[ 0 ],
  16. uvs2 = geometry2.faceVertexUvs[ 0 ];
  17. isMesh && object2.matrixAutoUpdate && object2.updateMatrix();
  18. // vertices
  19. for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
  20. var vertex = vertices2[ i ];
  21. var vertexCopy = new THREE.Vertex( vertex.position.clone() );
  22. isMesh && object2.matrix.multiplyVector3( vertexCopy.position );
  23. vertices1.push( vertexCopy );
  24. }
  25. // faces
  26. for ( i = 0, il = faces2.length; i < il; i ++ ) {
  27. var face = faces2[ i ], faceCopy, normal, color,
  28. faceVertexNormals = face.vertexNormals,
  29. faceVertexColors = face.vertexColors;
  30. if ( face instanceof THREE.Face3 ) {
  31. faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
  32. } else if ( face instanceof THREE.Face4 ) {
  33. faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset );
  34. }
  35. faceCopy.normal.copy( face.normal );
  36. for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
  37. normal = faceVertexNormals[ j ];
  38. faceCopy.vertexNormals.push( normal.clone() );
  39. }
  40. faceCopy.color.copy( face.color );
  41. for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
  42. color = faceVertexColors[ j ];
  43. faceCopy.vertexColors.push( color.clone() );
  44. }
  45. faceCopy.materials = face.materials.slice();
  46. faceCopy.centroid.copy( face.centroid );
  47. faces1.push( faceCopy );
  48. }
  49. // uvs
  50. for ( i = 0, il = uvs2.length; i < il; i ++ ) {
  51. var uv = uvs2[ i ], uvCopy = [];
  52. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  53. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  54. }
  55. uvs1.push( uvCopy );
  56. }
  57. },
  58. clone: function ( geometry ) {
  59. var cloneGeo = new THREE.Geometry();
  60. var i, il;
  61. var vertices = geometry.vertices,
  62. faces = geometry.faces,
  63. uvs = geometry.faceVertexUvs[ 0 ];
  64. // vertices
  65. for ( i = 0, il = vertices.length; i < il; i ++ ) {
  66. var vertex = vertices[ i ];
  67. var vertexCopy = new THREE.Vertex( vertex.position.clone() );
  68. cloneGeo.vertices.push( vertexCopy );
  69. }
  70. // faces
  71. for ( i = 0, il = faces.length; i < il; i ++ ) {
  72. var face = faces[ i ], faceCopy, normal, color,
  73. faceVertexNormals = face.vertexNormals,
  74. faceVertexColors = face.vertexColors;
  75. if ( face instanceof THREE.Face3 ) {
  76. faceCopy = new THREE.Face3( face.a, face.b, face.c );
  77. } else if ( face instanceof THREE.Face4 ) {
  78. faceCopy = new THREE.Face4( face.a, face.b, face.c, face.d );
  79. }
  80. faceCopy.normal.copy( face.normal );
  81. for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
  82. normal = faceVertexNormals[ j ];
  83. faceCopy.vertexNormals.push( normal.clone() );
  84. }
  85. faceCopy.color.copy( face.color );
  86. for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
  87. color = faceVertexColors[ j ];
  88. faceCopy.vertexColors.push( color.clone() );
  89. }
  90. faceCopy.materials = face.materials.slice();
  91. faceCopy.centroid.copy( face.centroid );
  92. cloneGeo.faces.push( faceCopy );
  93. }
  94. // uvs
  95. for ( i = 0, il = uvs.length; i < il; i ++ ) {
  96. var uv = uvs[ i ], uvCopy = [];
  97. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  98. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  99. }
  100. cloneGeo.faceVertexUvs[ 0 ].push( uvCopy );
  101. }
  102. return cloneGeo;
  103. }
  104. };