2
0

GeometryUtils.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. * @author alteredq / http://alteredqualia.com/
  4. */
  5. THREE.GeometryUtils = {
  6. // Merge two geometries or geometry and geometry from object (using object's transform)
  7. merge: function ( geometry1, object2 /* mesh | geometry */ ) {
  8. var matrix, matrixRotation,
  9. vertexOffset = geometry1.vertices.length,
  10. uvPosition = geometry1.faceVertexUvs[ 0 ].length,
  11. geometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2,
  12. vertices1 = geometry1.vertices,
  13. vertices2 = geometry2.vertices,
  14. faces1 = geometry1.faces,
  15. faces2 = geometry2.faces,
  16. uvs1 = geometry1.faceVertexUvs[ 0 ],
  17. uvs2 = geometry2.faceVertexUvs[ 0 ];
  18. if ( object2 instanceof THREE.Mesh ) {
  19. object2.matrixAutoUpdate && object2.updateMatrix();
  20. matrix = object2.matrix;
  21. matrixRotation = new THREE.Matrix4();
  22. matrixRotation.extractRotation( matrix, object2.scale );
  23. }
  24. // vertices
  25. for ( var i = 0, il = vertices2.length; i < il; i ++ ) {
  26. var vertex = vertices2[ i ];
  27. var vertexCopy = vertex.clone();
  28. if ( matrix ) matrix.multiplyVector3( vertexCopy );
  29. vertices1.push( vertexCopy );
  30. }
  31. // faces
  32. for ( i = 0, il = faces2.length; i < il; i ++ ) {
  33. var face = faces2[ i ], faceCopy, normal, color,
  34. faceVertexNormals = face.vertexNormals,
  35. faceVertexColors = face.vertexColors;
  36. if ( face instanceof THREE.Face3 ) {
  37. faceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );
  38. } else if ( face instanceof THREE.Face4 ) {
  39. faceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset );
  40. }
  41. faceCopy.normal.copy( face.normal );
  42. if ( matrixRotation ) matrixRotation.multiplyVector3( faceCopy.normal );
  43. for ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {
  44. normal = faceVertexNormals[ j ].clone();
  45. if ( matrixRotation ) matrixRotation.multiplyVector3( normal );
  46. faceCopy.vertexNormals.push( normal );
  47. }
  48. faceCopy.color.copy( face.color );
  49. for ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {
  50. color = faceVertexColors[ j ];
  51. faceCopy.vertexColors.push( color.clone() );
  52. }
  53. if ( face.materialIndex !== undefined ) {
  54. faceCopy.materialIndex = face.materialIndex;
  55. }
  56. faceCopy.centroid.copy( face.centroid );
  57. if ( matrix ) matrix.multiplyVector3( faceCopy.centroid );
  58. faces1.push( faceCopy );
  59. }
  60. // uvs
  61. for ( i = 0, il = uvs2.length; i < il; i ++ ) {
  62. var uv = uvs2[ i ], uvCopy = [];
  63. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  64. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  65. }
  66. uvs1.push( uvCopy );
  67. }
  68. },
  69. clone: function ( geometry ) {
  70. var cloneGeo = new THREE.Geometry();
  71. var i, il;
  72. var vertices = geometry.vertices,
  73. faces = geometry.faces,
  74. uvs = geometry.faceVertexUvs[ 0 ];
  75. // vertices
  76. for ( i = 0, il = vertices.length; i < il; i ++ ) {
  77. var vertex = vertices[ i ];
  78. cloneGeo.vertices.push( vertex.clone() );
  79. }
  80. // faces
  81. for ( i = 0, il = faces.length; i < il; i ++ ) {
  82. var face = faces[ i ];
  83. cloneGeo.faces.push( face.clone() );
  84. }
  85. // uvs
  86. for ( i = 0, il = uvs.length; i < il; i ++ ) {
  87. var uv = uvs[ i ], uvCopy = [];
  88. for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
  89. uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
  90. }
  91. cloneGeo.faceVertexUvs[ 0 ].push( uvCopy );
  92. }
  93. return cloneGeo;
  94. },
  95. removeMaterials: function ( geometry, materialIndexArray ) {
  96. var materialIndexMap = {};
  97. for ( var i = 0, il = materialIndexArray.length; i < il; i ++ ) {
  98. materialIndexMap[ materialIndexArray[i] ] = true;
  99. }
  100. var face, newFaces = [];
  101. for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
  102. face = geometry.faces[ i ];
  103. if ( ! ( face.materialIndex in materialIndexMap ) ) newFaces.push( face );
  104. }
  105. geometry.faces = newFaces;
  106. },
  107. // Get random point in triangle (via barycentric coordinates)
  108. // (uniform distribution)
  109. // http://www.cgafaq.info/wiki/Random_Point_In_Triangle
  110. randomPointInTriangle: function ( vectorA, vectorB, vectorC ) {
  111. var a, b, c,
  112. point = new THREE.Vector3(),
  113. tmp = THREE.GeometryUtils.__v1;
  114. a = THREE.GeometryUtils.random();
  115. b = THREE.GeometryUtils.random();
  116. if ( ( a + b ) > 1 ) {
  117. a = 1 - a;
  118. b = 1 - b;
  119. }
  120. c = 1 - a - b;
  121. point.copy( vectorA );
  122. point.multiplyScalar( a );
  123. tmp.copy( vectorB );
  124. tmp.multiplyScalar( b );
  125. point.addSelf( tmp );
  126. tmp.copy( vectorC );
  127. tmp.multiplyScalar( c );
  128. point.addSelf( tmp );
  129. return point;
  130. },
  131. // Get random point in face (triangle / quad)
  132. // (uniform distribution)
  133. randomPointInFace: function ( face, geometry, useCachedAreas ) {
  134. var vA, vB, vC, vD;
  135. if ( face instanceof THREE.Face3 ) {
  136. vA = geometry.vertices[ face.a ];
  137. vB = geometry.vertices[ face.b ];
  138. vC = geometry.vertices[ face.c ];
  139. return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );
  140. } else if ( face instanceof THREE.Face4 ) {
  141. vA = geometry.vertices[ face.a ];
  142. vB = geometry.vertices[ face.b ];
  143. vC = geometry.vertices[ face.c ];
  144. vD = geometry.vertices[ face.d ];
  145. var area1, area2;
  146. if ( useCachedAreas ) {
  147. if ( face._area1 && face._area2 ) {
  148. area1 = face._area1;
  149. area2 = face._area2;
  150. } else {
  151. area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
  152. area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  153. face._area1 = area1;
  154. face._area2 = area2;
  155. }
  156. } else {
  157. area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ),
  158. area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  159. }
  160. var r = THREE.GeometryUtils.random() * ( area1 + area2 );
  161. if ( r < area1 ) {
  162. return THREE.GeometryUtils.randomPointInTriangle( vA, vB, vD );
  163. } else {
  164. return THREE.GeometryUtils.randomPointInTriangle( vB, vC, vD );
  165. }
  166. }
  167. },
  168. // Get uniformly distributed random points in mesh
  169. // - create array with cumulative sums of face areas
  170. // - pick random number from 0 to total area
  171. // - find corresponding place in area array by binary search
  172. // - get random point in face
  173. randomPointsInGeometry: function ( geometry, n ) {
  174. var face, i,
  175. faces = geometry.faces,
  176. vertices = geometry.vertices,
  177. il = faces.length,
  178. totalArea = 0,
  179. cumulativeAreas = [],
  180. vA, vB, vC, vD;
  181. // precompute face areas
  182. for ( i = 0; i < il; i ++ ) {
  183. face = faces[ i ];
  184. if ( face instanceof THREE.Face3 ) {
  185. vA = vertices[ face.a ];
  186. vB = vertices[ face.b ];
  187. vC = vertices[ face.c ];
  188. face._area = THREE.GeometryUtils.triangleArea( vA, vB, vC );
  189. } else if ( face instanceof THREE.Face4 ) {
  190. vA = vertices[ face.a ];
  191. vB = vertices[ face.b ];
  192. vC = vertices[ face.c ];
  193. vD = vertices[ face.d ];
  194. face._area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );
  195. face._area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );
  196. face._area = face._area1 + face._area2;
  197. }
  198. totalArea += face._area;
  199. cumulativeAreas[ i ] = totalArea;
  200. }
  201. // binary search cumulative areas array
  202. function binarySearchIndices( value ) {
  203. function binarySearch( start, end ) {
  204. // return closest larger index
  205. // if exact number is not found
  206. if ( end < start )
  207. return start;
  208. var mid = start + Math.floor( ( end - start ) / 2 );
  209. if ( cumulativeAreas[ mid ] > value ) {
  210. return binarySearch( start, mid - 1 );
  211. } else if ( cumulativeAreas[ mid ] < value ) {
  212. return binarySearch( mid + 1, end );
  213. } else {
  214. return mid;
  215. }
  216. }
  217. var result = binarySearch( 0, cumulativeAreas.length - 1 )
  218. return result;
  219. }
  220. // pick random face weighted by face area
  221. var r, index,
  222. result = [];
  223. var stats = {};
  224. for ( i = 0; i < n; i ++ ) {
  225. r = THREE.GeometryUtils.random() * totalArea;
  226. index = binarySearchIndices( r );
  227. result[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );
  228. if ( ! stats[ index ] ) {
  229. stats[ index ] = 1;
  230. } else {
  231. stats[ index ] += 1;
  232. }
  233. }
  234. return result;
  235. },
  236. // Get triangle area (by Heron's formula)
  237. // http://en.wikipedia.org/wiki/Heron%27s_formula
  238. triangleArea: function ( vectorA, vectorB, vectorC ) {
  239. var s, a, b, c,
  240. tmp = THREE.GeometryUtils.__v1;
  241. tmp.sub( vectorA, vectorB );
  242. a = tmp.length();
  243. tmp.sub( vectorA, vectorC );
  244. b = tmp.length();
  245. tmp.sub( vectorB, vectorC );
  246. c = tmp.length();
  247. s = 0.5 * ( a + b + c );
  248. return Math.sqrt( s * ( s - a ) * ( s - b ) * ( s - c ) );
  249. },
  250. // Center geometry so that 0,0,0 is in center of bounding box
  251. center: function ( geometry ) {
  252. geometry.computeBoundingBox();
  253. var bb = geometry.boundingBox;
  254. var offset = new THREE.Vector3();
  255. offset.add( bb.min, bb.max );
  256. offset.multiplyScalar( -0.5 );
  257. geometry.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) );
  258. geometry.computeBoundingBox();
  259. return offset;
  260. },
  261. // Normalize UVs to be from <0,1>
  262. // (for now just the first set of UVs)
  263. normalizeUVs: function ( geometry ) {
  264. var uvSet = geometry.faceVertexUvs[ 0 ];
  265. for ( var i = 0, il = uvSet.length; i < il; i ++ ) {
  266. var uvs = uvSet[ i ];
  267. for ( var j = 0, jl = uvs.length; j < jl; j ++ ) {
  268. // texture repeat
  269. if( uvs[ j ].u !== 1.0 ) uvs[ j ].u = uvs[ j ].u - Math.floor( uvs[ j ].u );
  270. if( uvs[ j ].v !== 1.0 ) uvs[ j ].v = uvs[ j ].v - Math.floor( uvs[ j ].v );
  271. }
  272. }
  273. },
  274. triangulateQuads: function ( geometry ) {
  275. var i, il, j, jl;
  276. var faces = [];
  277. var faceUvs = [];
  278. var faceVertexUvs = [];
  279. for ( i = 0, il = geometry.faceUvs.length; i < il; i ++ ) {
  280. faceUvs[ i ] = [];
  281. }
  282. for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
  283. faceVertexUvs[ i ] = [];
  284. }
  285. for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
  286. var face = geometry.faces[ i ];
  287. if ( face instanceof THREE.Face4 ) {
  288. var a = face.a;
  289. var b = face.b;
  290. var c = face.c;
  291. var d = face.d;
  292. var triA = new THREE.Face3();
  293. var triB = new THREE.Face3();
  294. triA.color.copy( face.color );
  295. triB.color.copy( face.color );
  296. triA.materialIndex = face.materialIndex;
  297. triB.materialIndex = face.materialIndex;
  298. triA.a = a;
  299. triA.b = b;
  300. triA.c = d;
  301. triB.a = b;
  302. triB.b = c;
  303. triB.c = d;
  304. if ( face.vertexColors.length === 4 ) {
  305. triA.vertexColors[ 0 ] = face.vertexColors[ 0 ].clone();
  306. triA.vertexColors[ 1 ] = face.vertexColors[ 1 ].clone();
  307. triA.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
  308. triB.vertexColors[ 0 ] = face.vertexColors[ 1 ].clone();
  309. triB.vertexColors[ 1 ] = face.vertexColors[ 2 ].clone();
  310. triB.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();
  311. }
  312. faces.push( triA, triB );
  313. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  314. if ( geometry.faceVertexUvs[ j ].length ) {
  315. var uvs = geometry.faceVertexUvs[ j ][ i ];
  316. var uvA = uvs[ 0 ];
  317. var uvB = uvs[ 1 ];
  318. var uvC = uvs[ 2 ];
  319. var uvD = uvs[ 3 ];
  320. var uvsTriA = [ uvA.clone(), uvB.clone(), uvD.clone() ];
  321. var uvsTriB = [ uvB.clone(), uvC.clone(), uvD.clone() ];
  322. faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
  323. }
  324. }
  325. for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
  326. if ( geometry.faceUvs[ j ].length ) {
  327. var faceUv = geometry.faceUvs[ j ][ i ];
  328. faceUvs[ j ].push( faceUv, faceUv );
  329. }
  330. }
  331. } else {
  332. faces.push( face );
  333. for ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {
  334. faceUvs[ j ].push( geometry.faceUvs[ j ][ i ] );
  335. }
  336. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  337. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  338. }
  339. }
  340. }
  341. geometry.faces = faces;
  342. geometry.faceUvs = faceUvs;
  343. geometry.faceVertexUvs = faceVertexUvs;
  344. geometry.computeCentroids();
  345. geometry.computeFaceNormals();
  346. geometry.computeVertexNormals();
  347. if ( geometry.hasTangents ) geometry.computeTangents();
  348. },
  349. // Make all faces use unique vertices
  350. // so that each face can be separated from others
  351. explode: function( geometry ) {
  352. var vertices = [];
  353. for ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {
  354. var n = vertices.length;
  355. var face = geometry.faces[ i ];
  356. if ( face instanceof THREE.Face4 ) {
  357. var a = face.a;
  358. var b = face.b;
  359. var c = face.c;
  360. var d = face.d;
  361. var va = geometry.vertices[ a ];
  362. var vb = geometry.vertices[ b ];
  363. var vc = geometry.vertices[ c ];
  364. var vd = geometry.vertices[ d ];
  365. vertices.push( va.clone() );
  366. vertices.push( vb.clone() );
  367. vertices.push( vc.clone() );
  368. vertices.push( vd.clone() );
  369. face.a = n;
  370. face.b = n + 1;
  371. face.c = n + 2;
  372. face.d = n + 3;
  373. } else {
  374. var a = face.a;
  375. var b = face.b;
  376. var c = face.c;
  377. var va = geometry.vertices[ a ];
  378. var vb = geometry.vertices[ b ];
  379. var vc = geometry.vertices[ c ];
  380. vertices.push( va.clone() );
  381. vertices.push( vb.clone() );
  382. vertices.push( vc.clone() );
  383. face.a = n;
  384. face.b = n + 1;
  385. face.c = n + 2;
  386. }
  387. }
  388. geometry.vertices = vertices;
  389. delete geometry.__tmpVertices;
  390. },
  391. // Break faces with edges longer than maxEdgeLength
  392. // - not recursive
  393. tessellate: function ( geometry, maxEdgeLength ) {
  394. var i, il, face,
  395. a, b, c, d,
  396. va, vb, vc, vd,
  397. dab, dbc, dac, dcd, dad,
  398. m, m1, m2,
  399. vm, vm1, vm2,
  400. vnm, vnm1, vnm2,
  401. vcm, vcm1, vcm2,
  402. triA, triB,
  403. quadA, quadB,
  404. edge;
  405. var faces = [];
  406. var faceVertexUvs = [];
  407. for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
  408. faceVertexUvs[ i ] = [];
  409. }
  410. for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
  411. face = geometry.faces[ i ];
  412. if ( face instanceof THREE.Face3 ) {
  413. a = face.a;
  414. b = face.b;
  415. c = face.c;
  416. va = geometry.vertices[ a ];
  417. vb = geometry.vertices[ b ];
  418. vc = geometry.vertices[ c ];
  419. dab = va.distanceTo( vb );
  420. dbc = vb.distanceTo( vc );
  421. dac = va.distanceTo( vc );
  422. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
  423. m = geometry.vertices.length;
  424. triA = face.clone();
  425. triB = face.clone();
  426. if ( dab >= dbc && dab >= dac ) {
  427. vm = va.clone();
  428. vm.lerpSelf( vb, 0.5 );
  429. triA.a = a;
  430. triA.b = m;
  431. triA.c = c;
  432. triB.a = m;
  433. triB.b = b;
  434. triB.c = c;
  435. if ( face.vertexNormals.length === 3 ) {
  436. vnm = face.vertexNormals[ 0 ].clone();
  437. vnm.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
  438. triA.vertexNormals[ 1 ].copy( vnm );
  439. triB.vertexNormals[ 0 ].copy( vnm );
  440. }
  441. if ( face.vertexColors.length === 3 ) {
  442. vcm = face.vertexColors[ 0 ].clone();
  443. vcm.lerpSelf( face.vertexColors[ 1 ], 0.5 );
  444. triA.vertexColors[ 1 ].copy( vcm );
  445. triB.vertexColors[ 0 ].copy( vcm );
  446. }
  447. edge = 0;
  448. } else if ( dbc >= dab && dbc >= dac ) {
  449. vm = vb.clone();
  450. vm.lerpSelf( vc, 0.5 );
  451. triA.a = a;
  452. triA.b = b;
  453. triA.c = m;
  454. triB.a = m;
  455. triB.b = c;
  456. triB.c = a;
  457. if ( face.vertexNormals.length === 3 ) {
  458. vnm = face.vertexNormals[ 1 ].clone();
  459. vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  460. triA.vertexNormals[ 2 ].copy( vnm );
  461. triB.vertexNormals[ 0 ].copy( vnm );
  462. triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
  463. triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
  464. }
  465. if ( face.vertexColors.length === 3 ) {
  466. vcm = face.vertexColors[ 1 ].clone();
  467. vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  468. triA.vertexColors[ 2 ].copy( vcm );
  469. triB.vertexColors[ 0 ].copy( vcm );
  470. triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
  471. triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
  472. }
  473. edge = 1;
  474. } else {
  475. vm = va.clone();
  476. vm.lerpSelf( vc, 0.5 );
  477. triA.a = a;
  478. triA.b = b;
  479. triA.c = m;
  480. triB.a = m;
  481. triB.b = b;
  482. triB.c = c;
  483. if ( face.vertexNormals.length === 3 ) {
  484. vnm = face.vertexNormals[ 0 ].clone();
  485. vnm.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  486. triA.vertexNormals[ 2 ].copy( vnm );
  487. triB.vertexNormals[ 0 ].copy( vnm );
  488. }
  489. if ( face.vertexColors.length === 3 ) {
  490. vcm = face.vertexColors[ 0 ].clone();
  491. vcm.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  492. triA.vertexColors[ 2 ].copy( vcm );
  493. triB.vertexColors[ 0 ].copy( vcm );
  494. }
  495. edge = 2;
  496. }
  497. faces.push( triA, triB );
  498. geometry.vertices.push( vm );
  499. var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
  500. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  501. if ( geometry.faceVertexUvs[ j ].length ) {
  502. uvs = geometry.faceVertexUvs[ j ][ i ];
  503. uvA = uvs[ 0 ];
  504. uvB = uvs[ 1 ];
  505. uvC = uvs[ 2 ];
  506. // AB
  507. if ( edge === 0 ) {
  508. uvM = uvA.clone();
  509. uvM.lerpSelf( uvB, 0.5 );
  510. uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
  511. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  512. // BC
  513. } else if ( edge === 1 ) {
  514. uvM = uvB.clone();
  515. uvM.lerpSelf( uvC, 0.5 );
  516. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  517. uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
  518. // AC
  519. } else {
  520. uvM = uvA.clone();
  521. uvM.lerpSelf( uvC, 0.5 );
  522. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  523. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  524. }
  525. faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
  526. }
  527. }
  528. } else {
  529. faces.push( face );
  530. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  531. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  532. }
  533. }
  534. } else {
  535. a = face.a;
  536. b = face.b;
  537. c = face.c;
  538. d = face.d;
  539. va = geometry.vertices[ a ];
  540. vb = geometry.vertices[ b ];
  541. vc = geometry.vertices[ c ];
  542. vd = geometry.vertices[ d ];
  543. dab = va.distanceTo( vb );
  544. dbc = vb.distanceTo( vc );
  545. dcd = vc.distanceTo( vd );
  546. dad = va.distanceTo( vd );
  547. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
  548. m1 = geometry.vertices.length;
  549. m2 = geometry.vertices.length + 1;
  550. quadA = face.clone();
  551. quadB = face.clone();
  552. if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
  553. vm1 = va.clone();
  554. vm1.lerpSelf( vb, 0.5 );
  555. vm2 = vc.clone();
  556. vm2.lerpSelf( vd, 0.5 );
  557. quadA.a = a;
  558. quadA.b = m1;
  559. quadA.c = m2;
  560. quadA.d = d;
  561. quadB.a = m1;
  562. quadB.b = b;
  563. quadB.c = c;
  564. quadB.d = m2;
  565. if ( face.vertexNormals.length === 4 ) {
  566. vnm1 = face.vertexNormals[ 0 ].clone();
  567. vnm1.lerpSelf( face.vertexNormals[ 1 ], 0.5 );
  568. vnm2 = face.vertexNormals[ 2 ].clone();
  569. vnm2.lerpSelf( face.vertexNormals[ 3 ], 0.5 );
  570. quadA.vertexNormals[ 1 ].copy( vnm1 );
  571. quadA.vertexNormals[ 2 ].copy( vnm2 );
  572. quadB.vertexNormals[ 0 ].copy( vnm1 );
  573. quadB.vertexNormals[ 3 ].copy( vnm2 );
  574. }
  575. if ( face.vertexColors.length === 4 ) {
  576. vcm1 = face.vertexColors[ 0 ].clone();
  577. vcm1.lerpSelf( face.vertexColors[ 1 ], 0.5 );
  578. vcm2 = face.vertexColors[ 2 ].clone();
  579. vcm2.lerpSelf( face.vertexColors[ 3 ], 0.5 );
  580. quadA.vertexColors[ 1 ].copy( vcm1 );
  581. quadA.vertexColors[ 2 ].copy( vcm2 );
  582. quadB.vertexColors[ 0 ].copy( vcm1 );
  583. quadB.vertexColors[ 3 ].copy( vcm2 );
  584. }
  585. edge = 0;
  586. } else {
  587. vm1 = vb.clone();
  588. vm1.lerpSelf( vc, 0.5 );
  589. vm2 = vd.clone();
  590. vm2.lerpSelf( va, 0.5 );
  591. quadA.a = a;
  592. quadA.b = b;
  593. quadA.c = m1;
  594. quadA.d = m2;
  595. quadB.a = m2;
  596. quadB.b = m1;
  597. quadB.c = c;
  598. quadB.d = d;
  599. if ( face.vertexNormals.length === 4 ) {
  600. vnm1 = face.vertexNormals[ 1 ].clone();
  601. vnm1.lerpSelf( face.vertexNormals[ 2 ], 0.5 );
  602. vnm2 = face.vertexNormals[ 3 ].clone();
  603. vnm2.lerpSelf( face.vertexNormals[ 0 ], 0.5 );
  604. quadA.vertexNormals[ 2 ].copy( vnm1 );
  605. quadA.vertexNormals[ 3 ].copy( vnm2 );
  606. quadB.vertexNormals[ 0 ].copy( vnm2 );
  607. quadB.vertexNormals[ 1 ].copy( vnm1 );
  608. }
  609. if ( face.vertexColors.length === 4 ) {
  610. vcm1 = face.vertexColors[ 1 ].clone();
  611. vcm1.lerpSelf( face.vertexColors[ 2 ], 0.5 );
  612. vcm2 = face.vertexColors[ 3 ].clone();
  613. vcm2.lerpSelf( face.vertexColors[ 0 ], 0.5 );
  614. quadA.vertexColors[ 2 ].copy( vcm1 );
  615. quadA.vertexColors[ 3 ].copy( vcm2 );
  616. quadB.vertexColors[ 0 ].copy( vcm2 );
  617. quadB.vertexColors[ 1 ].copy( vcm1 );
  618. }
  619. edge = 1;
  620. }
  621. faces.push( quadA, quadB );
  622. geometry.vertices.push( vm1, vm2 );
  623. var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
  624. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  625. if ( geometry.faceVertexUvs[ j ].length ) {
  626. uvs = geometry.faceVertexUvs[ j ][ i ];
  627. uvA = uvs[ 0 ];
  628. uvB = uvs[ 1 ];
  629. uvC = uvs[ 2 ];
  630. uvD = uvs[ 3 ];
  631. // AB + CD
  632. if ( edge === 0 ) {
  633. uvM1 = uvA.clone();
  634. uvM1.lerpSelf( uvB, 0.5 );
  635. uvM2 = uvC.clone();
  636. uvM2.lerpSelf( uvD, 0.5 );
  637. uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
  638. uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
  639. // BC + AD
  640. } else {
  641. uvM1 = uvB.clone();
  642. uvM1.lerpSelf( uvC, 0.5 );
  643. uvM2 = uvD.clone();
  644. uvM2.lerpSelf( uvA, 0.5 );
  645. uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
  646. uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
  647. }
  648. faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
  649. }
  650. }
  651. } else {
  652. faces.push( face );
  653. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  654. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  655. }
  656. }
  657. }
  658. }
  659. geometry.faces = faces;
  660. geometry.faceVertexUvs = faceVertexUvs;
  661. }
  662. };
  663. THREE.GeometryUtils.random = THREE.Math.random16;
  664. THREE.GeometryUtils.__v1 = new THREE.Vector3();