diff options
Diffstat (limited to 'js/tools')
-rwxr-xr-x | js/tools/PenTool.js | 49 |
1 files changed, 22 insertions, 27 deletions
diff --git a/js/tools/PenTool.js b/js/tools/PenTool.js index 7263bf52..765d4589 100755 --- a/js/tools/PenTool.js +++ b/js/tools/PenTool.js | |||
@@ -71,10 +71,6 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
71 | // todo this might be unnecessary as we can get this from element mediator (but that may be slow) | 71 | // todo this might be unnecessary as we can get this from element mediator (but that may be slow) |
72 | _selectedSubpathPlaneMat: { value: null, writable: true }, | 72 | _selectedSubpathPlaneMat: { value: null, writable: true }, |
73 | 73 | ||
74 | //bbox of the selected subpath in local coordinates | ||
75 | // (used for id-ing when the local center has shifted, i.e. the bbox of the subpath has grown) | ||
76 | _selectedSubpathLocalCenter: {value: null, writable: true}, | ||
77 | |||
78 | //the center of the subpath center in stageworld space | 74 | //the center of the subpath center in stageworld space |
79 | _selectedSubpathCanvasCenter: {value: null, writable: true}, | 75 | _selectedSubpathCanvasCenter: {value: null, writable: true}, |
80 | 76 | ||
@@ -228,7 +224,6 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
228 | this._selectedSubpath = new SubPath(); | 224 | this._selectedSubpath = new SubPath(); |
229 | this._selectedSubpathCanvas = null; | 225 | this._selectedSubpathCanvas = null; |
230 | this._selectedSubpathPlaneMat = null; | 226 | this._selectedSubpathPlaneMat = null; |
231 | this._selectedSubpathLocalCenter = null; | ||
232 | this._isNewPath = true; | 227 | this._isNewPath = true; |
233 | 228 | ||
234 | if (this._entryEditMode === this.ENTRY_SELECT_PATH){ | 229 | if (this._entryEditMode === this.ENTRY_SELECT_PATH){ |
@@ -411,6 +406,9 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
411 | return; | 406 | return; |
412 | } | 407 | } |
413 | 408 | ||
409 | if (!this._selectedSubpath ){ | ||
410 | return; //nothing to do in case no subpath is selected | ||
411 | } | ||
414 | //clear the canvas before we draw anything else | 412 | //clear the canvas before we draw anything else |
415 | this.application.ninja.stage.clearDrawingCanvas(); | 413 | this.application.ninja.stage.clearDrawingCanvas(); |
416 | this._hoveredAnchorIndex = -1; | 414 | this._hoveredAnchorIndex = -1; |
@@ -426,16 +424,12 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
426 | } | 424 | } |
427 | 425 | ||
428 | var hitRec = this.getHitRecord(event.pageX, event.pageY, false); | 426 | var hitRec = this.getHitRecord(event.pageX, event.pageY, false); |
429 | 427 | var drawingCanvas = this._selectedSubpath.getCanvas(); | |
430 | var drawingCanvas=null, globalMousePos=null, localMousePos=null; | 428 | if (!drawingCanvas){ |
431 | if (this._selectedSubpath ){ | 429 | drawingCanvas = ViewUtils.getStageElement(); |
432 | drawingCanvas = this._selectedSubpath.getCanvas(); | ||
433 | if (!drawingCanvas){ | ||
434 | drawingCanvas = ViewUtils.getStageElement(); | ||
435 | } | ||
436 | globalMousePos = hitRec.getScreenPoint(); | ||
437 | localMousePos = ViewUtils.globalToLocal(globalMousePos, drawingCanvas); | ||
438 | } | 430 | } |
431 | var globalMousePos = hitRec.getScreenPoint(); | ||
432 | var localMousePos = ViewUtils.globalToLocal(globalMousePos, drawingCanvas); | ||
439 | 433 | ||
440 | if (this._isDrawing) { | 434 | if (this._isDrawing) { |
441 | //if there is a selected subpath with a selected anchor point | 435 | //if there is a selected subpath with a selected anchor point |
@@ -768,16 +762,14 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
768 | var bboxMid = VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5); | 762 | var bboxMid = VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5); |
769 | 763 | ||
770 | //sandwich the planeMat between with the translation to the previous center of the canvas in local space and its inverse | 764 | //sandwich the planeMat between with the translation to the previous center of the canvas in local space and its inverse |
771 | if (this._selectedSubpathLocalCenter) { | 765 | var centerDisp = VecUtils.vecSubtract(3, bboxMid, this._selectedSubpath.getCanvasCenterLocalCoord()); |
772 | var centerDisp = VecUtils.vecSubtract(3, bboxMid, this._selectedSubpathLocalCenter); | 766 | var tMat = Matrix.Translation([centerDisp[0], centerDisp[1],centerDisp[2]]); |
773 | var tMat = Matrix.Translation([centerDisp[0], centerDisp[1],centerDisp[2]]); | 767 | var tInvMat = Matrix.Translation([-centerDisp[0], -centerDisp[1], -centerDisp[2]]); |
774 | var tInvMat = Matrix.Translation([-centerDisp[0], -centerDisp[1], -centerDisp[2]]); | 768 | var newMat = Matrix.I(4); |
775 | var newMat = Matrix.I(4); | 769 | glmat4.multiply( tInvMat, this._selectedSubpathPlaneMat, newMat); |
776 | glmat4.multiply( tInvMat, this._selectedSubpathPlaneMat, newMat); | 770 | glmat4.multiply( newMat, tMat, newMat); |
777 | glmat4.multiply( newMat, tMat, newMat); | 771 | this._selectedSubpathPlaneMat = newMat; |
778 | this._selectedSubpathPlaneMat = newMat; | 772 | ViewUtils.setMatrixForElement(this._selectedSubpathCanvas, newMat, true); |
779 | ViewUtils.setMatrixForElement(this._selectedSubpathCanvas, newMat, true); | ||
780 | } | ||
781 | 773 | ||
782 | var localToStageWorldMat = ViewUtils.getLocalToStageWorldMatrix(this._selectedSubpathCanvas, false, false); | 774 | var localToStageWorldMat = ViewUtils.getLocalToStageWorldMatrix(this._selectedSubpathCanvas, false, false); |
783 | this._selectedSubpathCanvasCenter = MathUtils.transformAndDivideHomogeneousPoint(bboxMid, localToStageWorldMat); | 775 | this._selectedSubpathCanvasCenter = MathUtils.transformAndDivideHomogeneousPoint(bboxMid, localToStageWorldMat); |
@@ -810,11 +802,11 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
810 | this._selectedSubpath.makeDirty(); | 802 | this._selectedSubpath.makeDirty(); |
811 | this._selectedSubpath.createSamples(false); | 803 | this._selectedSubpath.createSamples(false); |
812 | this._selectedSubpath.offsetPerBBoxMin(); | 804 | this._selectedSubpath.offsetPerBBoxMin(); |
813 | bboxMin = this._selectedSubpath.getBBoxMin(); | ||
814 | bboxMax = this._selectedSubpath.getBBoxMax(); | ||
815 | 805 | ||
816 | //compute and store the center of the bbox in local space | 806 | //compute and store the center of the bbox in local space |
817 | this._selectedSubpathLocalCenter = VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5); | 807 | bboxMin = this._selectedSubpath.getBBoxMin(); |
808 | bboxMax = this._selectedSubpath.getBBoxMax(); | ||
809 | this._selectedSubpath.setCanvasCenterLocalCoord(VecUtils.vecInterpolate(3, bboxMin, bboxMax, 0.5)); | ||
818 | } | 810 | } |
819 | }, | 811 | }, |
820 | 812 | ||
@@ -852,6 +844,9 @@ exports.PenTool = Montage.create(ShapeTool, { | |||
852 | this._selectedSubpathPlaneMat = null; | 844 | this._selectedSubpathPlaneMat = null; |
853 | this._snapTargetIndex = -1; | 845 | this._snapTargetIndex = -1; |
854 | this._selectedSubpath = null; | 846 | this._selectedSubpath = null; |
847 | if (this._entryEditMode === this.ENTRY_SELECT_PATH){ | ||
848 | this._entryEditMode = this.ENTRY_SELECT_NONE; | ||
849 | } | ||
855 | this.application.ninja.stage.clearDrawingCanvas(); | 850 | this.application.ninja.stage.clearDrawingCanvas(); |
856 | } | 851 | } |
857 | }, | 852 | }, |