|
@@ -436,9 +436,80 @@ THREE.Path.prototype.getPoints = function( divisions, closedPath ) {
|
|
|
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+//
|
|
// Breaks path into shapes
|
|
// 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 ) {
|
|
function isPointInsidePolygon( inPt, inPolygon ) {
|
|
var EPSILON = 0.0000000001;
|
|
var EPSILON = 0.0000000001;
|
|
@@ -485,41 +556,12 @@ THREE.Path.prototype.toShapes = function( isCCW ) {
|
|
return inside;
|
|
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 = [];
|
|
var solid, tmpPath, tmpShape, shapes = [];
|
|
|
|
|
|
@@ -548,6 +590,8 @@ THREE.Path.prototype.toShapes = function( isCCW ) {
|
|
newShapes[mainIdx] = undefined;
|
|
newShapes[mainIdx] = undefined;
|
|
newShapeHoles[mainIdx] = [];
|
|
newShapeHoles[mainIdx] = [];
|
|
|
|
|
|
|
|
+ var i, il;
|
|
|
|
+
|
|
for ( i = 0, il = subPaths.length; i < il; i ++ ) {
|
|
for ( i = 0, il = subPaths.length; i < il; i ++ ) {
|
|
|
|
|
|
tmpPath = subPaths[ 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 ) {
|
|
if ( newShapes.length > 1 ) {
|
|
var ambigious = false;
|
|
var ambigious = false;
|
|
var toChange = [];
|
|
var toChange = [];
|