Browse Source

THREE.Path.prototype.toShapes: 1) Bugfix: if all subpaths have the same wrong winding order; 2) new optional parameter: noHoles

Juergen Ahting 11 years ago
parent
commit
d2f632e9ab
1 changed files with 81 additions and 33 deletions
  1. 81 33
      src/extras/core/Path.js

+ 81 - 33
src/extras/core/Path.js

@@ -436,9 +436,80 @@ THREE.Path.prototype.getPoints = function( divisions, closedPath ) {
 
 };
 
+//
 // Breaks path into shapes
+//
+//	Assumptions (if parameter isCCW==true the opposite holds):
+//	- solid shapes are defined clockwise (CW)
+//	- holes are defined counterclockwise (CCW)
+//
+//	If parameter noHoles==true:
+//  - all subPaths are regarded as solid shapes
+//  - definition order CW/CCW has no relevance
+//
 
-THREE.Path.prototype.toShapes = function( isCCW ) {
+THREE.Path.prototype.toShapes = function( isCCW, noHoles ) {
+
+	function extractSubpaths( inActions ) {
+
+		var i, il, item, action, args;
+
+		var subPaths = [], lastPath = new THREE.Path();
+
+		for ( i = 0, il = inActions.length; i < il; i ++ ) {
+
+			item = inActions[ i ];
+
+			args = item.args;
+			action = item.action;
+
+			if ( action == THREE.PathActions.MOVE_TO ) {
+
+				if ( lastPath.actions.length != 0 ) {
+
+					subPaths.push( lastPath );
+					lastPath = new THREE.Path();
+
+				}
+
+			}
+
+			lastPath[ action ].apply( lastPath, args );
+
+		}
+
+		if ( lastPath.actions.length != 0 ) {
+
+			subPaths.push( lastPath );
+
+		}
+
+		// console.log(subPaths);
+
+		return	subPaths;
+	}
+
+	function toShapesNoHoles( inSubpaths ) {
+
+		var i, il;
+		var tmpPath, tmpShape;
+		var shapes = [];
+
+		for ( i = 0, il = inSubpaths.length; i < il; i ++ ) {
+
+			tmpPath = inSubpaths[ i ];
+
+			tmpShape = new THREE.Shape();
+			tmpShape.actions = tmpPath.actions;
+			tmpShape.curves = tmpPath.curves;
+
+			shapes.push( tmpShape );
+		}
+
+		//console.log("shape", shapes);
+
+		return shapes;
+	};
 
 	function isPointInsidePolygon( inPt, inPolygon ) {
 		var EPSILON = 0.0000000001;
@@ -485,41 +556,12 @@ THREE.Path.prototype.toShapes = function( isCCW ) {
 		return	inside;
 	}
 
-	var i, il, item, action, args;
-
-	var subPaths = [], lastPath = new THREE.Path();
-
-	for ( i = 0, il = this.actions.length; i < il; i ++ ) {
-
-		item = this.actions[ i ];
-
-		args = item.args;
-		action = item.action;
-
-		if ( action == THREE.PathActions.MOVE_TO ) {
-
-			if ( lastPath.actions.length != 0 ) {
-
-				subPaths.push( lastPath );
-				lastPath = new THREE.Path();
-
-			}
-
-		}
-
-		lastPath[ action ].apply( lastPath, args );
-
-	}
-
-	if ( lastPath.actions.length != 0 ) {
 
-		subPaths.push( lastPath );
-
-	}
+	var subPaths = extractSubpaths( this.actions );
+	if ( subPaths.length == 0 ) return [];
 
-	// console.log(subPaths);
+	if ( noHoles )	return	toShapesNoHoles( subPaths );
 
-	if ( subPaths.length == 0 ) return [];
 
 	var solid, tmpPath, tmpShape, shapes = [];
 
@@ -548,6 +590,8 @@ THREE.Path.prototype.toShapes = function( isCCW ) {
 	newShapes[mainIdx] = undefined;
 	newShapeHoles[mainIdx] = [];
 
+	var i, il;
+
 	for ( i = 0, il = subPaths.length; i < il; i ++ ) {
 
 		tmpPath = subPaths[ i ];
@@ -578,6 +622,10 @@ THREE.Path.prototype.toShapes = function( isCCW ) {
 
 	}
 
+	// only Holes? -> probably all Shapes with wrong orientation
+	if ( !newShapes[0] )	return	toShapesNoHoles( subPaths );
+
+
 	if ( newShapes.length > 1 ) {
 		var ambigious = false;
 		var toChange = [];