diff options
Diffstat (limited to 'js')
-rwxr-xr-x | js/helper-classes/RDGE/GLBrushStroke.js | 108 | ||||
-rw-r--r--[-rwxr-xr-x] | js/tools/BrushTool.js | 176 |
2 files changed, 195 insertions, 89 deletions
diff --git a/js/helper-classes/RDGE/GLBrushStroke.js b/js/helper-classes/RDGE/GLBrushStroke.js index fdf1595c..8fb6ab25 100755 --- a/js/helper-classes/RDGE/GLBrushStroke.js +++ b/js/helper-classes/RDGE/GLBrushStroke.js | |||
@@ -67,7 +67,23 @@ function GLBrushStroke() { | |||
67 | 67 | ||
68 | this.getNumPoints = function () { return this._Points.length; } | 68 | this.getNumPoints = function () { return this._Points.length; } |
69 | this.getPoint = function (index) { return this._Points[index]; } | 69 | this.getPoint = function (index) { return this._Points[index]; } |
70 | this.addPoint = function (anchorPt) { this._Points.push(anchorPt); this._dirty=true; } | 70 | this.addPoint = function (pt) |
71 | { | ||
72 | //add the point if it is some epsilon away from the previous point | ||
73 | var doAddPoint=true; | ||
74 | var numPoints = this._Points.length; | ||
75 | if (numPoints>0) { | ||
76 | var prevPt = this._Points[numPoints-1]; | ||
77 | var diffPt = [prevPt[0]-pt[0], prevPt[1]-pt[1]]; | ||
78 | var diffPtMag = diffPt[0]*diffPt[0] + diffPt[1]*diffPt[1]; | ||
79 | if (diffPtMag<16)//TODO hook this up to the variable that measures flow/wetness of the paint brush...a smaller number-> more samples | ||
80 | doAddPoint=false; | ||
81 | } | ||
82 | if (doAddPoint) { | ||
83 | this._Points.push(pt); | ||
84 | this._dirty=true; | ||
85 | } | ||
86 | } | ||
71 | this.insertPoint = function(pt, index){ this._Points.splice(index, 0, pt); this._dirty=true;} | 87 | this.insertPoint = function(pt, index){ this._Points.splice(index, 0, pt); this._dirty=true;} |
72 | this.isDirty = function(){return this._dirty;} | 88 | this.isDirty = function(){return this._dirty;} |
73 | this.makeDirty = function(){this._dirty=true;} | 89 | this.makeDirty = function(){this._dirty=true;} |
@@ -167,7 +183,8 @@ function GLBrushStroke() { | |||
167 | var bboxWidth = bboxMax[0] - bboxMin[0]; | 183 | var bboxWidth = bboxMax[0] - bboxMin[0]; |
168 | var bboxHeight = bboxMax[1] - bboxMin[1]; | 184 | var bboxHeight = bboxMax[1] - bboxMin[1]; |
169 | ctx.clearRect(0, 0, bboxWidth, bboxHeight); | 185 | ctx.clearRect(0, 0, bboxWidth, bboxHeight); |
170 | /* | 186 | |
187 | /* | ||
171 | ctx.lineWidth = this._strokeWidth; | 188 | ctx.lineWidth = this._strokeWidth; |
172 | ctx.strokeStyle = "black"; | 189 | ctx.strokeStyle = "black"; |
173 | if (this._strokeColor) | 190 | if (this._strokeColor) |
@@ -185,7 +202,91 @@ function GLBrushStroke() { | |||
185 | ctx.lineTo(pt[0]-bboxMin[0], pt[1]-bboxMin[1]); | 202 | ctx.lineTo(pt[0]-bboxMin[0], pt[1]-bboxMin[1]); |
186 | } | 203 | } |
187 | ctx.stroke(); | 204 | ctx.stroke(); |
188 | */ | 205 | */ |
206 | |||
207 | var isDebug = false; | ||
208 | var prevPt = this._Points[0]; | ||
209 | var prevX = prevPt[0]-bboxMin[0]; | ||
210 | var prevY = prevPt[1]-bboxMin[1]; | ||
211 | prevPt = [prevX,prevY]; | ||
212 | for (var i = 1; i < numPoints; i++) { | ||
213 | var pt = this._Points[i]; | ||
214 | ctx.globalCompositeOperation = 'source-over'; | ||
215 | var x = pt[0]-bboxMin[0]; | ||
216 | var y = pt[1]-bboxMin[1]; | ||
217 | pt = [x,y]; | ||
218 | |||
219 | //vector from prev to current pt | ||
220 | var seg = VecUtils.vecSubtract(2, pt, prevPt); | ||
221 | var segDir = VecUtils.vecNormalize(2, seg, 1.0); | ||
222 | |||
223 | var segMidPt = VecUtils.vecInterpolate(2, pt, prevPt, 0.5); | ||
224 | var w2 = this._strokeWidth*0.5; | ||
225 | var segDirOrtho = [w2*segDir[1], -w2*segDir[0]]; | ||
226 | |||
227 | //add half the strokewidth to the segMidPt | ||
228 | var lgStart = VecUtils.vecAdd(2, segMidPt, segDirOrtho); | ||
229 | var lgEnd = VecUtils.vecSubtract(2, segMidPt, segDirOrtho); | ||
230 | |||
231 | ctx.save(); | ||
232 | ctx.beginPath(); | ||
233 | |||
234 | if (isDebug) { | ||
235 | ctx.strokeStyle="black"; | ||
236 | ctx.lineWidth = 1; | ||
237 | |||
238 | ctx.moveTo(lgStart[0], lgStart[1]); | ||
239 | ctx.lineTo(lgEnd[0], lgEnd[1]); | ||
240 | ctx.stroke(); | ||
241 | } | ||
242 | |||
243 | var lg = ctx.createLinearGradient(lgStart[0], lgStart[1], lgEnd[0], lgEnd[1]); | ||
244 | lg.addColorStop(1, 'rgba(0,0,0,0.0)'); | ||
245 | lg.addColorStop(0.5,'rgba(255,0,0,1.0)'); | ||
246 | lg.addColorStop(0, 'rgba(0,0,0,0.0)'); | ||
247 | ctx.fillStyle = lg; | ||
248 | |||
249 | if (isDebug){ | ||
250 | ctx.strokeStyle="blue"; | ||
251 | ctx.lineWidth=0.5; | ||
252 | } | ||
253 | ctx.moveTo(prevX-w2, prevY); | ||
254 | ctx.lineTo(prevX+w2, prevY); | ||
255 | ctx.lineTo(x+w2, y); | ||
256 | ctx.lineTo(x-w2, y); | ||
257 | ctx.lineTo(prevX-w2, prevY); | ||
258 | ctx.fill(); | ||
259 | ctx.closePath(); | ||
260 | |||
261 | ctx.restore(); | ||
262 | |||
263 | prevPt = pt; | ||
264 | prevX = x; | ||
265 | prevY = y; | ||
266 | } | ||
267 | |||
268 | |||
269 | if (isDebug) | ||
270 | ctx.stroke(); | ||
271 | |||
272 | if (isDebug){ | ||
273 | //draw the skeleton of this stroke | ||
274 | ctx.lineWidth = 1; | ||
275 | ctx.strokeStyle = "black"; | ||
276 | var pt = this._Points[0]; | ||
277 | ctx.beginPath(); | ||
278 | ctx.moveTo(pt[0]-bboxMin[0],pt[1]-bboxMin[1]); | ||
279 | for (var i = 1; i < numPoints; i++) { | ||
280 | pt = this._Points[i]; | ||
281 | var x = pt[0]-bboxMin[0]; | ||
282 | var y = pt[1]-bboxMin[1]; | ||
283 | ctx.lineTo(x,y); | ||
284 | } | ||
285 | ctx.stroke(); | ||
286 | } | ||
287 | |||
288 | |||
289 | /* | ||
189 | var R2 = this._strokeWidth; | 290 | var R2 = this._strokeWidth; |
190 | var R = R2*0.5; | 291 | var R = R2*0.5; |
191 | var hardness = 0.25; //for a pencil, this is always 1 //TODO get hardness parameter from user interface | 292 | var hardness = 0.25; //for a pencil, this is always 1 //TODO get hardness parameter from user interface |
@@ -209,6 +310,7 @@ function GLBrushStroke() { | |||
209 | //ctx.globalCompositeOperation = 'source-in'; | 310 | //ctx.globalCompositeOperation = 'source-in'; |
210 | //ctx.rect(x-R, y-R, R2, R2); | 311 | //ctx.rect(x-R, y-R, R2, R2); |
211 | } | 312 | } |
313 | */ | ||
212 | ctx.restore(); | 314 | ctx.restore(); |
213 | } //render() | 315 | } //render() |
214 | 316 | ||
diff --git a/js/tools/BrushTool.js b/js/tools/BrushTool.js index 4d44326f..9a0ad583 100755..100644 --- a/js/tools/BrushTool.js +++ b/js/tools/BrushTool.js | |||
@@ -65,12 +65,30 @@ exports.BrushTool = Montage.create(ShapeTool, { | |||
65 | if (this._selectedBrushStroke === null){ | 65 | if (this._selectedBrushStroke === null){ |
66 | this._selectedBrushStroke = new GLBrushStroke(); | 66 | this._selectedBrushStroke = new GLBrushStroke(); |
67 | } | 67 | } |
68 | console.log("BrushTool Start"); | ||
69 | NJevent("enableStageMove");//stageManagerModule.stageManager.enableMouseMove(); | 68 | NJevent("enableStageMove");//stageManagerModule.stageManager.enableMouseMove(); |
70 | } //value: function (event) { | 69 | } //value: function (event) { |
71 | }, //HandleLeftButtonDown | 70 | }, //HandleLeftButtonDown |
72 | 71 | ||
72 | _getUnsnappedPosition: { | ||
73 | value: function(x,y){ | ||
74 | var elemSnap = snapManager.elementSnapEnabled(); | ||
75 | var gridSnap = snapManager.gridSnapEnabled(); | ||
76 | var alignSnap = snapManager.snapAlignEnabled(); | ||
73 | 77 | ||
78 | snapManager.enableElementSnap(false); | ||
79 | snapManager.enableGridSnap(false); | ||
80 | snapManager.enableSnapAlign(false); | ||
81 | |||
82 | var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(x,y)); | ||
83 | var unsnappedpos = DrawingToolBase.getHitRecPos(snapManager.snap(point.x, point.y, false)); | ||
84 | |||
85 | snapManager.enableElementSnap(elemSnap); | ||
86 | snapManager.enableGridSnap(gridSnap); | ||
87 | snapManager.enableSnapAlign(alignSnap); | ||
88 | |||
89 | return unsnappedpos; | ||
90 | } | ||
91 | }, | ||
74 | //need to override this function because the ShapeTool's definition contains a clearDrawingCanvas call - Pushkar | 92 | //need to override this function because the ShapeTool's definition contains a clearDrawingCanvas call - Pushkar |
75 | // might not need to override once we draw using OpenGL instead of SVG | 93 | // might not need to override once we draw using OpenGL instead of SVG |
76 | // Also took out all the snapping code for now...need to add that back | 94 | // Also took out all the snapping code for now...need to add that back |
@@ -84,20 +102,10 @@ exports.BrushTool = Montage.create(ShapeTool, { | |||
84 | } | 102 | } |
85 | 103 | ||
86 | if (this._isDrawing) { | 104 | if (this._isDrawing) { |
87 | snapManager.enableElementSnap(false); | 105 | var currMousePos = this._getUnsnappedPosition(event.pageX, event.pageY); |
88 | snapManager.enableGridSnap(false); | ||
89 | snapManager.enableSnapAlign(false); | ||
90 | //this.doDraw(event); | ||
91 | //var currMousePos = this.getMouseUpPos(); | ||
92 | //instead of doDraw call own DrawingTool | ||
93 | var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas, new WebKitPoint(event.pageX, event.pageY)); | ||
94 | var hitRecSnapPoint = DrawingToolBase.getUpdatedSnapPointNoAppLevelEnabling(point.x, point.y, true, this.mouseDownHitRec); | ||
95 | var currMousePos = DrawingToolBase.getHitRecPos(hitRecSnapPoint); | ||
96 | |||
97 | if (this._selectedBrushStroke){ | 106 | if (this._selectedBrushStroke){ |
98 | this._selectedBrushStroke.addPoint(currMousePos); | 107 | this._selectedBrushStroke.addPoint(currMousePos); |
99 | } | 108 | } |
100 | |||
101 | this.ShowCurrentBrushStrokeOnStage(); | 109 | this.ShowCurrentBrushStrokeOnStage(); |
102 | } //if (this._isDrawing) { | 110 | } //if (this._isDrawing) { |
103 | 111 | ||
@@ -123,7 +131,6 @@ exports.BrushTool = Montage.create(ShapeTool, { | |||
123 | 131 | ||
124 | this._isDrawing = false; | 132 | this._isDrawing = false; |
125 | this._hasDraw = false; | 133 | this._hasDraw = false; |
126 | console.log("BrushTool Stop"); | ||
127 | 134 | ||
128 | //TODO get these values from the options | 135 | //TODO get these values from the options |
129 | if (this._selectedBrushStroke){ | 136 | if (this._selectedBrushStroke){ |
@@ -192,92 +199,89 @@ exports.BrushTool = Montage.create(ShapeTool, { | |||
192 | 199 | ||
193 | 200 | ||
194 | RenderShape: { | 201 | RenderShape: { |
195 | value: function (w, h, planeMat, midPt, canvas) { | 202 | value: function (w, h, planeMat, midPt, can |