diff options
author | Valerio Virgillito | 2012-03-13 11:15:56 -0700 |
---|---|---|
committer | Valerio Virgillito | 2012-03-13 11:15:56 -0700 |
commit | 91335d6572a611ecde7a71dbbfdb82bdb40f7e2b (patch) | |
tree | b1218ee5607151ac62cbfd92d60062de5557d618 /js/helper-classes | |
parent | f6b958360d82854bdaf51848e7fd715d1f633179 (diff) | |
parent | 7b4b068cadc0af8ec7e930e1c2b429e945f96984 (diff) | |
download | ninja-91335d6572a611ecde7a71dbbfdb82bdb40f7e2b.tar.gz |
Merge pull request #108 from pushkarjoshi/brushtool
Brushtool
Diffstat (limited to 'js/helper-classes')
-rwxr-xr-x | js/helper-classes/backup-delete/GLBrushStroke.js | 174 | ||||
-rwxr-xr-x | js/helper-classes/backup-delete/GLSubpath.js | 147 |
2 files changed, 293 insertions, 28 deletions
diff --git a/js/helper-classes/backup-delete/GLBrushStroke.js b/js/helper-classes/backup-delete/GLBrushStroke.js index 5d773c2d..26c922a3 100755 --- a/js/helper-classes/backup-delete/GLBrushStroke.js +++ b/js/helper-classes/backup-delete/GLBrushStroke.js | |||
@@ -31,6 +31,8 @@ function GLBrushStroke() { | |||
31 | //stroke information | 31 | //stroke information |
32 | this._strokeWidth = 0.0; | 32 | this._strokeWidth = 0.0; |
33 | this._strokeColor = [0.4, 0.4, 0.4, 1.0]; | 33 | this._strokeColor = [0.4, 0.4, 0.4, 1.0]; |
34 | this._secondStrokeColor = this._strokeColor; | ||
35 | this._strokeHardness = 100; | ||
34 | this._strokeMaterial; | 36 | this._strokeMaterial; |
35 | this._strokeStyle = "Solid"; | 37 | this._strokeStyle = "Solid"; |
36 | 38 | ||
@@ -39,7 +41,7 @@ function GLBrushStroke() { | |||
39 | this._WETNESS_FACTOR = 0.25; | 41 | this._WETNESS_FACTOR = 0.25; |
40 | 42 | ||
41 | //prevent extremely long paths that can take a long time to render | 43 | //prevent extremely long paths that can take a long time to render |
42 | this._MAX_ALLOWED_SAMPLES = 500; | 44 | this._MAX_ALLOWED_SAMPLES = 5000; |
43 | 45 | ||
44 | //drawing context | 46 | //drawing context |
45 | this._world = null; | 47 | this._world = null; |
@@ -79,7 +81,7 @@ function GLBrushStroke() { | |||
79 | //add the point only if it is some epsilon away from the previous point | 81 | //add the point only if it is some epsilon away from the previous point |
80 | var numPoints = this._Points.length; | 82 | var numPoints = this._Points.length; |
81 | if (numPoints>0) { | 83 | if (numPoints>0) { |
82 | var threshold = this._WETNESS_FACTOR*this._strokeWidth; | 84 | var threshold = 1;//this._WETNESS_FACTOR*this._strokeWidth; |
83 | var prevPt = this._Points[numPoints-1]; | 85 | var prevPt = this._Points[numPoints-1]; |
84 | var diffPt = [prevPt[0]-pt[0], prevPt[1]-pt[1]]; | 86 | var diffPt = [prevPt[0]-pt[0], prevPt[1]-pt[1]]; |
85 | var diffPtMag = Math.sqrt(diffPt[0]*diffPt[0] + diffPt[1]*diffPt[1]); | 87 | var diffPtMag = Math.sqrt(diffPt[0]*diffPt[0] + diffPt[1]*diffPt[1]); |
@@ -106,6 +108,8 @@ function GLBrushStroke() { | |||
106 | this.setStrokeMaterial = function (m) { this._strokeMaterial = m; } | 108 | this.setStrokeMaterial = function (m) { this._strokeMaterial = m; } |
107 | this.getStrokeColor = function () { return this._strokeColor; } | 109 | this.getStrokeColor = function () { return this._strokeColor; } |
108 | this.setStrokeColor = function (c) { this._strokeColor = c; } | 110 | this.setStrokeColor = function (c) { this._strokeColor = c; } |
111 | this.setSecondStrokeColor = function(c){this._secondStrokeColor=c;} | ||
112 | this.setStrokeHardness = function(h){this._strokeHardness=h;} | ||
109 | this.getStrokeStyle = function () { return this._strokeStyle; } | 113 | this.getStrokeStyle = function () { return this._strokeStyle; } |
110 | this.setStrokeStyle = function (s) { this._strokeStyle = s; } | 114 | this.setStrokeStyle = function (s) { this._strokeStyle = s; } |
111 | 115 | ||
@@ -133,13 +137,14 @@ function GLBrushStroke() { | |||
133 | this._Points[i][2]+=tz; | 137 | this._Points[i][2]+=tz; |
134 | } | 138 | } |
135 | } | 139 | } |
136 | 140 | ||
137 | this.computeMetaGeometry = function(){ | 141 | this.computeMetaGeometry = function(){ |
138 | if (this._dirty){ | 142 | if (this._dirty){ |
139 | var numPoints = this._Points.length; | 143 | var numPoints = this._Points.length; |
140 | 144 | ||
141 | //**** add samples to the path if needed...linear interpolation for now | 145 | //**** add samples to the path if needed...linear interpolation for now |
142 | if (numPoints>1) { | 146 | //if (numPoints>1) { |
147 | if (0){ | ||
143 | var threshold = this._WETNESS_FACTOR*this._strokeWidth; | 148 | var threshold = this._WETNESS_FACTOR*this._strokeWidth; |
144 | var prevPt = this._Points[0]; | 149 | var prevPt = this._Points[0]; |
145 | var prevIndex = 0; | 150 | var prevIndex = 0; |
@@ -171,6 +176,44 @@ function GLBrushStroke() { | |||
171 | } | 176 | } |
172 | } | 177 | } |
173 | 178 | ||
179 | //**** add samples to the long sections of the path --- Catmull-Rom spline interpolation | ||
180 | if (numPoints>1) { | ||
181 | var numInsertedPoints = 0; | ||
182 | var threshold = 5;//0.25*this._strokeWidth; //this determines whether a segment between two sample is too long | ||
183 | var prevPt = this._Points[0]; | ||
184 | for (var i=1;i<numPoints;i++){ | ||
185 | var pt = this._Points[i]; | ||
186 | var diff = [pt[0]-prevPt[0], pt[1]-prevPt[1]]; | ||
187 | var distance = Math.sqrt(diff[0]*diff[0]+diff[1]*diff[1]); | ||
188 | if (distance>threshold){ | ||
189 | //build the control polygon for the Catmull-Rom spline (prev. 2 points and next 2 points) | ||
190 | var prev = (i===1) ? i-1 : i-2; | ||
191 | var next = (i===numPoints-1) ? i : i+1; | ||
192 | var ctrlPts = [this._Points[prev], this._Points[i-1], this._Points[i], this._Points[next]]; | ||
193 | //insert points along the prev. to current point | ||
194 | var numNewPoints = Math.floor(distance/threshold); | ||
195 | for (var j=0;j<numNewPoints;j++){ | ||
196 | var param = (j+1)/(numNewPoints+1); | ||
197 | var newpt = this._CatmullRomSplineInterpolate(ctrlPts, param); | ||
198 | //insert new point before point i | ||
199 | this._Points.splice(i, 0, newpt); | ||
200 | i++; | ||
201 | numInsertedPoints++; | ||
202 | } | ||
203 | this._dirty=true; | ||
204 | } | ||
205 | prevPt=pt; | ||
206 | //update numPoints to match the new length | ||
207 | numPoints = this._Points.length; | ||
208 | |||
209 | //end this function if the numPoints has gone above the max. size specified | ||
210 | if (numPoints> this._MAX_ALLOWED_SAMPLES){ | ||
211 | console.log("leaving the resampling because numPoints is greater than limit:"+this._MAX_ALLOWED_SAMPLES); | ||
212 | break; | ||
213 | } | ||
214 | } | ||
215 | console.log("Inserted "+numInsertedPoints+" additional CatmullRom points"); | ||
216 | } | ||
174 | // *** compute the bounding box ********* | 217 | // *** compute the bounding box ********* |
175 | this._BBoxMin = [Infinity, Infinity, Infinity]; | 218 | this._BBoxMin = [Infinity, Infinity, Infinity]; |
176 | this._BBoxMax = [-Infinity, -Infinity, -Infinity]; | 219 | this._BBoxMax = [-Infinity, -Infinity, -Infinity]; |
@@ -331,7 +374,109 @@ function GLBrushStroke() { | |||
331 | } | 374 | } |
332 | */ | 375 | */ |
333 | 376 | ||
377 | /* | ||
378 | //build the stamp for the brush stroke | ||
379 | //todo get this directly from the UI | ||
380 | var t=0; | ||
381 | var numTraces = this._strokeWidth; | ||
382 | var halfNumTraces = numTraces/2; | ||
383 | var startPos = [-this._strokeWidth/2,0]; | ||
384 | var brushStamp = []; | ||
385 | |||
386 | //build an angled (calligraphic) brush stamp | ||
387 | var deltaDisplacement = [1,1];//[this._strokeWidth/numTraces, 0]; //a horizontal line brush | ||
388 | for (t=0;t<numTraces;t++){ | ||
389 | var brushPt = [startPos[0]+t*deltaDisplacement[0], startPos[1]+t*deltaDisplacement[1]]; | ||
390 | brushStamp.push(brushPt); | ||
391 | } | ||
392 | |||
393 | |||
394 | //make a circular brush stamp | ||
395 | brushStamp=[]; | ||
396 | numTraces = this._strokeWidth*Math.PI; //figure out how to | ||
397 | var radius = this._strokeWidth/2; | ||
398 | for (t=0;t<numTraces;t++) | ||
399 | { | ||
400 | var angle = Math.PI*(360*t/numTraces)/180; | ||
401 | var brushPt = [radius*Math.cos(angle), radius*Math.sin(angle)]; | ||
402 | brushStamp.push(brushPt); | ||
403 | } | ||
404 | |||
405 | // //make a square brush stamp | ||
406 | // STOPPED HERE | ||
407 | // brushStamp = []; | ||
408 | // numTraces = 4*strokeWidth; | ||
409 | // for (t=0;t<numTraces;t++){ | ||
410 | // if (t<numTraces*0.25){ | ||
411 | // var brushPt = [startPos[0]+t*deltaDisplacement[0], startPos[1]+t*deltaDisplacement[1]]; | ||
412 | // } else if (t<numTraces*0.5){ | ||
413 | // | ||
414 | // } else if (t<numTraces*0.75){ | ||
415 | // | ||
416 | // } else { | ||
417 | // | ||
418 | // } | ||
419 | // brushStamp.push(brushPt); | ||
420 | // } | ||
421 | |||
422 | for (t=0;t<numTraces;t++){ | ||
423 | var disp = [brushStamp[t][0], brushStamp[t][1]]; | ||
424 | //ctx.globalCompositeOperation = 'source-over'; | ||
425 | var distFromMiddle = Math.abs(halfNumTraces-t); | ||
426 | var alphaVal = 1.0 - (100-this._strokeHardness)*(distFromMiddle/halfNumTraces)/100; | ||
427 | alphaVal = 0.2; | ||
428 | ctx.save(); | ||
429 | ctx.lineWidth=this._strokeWidth/10;//todo figure out the correct formula for the line width | ||
430 | if (ctx.lineWidth<2) | ||
431 | ctx.lineWidth=2; | ||
432 | if (t===numTraces-1){ | ||
433 | ctx.lineWidth = 1; | ||
434 | } | ||
435 | ctx.lineJoin="bevel"; | ||
436 | ctx.lineCap="butt"; | ||
437 | //if (t<numTraces/2) | ||
438 | ctx.strokeStyle="rgba("+parseInt(255*this._strokeColor[0])+","+parseInt(255*this._strokeColor[1])+","+parseInt(255*this._strokeColor[2])+","+alphaVal+")"; | ||
439 | //else | ||
440 | // ctx.strokeStyle="rgba("+parseInt(255*this._secondStrokeColor[0])+","+parseInt(255*this._secondStrokeColor[1])+","+parseInt(255*this._secondStrokeColor[2])+","+alphaVal+")"; | ||
441 | ctx.translate(disp[0],disp[1]); | ||
442 | ctx.beginPath(); | ||
443 | ctx.moveTo(this._Points[0][0]-bboxMin[0], this._Points[0][1]-bboxMin[1]); | ||
444 | for (var i=0;i<numPoints;i++){ | ||
445 | ctx.lineTo(this._Points[i][0]-bboxMin[0], this._Points[i][1]-bboxMin[1]); | ||
446 | } | ||
447 | ctx.stroke(); | ||
448 | ctx.restore(); | ||
449 | } | ||
450 | */ | ||
451 | |||
452 | /* | ||
453 | //debugging path | ||
454 | ctx.beginPath(); | ||
455 | ctx.moveTo(this._Points[0][0]-bboxMin[0], this._Points[0][1]-bboxMin[1]); | ||
456 | for (var i=1;i<numPoints;i++){ | ||
457 | ctx.lineTo(this._Points[i][0]-bboxMin[0], this._Points[i][1]-bboxMin[1]); | ||
458 | } | ||
459 | ctx.lineWidth=1.0; | ||
460 | ctx.strokeStyle = "black"; | ||
461 | ctx.stroke(); | ||
462 | */ | ||
334 | 463 | ||
464 | var numlayers = this._strokeWidth/2; | ||