|
@@ -1,6 +1,6 @@
|
|
|
/**
|
|
|
* @author zz85 / http://www.lab4games.net/zz85/blog
|
|
|
- * Creates extruded geometry form path.
|
|
|
+ * Creates extruded geometry from a path shape.
|
|
|
**/
|
|
|
|
|
|
THREE.ExtrudeGeometry = function( shape, options ) {
|
|
@@ -8,14 +8,17 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
var amount = options.amount !== undefined ? options.amount : 100;
|
|
|
|
|
|
// todo: bevel
|
|
|
- var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 4; // 10
|
|
|
- var bevelSize = options.bevelSize !== undefined ? options.bevelSize : 6; // 8
|
|
|
- var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : false;
|
|
|
- var bevelSegments = 4;
|
|
|
+ var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 8; // 10
|
|
|
+ var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness; // 8
|
|
|
+ var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false
|
|
|
+ var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 6;
|
|
|
+ // We should set bevel segments to 0 if bevel is not enabled.
|
|
|
+ if (!bevelEnabled) bevelSegments = 0 ;
|
|
|
+
|
|
|
|
|
|
var steps = options.steps !== undefined ? options.steps : 1;
|
|
|
+
|
|
|
var extrudePath = options.path !== undefined ? options.path : null;
|
|
|
-
|
|
|
var extrudePts, extrudeByPath = false;
|
|
|
|
|
|
if ( extrudePath ) {
|
|
@@ -26,7 +29,6 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- bevelEnabled = true;
|
|
|
|
|
|
// TODO, extrude by path's tangents? also via 3d path?
|
|
|
|
|
@@ -40,7 +42,7 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
|
|
|
// getPoints
|
|
|
- var shapePoints = shape.extractAllPoints(true);
|
|
|
+ var shapePoints = shape.extractAllPoints(false);
|
|
|
// getPoints | getSpacedPoints() you can get variable divisions by dividing by total length
|
|
|
|
|
|
var vertices = shapePoints.shape;
|
|
@@ -92,61 +94,9 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- console.log("same?", contour.length == vertices.length);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- var i,
|
|
|
- vert, vlen = vertices.length,
|
|
|
- face, flen = faces.length,
|
|
|
- cont, clen = contour.length,
|
|
|
- hol, hlen;
|
|
|
-
|
|
|
- var bevelPt, blen = bevelPoints.length;
|
|
|
-
|
|
|
- // Back facing vertices
|
|
|
-
|
|
|
- for ( i = 0; i < vlen; i++ ) {
|
|
|
-
|
|
|
- vert = vertices[ i ];
|
|
|
- v( vert.x, vert.y, 0 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // Add steped vertices...
|
|
|
-
|
|
|
- // Including front facing vertices
|
|
|
-
|
|
|
- var s = 1;
|
|
|
- for ( ; s <= steps; s++ ) {
|
|
|
-
|
|
|
- for ( i = 0; i < vlen; i ++ ) {
|
|
|
-
|
|
|
- vert = vertices[ i ];
|
|
|
-
|
|
|
- if ( !extrudeByPath ) {
|
|
|
-
|
|
|
- v( vert.x, vert.y, amount/steps * s );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // Add bevel planes
|
|
|
-
|
|
|
- // Loop bevelSegments, 1 for the front, 1 for the back
|
|
|
-
|
|
|
- var b;
|
|
|
-
|
|
|
// Find all centroids of shapes and holes
|
|
|
+
|
|
|
+ var b;
|
|
|
var sum = new THREE.Vector2();
|
|
|
var contourCentroid, holesCentroids;
|
|
|
|
|
@@ -188,18 +138,25 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
return vectorFromCentroid.multiplyScalar( adj ).addSelf( centroid );
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ var i,
|
|
|
+ vert, vlen = vertices.length,
|
|
|
+ face, flen = faces.length,
|
|
|
+ cont, clen = contour.length,
|
|
|
+ hol, hlen;
|
|
|
+
|
|
|
+
|
|
|
var bs;
|
|
|
|
|
|
+ // Loop bevelSegments, 1 for the front, 1 for the back
|
|
|
+
|
|
|
for (b=bevelSegments; b > 0; b--) {
|
|
|
- // z
|
|
|
- // ****
|
|
|
t = b / bevelSegments;
|
|
|
z = bevelThickness * t;
|
|
|
- bs = bevelSize * (1-Math.sin ((1-t) * Math.PI/2 )); //bevelSize * t ;
|
|
|
-
|
|
|
+ // Formula could probably be simplified
|
|
|
+ bs = bevelSize * (1-Math.sin ((1-t) * Math.PI/2 )) ; //bevelSize * t ;
|
|
|
|
|
|
- //bs = Math.sqrt(- (t* t) - 2 * t * bevelThickness);
|
|
|
-
|
|
|
// contract shape
|
|
|
for ( i = 0, il = contour.length; i < il; i++ ) {
|
|
|
|
|
@@ -221,6 +178,54 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ // Back facing vertices
|
|
|
+
|
|
|
+ for ( i = 0; i < vlen; i++ ) {
|
|
|
+
|
|
|
+ vert = vertices[ i ];
|
|
|
+ //v( vert.x, vert.y, 0 );
|
|
|
+
|
|
|
+
|
|
|
+ if ( !extrudeByPath ) {
|
|
|
+
|
|
|
+ v( vert.x, vert.y, 0 );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // Add steped vertices...
|
|
|
+ // Including front facing vertices
|
|
|
+
|
|
|
+ var s = 1;
|
|
|
+ for ( ; s <= steps; s++ ) {
|
|
|
+
|
|
|
+ for ( i = 0; i < vlen; i ++ ) {
|
|
|
+
|
|
|
+ vert = vertices[ i ];
|
|
|
+
|
|
|
+ if ( !extrudeByPath ) {
|
|
|
+
|
|
|
+ v( vert.x, vert.y, amount/steps * s );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // Add Bevel Segments planes
|
|
|
+
|
|
|
for (b=1; b <= bevelSegments; b++) {
|
|
|
|
|
|
t = b / bevelSegments;
|
|
@@ -240,8 +245,18 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
ahole = holes[h];
|
|
|
for ( i = 0, il = ahole.length; i < il; i++ ) {
|
|
|
- vert = scalePt(ahole[i], holesCentroids[h] , bs , true);
|
|
|
- v( vert.x, vert.y, amount + z);
|
|
|
+ vert = scalePt(ahole[i], holesCentroids[h] , bs , true);
|
|
|
+
|
|
|
+ if ( !extrudeByPath ) {
|
|
|
+
|
|
|
+ v( vert.x, vert.y, amount + z);
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x +z);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -258,10 +273,10 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
|
|
|
// Bottom faces
|
|
|
- if ( bevelEnabled ) {
|
|
|
+ if (true|| bevelEnabled ) {
|
|
|
|
|
|
|
|
|
- var layer = steps + 1;
|
|
|
+ var layer = 0 ; //steps + 1
|
|
|
var offset = vlen * layer;
|
|
|
|
|
|
for ( i = 0; i < flen; i++ ) {
|
|
@@ -271,7 +286,7 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
- layer = bevelSegments* 2;
|
|
|
+ layer = steps + bevelSegments* 2;
|
|
|
offset = vlen * layer;
|
|
|
|
|
|
// Top faces
|
|
@@ -344,15 +359,47 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
var s = 0;
|
|
|
|
|
|
- for ( ; s < (steps + bevelSegments* 2) ; s++ ) {
|
|
|
+ for ( ; s < (steps + bevelSegments * 2) ; s++ ) {
|
|
|
|
|
|
var slen1 = vlen * s;
|
|
|
var slen2 = vlen * ( s + 1 );
|
|
|
+
|
|
|
+
|
|
|
|
|
|
f4( layeroffset + j + slen1, layeroffset + k + slen1, layeroffset + k + slen2, layeroffset + j + slen2 );
|
|
|
|
|
|
|
|
|
}
|
|
|
+ /*
|
|
|
+
|
|
|
+ // if we have bevel in the correct order, we could potentially do everything in a loop.
|
|
|
+ for ( s = steps + 1; s < (steps + bevelSegments) ; s++ ) {
|
|
|
+
|
|
|
+ var slen1 = vlen * s;
|
|
|
+
|
|
|
+ var slen2 = vlen * ( s + 1 );
|
|
|
+ if ( (s+1)==(steps + bevelSegments) ) {
|
|
|
+ slen2 = vlen * 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ f4( layeroffset + j + slen1, layeroffset + k + slen1, layeroffset + k + slen2, layeroffset + j + slen2 );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // if we have bevel in the correct order, we could potentially do everything in a loop.
|
|
|
+ for ( s = (steps + bevelSegments * 2); s > (steps + bevelSegments) ; s-- ) {
|
|
|
+
|
|
|
+ var slen1 = vlen * s;
|
|
|
+
|
|
|
+ var slen2 = vlen * ( s -1 );
|
|
|
+ if ( (s )==(steps + bevelSegments) ) {
|
|
|
+ slen2 = vlen * steps;
|
|
|
+ }
|
|
|
+
|
|
|
+ f4( layeroffset + j + slen1, layeroffset + k + slen1, layeroffset + k + slen2, layeroffset + j + slen2 );
|
|
|
+
|
|
|
+ }
|
|
|
+ */
|
|
|
|
|
|
//
|
|
|
|
|
@@ -387,15 +434,8 @@ THREE.ExtrudeGeometry = function( shape, options ) {
|
|
|
|
|
|
function f4( a, b, c, d ) {
|
|
|
|
|
|
- // if ( reverse ) {
|
|
|
- //
|
|
|
- // scope.faces.push( new THREE.Face4( d, c, b, a ) );
|
|
|
- //
|
|
|
- // } else {
|
|
|
- //
|
|
|
- scope.faces.push( new THREE.Face4( a, b, c, d ) );
|
|
|
- //
|
|
|
- // }
|
|
|
+
|
|
|
+ scope.faces.push( new THREE.Face4( a, b, c, d ) );
|
|
|
|
|
|
}
|
|
|
|