Browse Source

change bevel vertices order

zz85 14 years ago
parent
commit
2af891d742
1 changed files with 123 additions and 83 deletions
  1. 123 83
      src/extras/geometries/ExtrudeGeometry.js

+ 123 - 83
src/extras/geometries/ExtrudeGeometry.js

@@ -1,6 +1,6 @@
 /**
 /**
  * @author zz85 / http://www.lab4games.net/zz85/blog
  * @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 ) {
 THREE.ExtrudeGeometry = function( shape, options ) {
@@ -8,14 +8,17 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 	var amount = options.amount !== undefined ? options.amount : 100;
 	var amount = options.amount !== undefined ? options.amount : 100;
 
 
 	// todo: bevel
 	// 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 steps = options.steps !== undefined ? options.steps : 1;
+	
 	var extrudePath = options.path !== undefined ? options.path : null;
 	var extrudePath = options.path !== undefined ? options.path : null;
-
 	var extrudePts, extrudeByPath = false;
 	var extrudePts, extrudeByPath = false;
 
 
 	if ( extrudePath ) {
 	if ( extrudePath ) {
@@ -26,7 +29,6 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 
 
 	}
 	}
 	
 	
-	bevelEnabled = true;
 
 
 	// TODO, extrude by path's tangents? also via 3d path?
 	// TODO, extrude by path's tangents? also via 3d path?
 
 
@@ -40,7 +42,7 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 
 
 
 
 	// getPoints
 	// getPoints
-	var shapePoints = shape.extractAllPoints(true);
+	var shapePoints = shape.extractAllPoints(false);
 	// getPoints | getSpacedPoints() you can get variable divisions by dividing by total length
 	// getPoints | getSpacedPoints() you can get variable divisions by dividing by total length
 	
 	
     var vertices = shapePoints.shape; 
     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
 	// Find all centroids of shapes and holes
+	
+	var b;	
 	var sum = new THREE.Vector2();
 	var sum = new THREE.Vector2();
 	var contourCentroid, holesCentroids;
 	var contourCentroid, holesCentroids;
 	
 	
@@ -188,18 +138,25 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 		return vectorFromCentroid.multiplyScalar( adj ).addSelf( centroid );
 		return vectorFromCentroid.multiplyScalar( adj ).addSelf( centroid );
 	}
 	}
 	
 	
+
+
+	var i,
+		vert, vlen = vertices.length,
+		face, flen = faces.length,
+		cont, clen = contour.length,
+		hol, hlen;
+		
+
 	var bs;
 	var bs;
 	
 	
+	// Loop bevelSegments, 1 for the front, 1 for the back
+	
 	for (b=bevelSegments; b > 0; b--) {
 	for (b=bevelSegments; b > 0; b--) {
-		//   z
-		// ****
 		t =  b / bevelSegments;
 		t =  b / bevelSegments;
 		z = bevelThickness * t;
 		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
 		// contract shape
 		for ( i = 0, il = contour.length; i < il; i++ ) {
 		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++) {
 	for (b=1; b <= bevelSegments; b++) {
 		
 		
 			t =  b / bevelSegments;
 			t =  b / bevelSegments;
@@ -240,8 +245,18 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 
 
 				ahole = holes[h];
 				ahole = holes[h];
 				for ( i = 0, il = ahole.length; i < il; i++ ) {
 				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
 	// Bottom faces
-	if ( bevelEnabled ) {
+	if (true||  bevelEnabled ) {
 		
 		
 		
 		
-		var layer = steps + 1;
+		var layer = 0 ; //steps + 1
 		var offset = vlen * layer;
 		var offset = vlen * layer;
 		
 		
 		for ( i = 0; i < flen; i++ ) {
 		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;
 		offset = vlen * layer;
 		
 		
 		// Top faces
 		// Top faces
@@ -344,15 +359,47 @@ THREE.ExtrudeGeometry = function( shape, options ) {
 	
 	
 			var s = 0;
 			var s = 0;
 
 
-			for ( ; s < (steps + bevelSegments* 2) ; s++ ) {
+			for ( ; s < (steps  + bevelSegments * 2) ; s++ ) {
 
 
 				var slen1 = vlen * s;
 				var slen1 = vlen * s;
 				var slen2 = vlen * ( s + 1 );
 				var slen2 = vlen * ( s + 1 );
+		
+				
 
 
 				f4( layeroffset + j + slen1, layeroffset + k + slen1, layeroffset + k + slen2, layeroffset + j + slen2 );
 				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 ) {
 	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 ) );
 
 
 	}
 	}