TessellateModifier.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. /**
  2. * Break faces with edges longer than maxEdgeLength
  3. * - not recursive
  4. *
  5. * @author alteredq / http://alteredqualia.com/
  6. */
  7. THREE.TessellateModifier = function ( maxEdgeLength ) {
  8. this.maxEdgeLength = maxEdgeLength;
  9. };
  10. THREE.TessellateModifier.prototype.modify = function ( geometry ) {
  11. var i, il, face,
  12. a, b, c, d,
  13. va, vb, vc, vd,
  14. dab, dbc, dac, dcd, dad,
  15. m, m1, m2,
  16. vm, vm1, vm2,
  17. vnm, vnm1, vnm2,
  18. vcm, vcm1, vcm2,
  19. triA, triB,
  20. quadA, quadB,
  21. edge;
  22. var faces = [];
  23. var faceVertexUvs = [];
  24. var maxEdgeLength = this.maxEdgeLength;
  25. for ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {
  26. faceVertexUvs[ i ] = [];
  27. }
  28. for ( i = 0, il = geometry.faces.length; i < il; i ++ ) {
  29. face = geometry.faces[ i ];
  30. if ( face instanceof THREE.Face3 ) {
  31. a = face.a;
  32. b = face.b;
  33. c = face.c;
  34. va = geometry.vertices[ a ];
  35. vb = geometry.vertices[ b ];
  36. vc = geometry.vertices[ c ];
  37. dab = va.distanceTo( vb );
  38. dbc = vb.distanceTo( vc );
  39. dac = va.distanceTo( vc );
  40. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dac > maxEdgeLength ) {
  41. m = geometry.vertices.length;
  42. triA = face.clone();
  43. triB = face.clone();
  44. if ( dab >= dbc && dab >= dac ) {
  45. vm = va.clone();
  46. vm.lerp( vb, 0.5 );
  47. triA.a = a;
  48. triA.b = m;
  49. triA.c = c;
  50. triB.a = m;
  51. triB.b = b;
  52. triB.c = c;
  53. if ( face.vertexNormals.length === 3 ) {
  54. vnm = face.vertexNormals[ 0 ].clone();
  55. vnm.lerp( face.vertexNormals[ 1 ], 0.5 );
  56. triA.vertexNormals[ 1 ].copy( vnm );
  57. triB.vertexNormals[ 0 ].copy( vnm );
  58. }
  59. if ( face.vertexColors.length === 3 ) {
  60. vcm = face.vertexColors[ 0 ].clone();
  61. vcm.lerp( face.vertexColors[ 1 ], 0.5 );
  62. triA.vertexColors[ 1 ].copy( vcm );
  63. triB.vertexColors[ 0 ].copy( vcm );
  64. }
  65. edge = 0;
  66. } else if ( dbc >= dab && dbc >= dac ) {
  67. vm = vb.clone();
  68. vm.lerp( vc, 0.5 );
  69. triA.a = a;
  70. triA.b = b;
  71. triA.c = m;
  72. triB.a = m;
  73. triB.b = c;
  74. triB.c = a;
  75. if ( face.vertexNormals.length === 3 ) {
  76. vnm = face.vertexNormals[ 1 ].clone();
  77. vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
  78. triA.vertexNormals[ 2 ].copy( vnm );
  79. triB.vertexNormals[ 0 ].copy( vnm );
  80. triB.vertexNormals[ 1 ].copy( face.vertexNormals[ 2 ] );
  81. triB.vertexNormals[ 2 ].copy( face.vertexNormals[ 0 ] );
  82. }
  83. if ( face.vertexColors.length === 3 ) {
  84. vcm = face.vertexColors[ 1 ].clone();
  85. vcm.lerp( face.vertexColors[ 2 ], 0.5 );
  86. triA.vertexColors[ 2 ].copy( vcm );
  87. triB.vertexColors[ 0 ].copy( vcm );
  88. triB.vertexColors[ 1 ].copy( face.vertexColors[ 2 ] );
  89. triB.vertexColors[ 2 ].copy( face.vertexColors[ 0 ] );
  90. }
  91. edge = 1;
  92. } else {
  93. vm = va.clone();
  94. vm.lerp( vc, 0.5 );
  95. triA.a = a;
  96. triA.b = b;
  97. triA.c = m;
  98. triB.a = m;
  99. triB.b = b;
  100. triB.c = c;
  101. if ( face.vertexNormals.length === 3 ) {
  102. vnm = face.vertexNormals[ 0 ].clone();
  103. vnm.lerp( face.vertexNormals[ 2 ], 0.5 );
  104. triA.vertexNormals[ 2 ].copy( vnm );
  105. triB.vertexNormals[ 0 ].copy( vnm );
  106. }
  107. if ( face.vertexColors.length === 3 ) {
  108. vcm = face.vertexColors[ 0 ].clone();
  109. vcm.lerp( face.vertexColors[ 2 ], 0.5 );
  110. triA.vertexColors[ 2 ].copy( vcm );
  111. triB.vertexColors[ 0 ].copy( vcm );
  112. }
  113. edge = 2;
  114. }
  115. faces.push( triA, triB );
  116. geometry.vertices.push( vm );
  117. var j, jl, uvs, uvA, uvB, uvC, uvM, uvsTriA, uvsTriB;
  118. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  119. if ( geometry.faceVertexUvs[ j ].length ) {
  120. uvs = geometry.faceVertexUvs[ j ][ i ];
  121. uvA = uvs[ 0 ];
  122. uvB = uvs[ 1 ];
  123. uvC = uvs[ 2 ];
  124. // AB
  125. if ( edge === 0 ) {
  126. uvM = uvA.clone();
  127. uvM.lerp( uvB, 0.5 );
  128. uvsTriA = [ uvA.clone(), uvM.clone(), uvC.clone() ];
  129. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  130. // BC
  131. } else if ( edge === 1 ) {
  132. uvM = uvB.clone();
  133. uvM.lerp( uvC, 0.5 );
  134. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  135. uvsTriB = [ uvM.clone(), uvC.clone(), uvA.clone() ];
  136. // AC
  137. } else {
  138. uvM = uvA.clone();
  139. uvM.lerp( uvC, 0.5 );
  140. uvsTriA = [ uvA.clone(), uvB.clone(), uvM.clone() ];
  141. uvsTriB = [ uvM.clone(), uvB.clone(), uvC.clone() ];
  142. }
  143. faceVertexUvs[ j ].push( uvsTriA, uvsTriB );
  144. }
  145. }
  146. } else {
  147. faces.push( face );
  148. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  149. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  150. }
  151. }
  152. } else {
  153. a = face.a;
  154. b = face.b;
  155. c = face.c;
  156. d = face.d;
  157. va = geometry.vertices[ a ];
  158. vb = geometry.vertices[ b ];
  159. vc = geometry.vertices[ c ];
  160. vd = geometry.vertices[ d ];
  161. dab = va.distanceTo( vb );
  162. dbc = vb.distanceTo( vc );
  163. dcd = vc.distanceTo( vd );
  164. dad = va.distanceTo( vd );
  165. if ( dab > maxEdgeLength || dbc > maxEdgeLength || dcd > maxEdgeLength || dad > maxEdgeLength ) {
  166. m1 = geometry.vertices.length;
  167. m2 = geometry.vertices.length + 1;
  168. quadA = face.clone();
  169. quadB = face.clone();
  170. if ( ( dab >= dbc && dab >= dcd && dab >= dad ) || ( dcd >= dbc && dcd >= dab && dcd >= dad ) ) {
  171. vm1 = va.clone();
  172. vm1.lerp( vb, 0.5 );
  173. vm2 = vc.clone();
  174. vm2.lerp( vd, 0.5 );
  175. quadA.a = a;
  176. quadA.b = m1;
  177. quadA.c = m2;
  178. quadA.d = d;
  179. quadB.a = m1;
  180. quadB.b = b;
  181. quadB.c = c;
  182. quadB.d = m2;
  183. if ( face.vertexNormals.length === 4 ) {
  184. vnm1 = face.vertexNormals[ 0 ].clone();
  185. vnm1.lerp( face.vertexNormals[ 1 ], 0.5 );
  186. vnm2 = face.vertexNormals[ 2 ].clone();
  187. vnm2.lerp( face.vertexNormals[ 3 ], 0.5 );
  188. quadA.vertexNormals[ 1 ].copy( vnm1 );
  189. quadA.vertexNormals[ 2 ].copy( vnm2 );
  190. quadB.vertexNormals[ 0 ].copy( vnm1 );
  191. quadB.vertexNormals[ 3 ].copy( vnm2 );
  192. }
  193. if ( face.vertexColors.length === 4 ) {
  194. vcm1 = face.vertexColors[ 0 ].clone();
  195. vcm1.lerp( face.vertexColors[ 1 ], 0.5 );
  196. vcm2 = face.vertexColors[ 2 ].clone();
  197. vcm2.lerp( face.vertexColors[ 3 ], 0.5 );
  198. quadA.vertexColors[ 1 ].copy( vcm1 );
  199. quadA.vertexColors[ 2 ].copy( vcm2 );
  200. quadB.vertexColors[ 0 ].copy( vcm1 );
  201. quadB.vertexColors[ 3 ].copy( vcm2 );
  202. }
  203. edge = 0;
  204. } else {
  205. vm1 = vb.clone();
  206. vm1.lerp( vc, 0.5 );
  207. vm2 = vd.clone();
  208. vm2.lerp( va, 0.5 );
  209. quadA.a = a;
  210. quadA.b = b;
  211. quadA.c = m1;
  212. quadA.d = m2;
  213. quadB.a = m2;
  214. quadB.b = m1;
  215. quadB.c = c;
  216. quadB.d = d;
  217. if ( face.vertexNormals.length === 4 ) {
  218. vnm1 = face.vertexNormals[ 1 ].clone();
  219. vnm1.lerp( face.vertexNormals[ 2 ], 0.5 );
  220. vnm2 = face.vertexNormals[ 3 ].clone();
  221. vnm2.lerp( face.vertexNormals[ 0 ], 0.5 );
  222. quadA.vertexNormals[ 2 ].copy( vnm1 );
  223. quadA.vertexNormals[ 3 ].copy( vnm2 );
  224. quadB.vertexNormals[ 0 ].copy( vnm2 );
  225. quadB.vertexNormals[ 1 ].copy( vnm1 );
  226. }
  227. if ( face.vertexColors.length === 4 ) {
  228. vcm1 = face.vertexColors[ 1 ].clone();
  229. vcm1.lerp( face.vertexColors[ 2 ], 0.5 );
  230. vcm2 = face.vertexColors[ 3 ].clone();
  231. vcm2.lerp( face.vertexColors[ 0 ], 0.5 );
  232. quadA.vertexColors[ 2 ].copy( vcm1 );
  233. quadA.vertexColors[ 3 ].copy( vcm2 );
  234. quadB.vertexColors[ 0 ].copy( vcm2 );
  235. quadB.vertexColors[ 1 ].copy( vcm1 );
  236. }
  237. edge = 1;
  238. }
  239. faces.push( quadA, quadB );
  240. geometry.vertices.push( vm1, vm2 );
  241. var j, jl, uvs, uvA, uvB, uvC, uvD, uvM1, uvM2, uvsQuadA, uvsQuadB;
  242. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  243. if ( geometry.faceVertexUvs[ j ].length ) {
  244. uvs = geometry.faceVertexUvs[ j ][ i ];
  245. uvA = uvs[ 0 ];
  246. uvB = uvs[ 1 ];
  247. uvC = uvs[ 2 ];
  248. uvD = uvs[ 3 ];
  249. // AB + CD
  250. if ( edge === 0 ) {
  251. uvM1 = uvA.clone();
  252. uvM1.lerp( uvB, 0.5 );
  253. uvM2 = uvC.clone();
  254. uvM2.lerp( uvD, 0.5 );
  255. uvsQuadA = [ uvA.clone(), uvM1.clone(), uvM2.clone(), uvD.clone() ];
  256. uvsQuadB = [ uvM1.clone(), uvB.clone(), uvC.clone(), uvM2.clone() ];
  257. // BC + AD
  258. } else {
  259. uvM1 = uvB.clone();
  260. uvM1.lerp( uvC, 0.5 );
  261. uvM2 = uvD.clone();
  262. uvM2.lerp( uvA, 0.5 );
  263. uvsQuadA = [ uvA.clone(), uvB.clone(), uvM1.clone(), uvM2.clone() ];
  264. uvsQuadB = [ uvM2.clone(), uvM1.clone(), uvC.clone(), uvD.clone() ];
  265. }
  266. faceVertexUvs[ j ].push( uvsQuadA, uvsQuadB );
  267. }
  268. }
  269. } else {
  270. faces.push( face );
  271. for ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {
  272. faceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );
  273. }
  274. }
  275. }
  276. }
  277. geometry.faces = faces;
  278. geometry.faceVertexUvs = faceVertexUvs;
  279. }