ExtrudeGeometry.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /**
  2. * @author zz85 / http://www.lab4games.net/zz85/blog
  3. * Creates extruded geometry form path.
  4. **/
  5. THREE.ExtrudeGeometry = function( shape, options ) {
  6. var amount = options.amount !== undefined ? options.amount : 100;
  7. // todo: bevel
  8. var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 10;
  9. var bevelSize = options.bevelSize !== undefined ? options.bevelSize : 8;
  10. var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : false;
  11. var steps = options.steps !== undefined ? options.steps : 1;
  12. var extrudePath = options.path !== undefined ? options.path : null;
  13. var extrudePts, extrudeByPath = false;
  14. if ( extrudePath ) {
  15. extrudePts = extrudePath.getPoints();
  16. steps = extrudePts.length;
  17. extrudeByPath = true;
  18. }
  19. // TODO, extrude by path's tangents? also via 3d path?
  20. THREE.Geometry.call( this );
  21. // getPoints
  22. var vertices = shape.getSpacedPoints(); // getPoints | getSpacedPoints() you can get variable divisions by dividing by total lenght
  23. var reverse = THREE.FontUtils.Triangulate.area( vertices ) > 0 ;
  24. if (reverse) {
  25. //faces = THREE.FontUtils.Triangulate( vertices.reverse(), true );
  26. vertices = vertices.reverse();
  27. reverse = false;
  28. }
  29. var holes = shape.getHoles();
  30. //var faces = THREE.Shape.Utils.triangulateShape(vertices, holes);
  31. var faces = THREE.Shape.Utils.triangulate2(vertices, holes);
  32. //console.log(faces);
  33. //var faces = THREE.FontUtils.Triangulate( vertices, true );
  34. var contour = vertices; // vertices has all points but contour has only points of circumference
  35. var ahole ;
  36. for (var h in holes) {
  37. ahole = holes[h];
  38. vertices = vertices.concat(ahole);
  39. }
  40. console.log("same?", contour.length, vertices.length);
  41. var scope = this;
  42. var bevelPoints = [];
  43. //console.log(reverse);
  44. var i,
  45. vert, vlen = vertices.length,
  46. face, flen = faces.length,
  47. bevelPt, blen = bevelPoints.length;
  48. // Back facing vertices
  49. for ( i = 0; i < vlen; i++ ) {
  50. vert = vertices[ i ];
  51. v( vert.x, vert.y, 0 );
  52. }
  53. // Add steped vertices...
  54. // Including front facing vertices
  55. var s = 1;
  56. for ( ; s <= steps; s++ ) {
  57. for ( i = 0; i < vlen; i ++ ) {
  58. vert = vertices[ i ];
  59. if ( !extrudeByPath ) {
  60. v( vert.x, vert.y, amount/steps * s );
  61. } else {
  62. v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
  63. }
  64. }
  65. }
  66. /*
  67. // Front facing vertices
  68. for ( i = 0; i < vlen; i++ ) {
  69. vert = vertices[ i ];
  70. v( vert.x, vert.y, amount );
  71. }
  72. */
  73. if ( bevelEnabled ) {
  74. for ( i = 0; i < blen; i++ ) {
  75. bevelPt = bevelPoints[ i ];
  76. v( bevelPt.x, bevelPt.y, bevelThickness );
  77. }
  78. for ( i = 0; i < blen; i++ ) {
  79. bevelPt = bevelPoints[ i ];
  80. v( bevelPt.x, bevelPt.y, amount - bevelThickness );
  81. }
  82. }
  83. // Bottom faces
  84. for ( i = 0; i < flen; i++ ) {
  85. face = faces[ i ];
  86. f3( face[ 2 ], face[ 1 ], face[ 0 ] );
  87. }
  88. // Top faces
  89. for ( i = 0; i < flen; i++ ) {
  90. face = faces[ i ];
  91. f3( face[ 0 ] + vlen* steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
  92. }
  93. var lastV;
  94. var j, k, l, m;
  95. // Sides faces
  96. //contour.push( contour[ 0 ] ); // in order not to check for boundary indices every time
  97. i = contour.length;
  98. while ( --i >= 0 ) {
  99. lastV = contour[ i ];
  100. // TO OPTIMISE. Reduce this step of checking vertices.
  101. /*
  102. for ( j = 0; j < vlen; j++ ) {
  103. if ( vertices[ j ].equals( contour[ i ] ) ) break;
  104. }
  105. for ( k = 0; k < vlen; k++ ) {
  106. if ( vertices[ k ].equals( contour[ i - 1 ] ) ) break;
  107. }
  108. */
  109. //TOREMOVE
  110. //console.log('a', i,j, i-1, k);
  111. j = i;
  112. //if (j==vertices.length) j = 0;
  113. k = i - 1;
  114. if ( k < 0 ) k = contour.length - 1;
  115. //console.log('b', i,j, i-1, k,vertices.length);
  116. // Create faces for the z-sides of the text
  117. //f4( j, k, k + vlen, j + vlen );
  118. // Reverse
  119. //f4( k, j, j + vlen, k + vlen);
  120. //
  121. var s = 0;
  122. for ( ; s < steps; s++ ) {
  123. var slen1 = vlen * s;
  124. var slen2 = vlen * ( s + 1 );
  125. f4( j + slen1, k + slen1, k + slen2, j + slen2 );
  126. }
  127. //
  128. }
  129. // UVs to be added
  130. this.computeCentroids();
  131. this.computeFaceNormals();
  132. //this.computeVertexNormals();
  133. function v( x, y, z ) {
  134. scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
  135. }
  136. function f3( a, b, c ) {
  137. if ( reverse ) {
  138. scope.faces.push( new THREE.Face3( c, b, a ) );
  139. } else {
  140. scope.faces.push( new THREE.Face3( a, b, c ) );
  141. }
  142. }
  143. function f4( a, b, c, d ) {
  144. if ( reverse ) {
  145. scope.faces.push( new THREE.Face4( d, c, b, a ) );
  146. } else {
  147. scope.faces.push( new THREE.Face4( a, b, c, d ) );
  148. }
  149. }
  150. };
  151. THREE.ExtrudeGeometry.prototype = new THREE.Geometry();
  152. THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry;