aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rwxr-xr-xjs/lib/geom/sub-path.js6
-rwxr-xr-xjs/tools/PenTool.js28
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();