diff options
-rwxr-xr-x | js/lib/geom/sub-path.js | 6 | ||||
-rwxr-xr-x | js/tools/PenTool.js | 28 |
2 files changed, 29 insertions, 5 deletions
diff --git a/js/lib/geom/sub-path.js b/js/lib/geom/sub-path.js index 7e11bb33..2ecafa1c 100755 --- a/js/lib/geom/sub-path.js +++ b/js/lib/geom/sub-path.js | |||
@@ -95,6 +95,11 @@ var GLSubpath = function GLSubpath() { | |||
95 | } | 95 | } |
96 | this.createSamples(false); //dirty bit checked in this function...will generate a polyline representation | 96 | this.createSamples(false); //dirty bit checked in this function...will generate a polyline representation |
97 | 97 | ||
98 | var numPoints = this._Samples.length; | ||
99 | if (numPoints === 0){ | ||
100 | return; //nothing to do for empty paths | ||
101 | } | ||
102 | |||
98 | //figure the size of the area we will draw into | 103 | //figure the size of the area we will draw into |
99 | var bboxWidth=0, bboxHeight=0; | 104 | var bboxWidth=0, bboxHeight=0; |
100 | bboxWidth = this._BBoxMax[0] - this._BBoxMin[0]; | 105 | bboxWidth = this._BBoxMax[0] - this._BBoxMin[0]; |
@@ -142,7 +147,6 @@ var GLSubpath = function GLSubpath() { | |||
142 | 147 | ||
143 | 148 | ||
144 | ctx.beginPath(); | 149 | ctx.beginPath(); |
145 | var numPoints = this._Samples.length; | ||
146 | ctx.moveTo(this._Samples[0][0],this._Samples[0][1]); | 150 | ctx.moveTo(this._Samples[0][0],this._Samples[0][1]); |
147 | for (var i=0;i<numPoints;i++){ | 151 | for (var i=0;i<numPoints;i++){ |
148 | ctx.lineTo(this._Samples[i][0],this._Samples[i][1]); | 152 | ctx.lineTo(this._Samples[i][0],this._Samples[i][1]); |
diff --git a/js/tools/PenTool.js b/js/tools/PenTool.js index 8abb41ef..0e3bd15c 100755 --- a/js/tools/PenTool.js +++ b/js/tools/PenTool.js | |||
@@ -726,17 +726,23 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
726 | }, | 726 | }, |
727 | 727 | ||
728 | //prepare the selected subpath | 728 | //prepare the selected subpath |
729 | // convert the anchor points to stage world space (assume that's already the case if there is no subpath canvas) | ||
730 | // compute the center of the future canvas of this subpath in stage world space | 729 | // compute the center of the future canvas of this subpath in stage world space |
731 | // convert the anchor points from stage world to local space of the canvas | 730 | // compute local coordinates for the subpath (in case it does not have a canvas) |
732 | PrepareSelectedSubpathForRendering: { | 731 | PrepareSelectedSubpathForRendering: { |
733 | value: function(){ | 732 | value: function(){ |
734 | var i=0,d=0; | 733 | var i=0,d=0; |
735 | var currAnchor = null; | 734 | var currAnchor = null; |
736 | var xAdjustment = snapManager.getStageWidth()*0.5; | 735 | var xAdjustment = snapManager.getStageWidth()*0.5; |
737 | var yAdjustment = snapManager.getStageHeight()*0.5; | 736 | var yAdjustment = snapManager.getStageHeight()*0.5; |
737 | var swPos=null, swPrev=null, swNext=null; | ||
738 | var localPos=null, localPrev=null, localNext=null; | ||
738 | 739 | ||
739 | var numAnchors = this._selectedSubpath.getNumAnchors(); | 740 | var numAnchors = this._selectedSubpath.getNumAnchors(); |
741 | if (numAnchors<2){ | ||
742 | return;//nothing to do | ||
743 | } | ||
744 | this._selectedSubpath.makeDirty(); | ||
745 | |||
740 | var bboxMin=null, bboxMax=null; | 746 | var bboxMin=null, bboxMax=null; |
741 | if (this._selectedSubpathCanvas) { | 747 | if (this._selectedSubpathCanvas) { |
742 | //if there already is a subpath canvas, it means the anchor points are in local space | 748 | //if there already is a subpath canvas, it means the anchor points are in local space |
@@ -779,10 +785,24 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
779 | bboxMax = this._selectedSubpath.getBBoxMax(); | 785 | bboxMax = this._selectedSubpath.getBBoxMax(); |
780 | this._selectedSubpathCanvasCenter = VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5); | 786 | this._selectedSubpathCanvasCenter = VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5); |
781 | 787 | ||
782 | //todo convert the path points into local coordinates | 788 | //convert the path points into local coordinates by multiplying by the inverse of the plane mat |
783 | 789 | for (i=0;i<numAnchors;i++){ | |
790 | currAnchor = this._selectedSubpath.getAnchor(i); | ||
791 | swPos = [currAnchor.getPosX()-xAdjustment,currAnchor.getPosY()-yAdjustment,currAnchor.getPosZ()]; | ||
792 | swPrev = [currAnchor.getPrevX()-xAdjustment,currAnchor.getPrevY()-yAdjustment,currAnchor.getPrevZ()]; | ||
793 | swNext = [currAnchor.getNextX()-xAdjustment,currAnchor.getNextY()-yAdjustment,currAnchor.getNextZ()]; | ||
794 | var planeMatInv = glmat4.inverse(this._selectedSubpathPlaneMat, []); | ||
795 | localPos = MathUtils.transformAndDivideHomogeneousPoint(swPos, planeMatInv); | ||
796 | localPrev = MathUtils.transformAndDivideHomogeneousPoint(swPrev, planeMatInv); | ||
797 | localNext = MathUtils.transformAndDivideHomogeneousPoint(swNext, planeMatInv); | ||
798 | currAnchor.setPos(localPos[0],localPos[1],localPos[2]); | ||
799 | currAnchor.setPrevPos(localPrev[0],localPrev[1],localPrev[2]); | ||
800 | currAnchor.setNextPos(localNext[0],localNext[1],localNext[2]); | ||
801 | } | ||
784 | } | 802 | } |
785 | 803 | ||
804 | //todo MISSING: sandwich the planeMat between with the translation to the previous center of the canvas in local space and its inverse | ||
805 | |||
786 | this._selectedSubpath.makeDirty(); | 806 | this._selectedSubpath.makeDirty(); |
787 | this._selectedSubpath.createSamples(false); | 807 | this._selectedSubpath.createSamples(false); |
788 | this._selectedSubpath.offsetPerBBoxMin(); | 808 | this._selectedSubpath.offsetPerBBoxMin(); |