diff options
Diffstat (limited to 'js/helper-classes/RDGE/GLSubpath.js')
-rw-r--r-- | js/helper-classes/RDGE/GLSubpath.js | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/js/helper-classes/RDGE/GLSubpath.js b/js/helper-classes/RDGE/GLSubpath.js index 25b12093..2e4c1631 100644 --- a/js/helper-classes/RDGE/GLSubpath.js +++ b/js/helper-classes/RDGE/GLSubpath.js | |||
@@ -155,6 +155,32 @@ function GLSubpath() { | |||
155 | return retAnchor; | 155 | return retAnchor; |
156 | } | 156 | } |
157 | 157 | ||
158 | this.deselectAnchorPoint = function(){ | ||
159 | this._selectedAnchorIndex = -1; | ||
160 | } | ||
161 | |||
162 | this.reversePath = function() { | ||
163 | var revAnchors = []; | ||
164 | var numAnchors = this._Anchors.length; | ||
165 | var lastIndex = numAnchors-1; | ||
166 | if (lastIndex<0){ | ||
167 | return; //cannot reverse empty path | ||
168 | } | ||
169 | for (var i=lastIndex;i>=0;i--) { | ||
170 | var newAnchor = new GLAnchorPoint(); | ||
171 | var oldAnchor = this._Anchors[i]; | ||
172 | newAnchor.setPos(oldAnchor.getPosX(),oldAnchor.getPosY(),oldAnchor.getPosZ()); | ||
173 | newAnchor.setPrevPos(oldAnchor.getNextX(),oldAnchor.getNextY(),oldAnchor.getNextZ()); | ||
174 | newAnchor.setNextPos(oldAnchor.getPrevX(),oldAnchor.getPrevY(),oldAnchor.getPrevZ()); | ||
175 | revAnchors.push(newAnchor); | ||
176 | } | ||
177 | if (this._selectedAnchorIndex >= 0){ | ||
178 | this._selectedAnchorIndex = (numAnchors-1) - this._selectedAnchorIndex; | ||
179 | } | ||
180 | this._Anchors = revAnchors; | ||
181 | this._dirty=true; | ||
182 | } | ||
183 | |||
158 | //remove all the anchor points | 184 | //remove all the anchor points |
159 | this.clearAllAnchors = function () { | 185 | this.clearAllAnchors = function () { |
160 | this._Anchors = []; | 186 | this._Anchors = []; |
@@ -220,7 +246,10 @@ function GLSubpath() { | |||
220 | //check whether the point is within the radius distance from the curve represented as a polyline in _samples | 246 | //check whether the point is within the radius distance from the curve represented as a polyline in _samples |
221 | //return the parametric distance along the curve if there is an intersection, else return null | 247 | //return the parametric distance along the curve if there is an intersection, else return null |
222 | //will assume that the BBox test is performed outside this function | 248 | //will assume that the BBox test is performed outside this function |
223 | 249 | if (endIndex<startIndex){ | |
250 | //go from startIndex to the end of the samples | ||
251 | endIndex = this._samples.length/3; | ||
252 | } | ||
224 | for (var i=startIndex; i<endIndex; i++){ | 253 | for (var i=startIndex; i<endIndex; i++){ |
225 | var seg0 = Vector.create([this._samples[3*i], this._samples[3*i + 1], this._samples[3*i + 2]]); | 254 | var seg0 = Vector.create([this._samples[3*i], this._samples[3*i + 1], this._samples[3*i + 2]]); |
226 | var j=i+1; | 255 | var j=i+1; |
@@ -334,6 +363,23 @@ function GLSubpath() { | |||
334 | return true; | 363 | return true; |
335 | } | 364 | } |
336 | 365 | ||
366 | this.pickAnchor = function (pickX, pickY, pickZ, radius) { | ||
367 | var numAnchors = this._Anchors.length; | ||
368 | var selAnchorIndex = -1; | ||
369 | var retCode = this.SEL_NONE; | ||
370 | var radSq = radius * radius; | ||
371 | var minDistance = Infinity; | ||
372 | for (var i = 0; i < numAnchors; i++) { | ||
373 | var distSq = this._Anchors[i].getDistanceSq(pickX, pickY, pickZ); | ||
374 | //check the anchor point | ||
375 | if (distSq < minDistance && distSq < radSq) { | ||
376 | selAnchorIndex = i; | ||
377 | minDistance = distSq; | ||
378 | } | ||
379 | }//for every anchor i | ||
380 | return selAnchorIndex; | ||
381 | } | ||
382 | |||
337 | //pick the path point closest to the specified location, return null if some anchor point (or its handles) is within radius, else return the parameter distance | 383 | //pick the path point closest to the specified location, return null if some anchor point (or its handles) is within radius, else return the parameter distance |
338 | this.pickPath = function (pickX, pickY, pickZ, radius) { | 384 | this.pickPath = function (pickX, pickY, pickZ, radius) { |
339 | var numAnchors = this._Anchors.length; | 385 | var numAnchors = this._Anchors.length; |
@@ -386,6 +432,7 @@ function GLSubpath() { | |||
386 | if (this._isWithinBoundingBox(point, controlPoints, radius)) { | 432 | if (this._isWithinBoundingBox(point, controlPoints, radius)) { |
387 | //var intersectParam = this._checkIntersection(controlPoints, 0.0, 1.0, point, radius); | 433 | //var intersectParam = this._checkIntersection(controlPoints, 0.0, 1.0, point, radius); |
388 | var intersectParam = this._checkIntersectionWithSamples(this._anchorSampleIndex[i], this._anchorSampleIndex[nextIndex], point, radius); | 434 | var intersectParam = this._checkIntersectionWithSamples(this._anchorSampleIndex[i], this._anchorSampleIndex[nextIndex], point, radius); |
435 | console.log("intersectParam:"+intersectParam); | ||
389 | if (intersectParam){ | 436 | if (intersectParam){ |
390 | retCode = retCode | this.SEL_PATH; | 437 | retCode = retCode | this.SEL_PATH; |
391 | retParam = intersectParam-i; //make the retParam go from 0 to 1 | 438 | retParam = intersectParam-i; //make the retParam go from 0 to 1 |
@@ -1137,6 +1184,7 @@ function GLSubpath() { | |||
1137 | this.buildBuffers = function () { | 1184 | this.buildBuffers = function () { |
1138 | if (this._useCanvasDrawing) | 1185 | if (this._useCanvasDrawing) |
1139 | return; | 1186 | return; |
1187 | |||
1140 | // get the world | 1188 | // get the world |
1141 | var world = this.getWorld(); | 1189 | var world = this.getWorld(); |
1142 | if (!world) throw ("null world in GLSubpath buildBuffers"); | 1190 | if (!world) throw ("null world in GLSubpath buildBuffers"); |
@@ -1368,7 +1416,7 @@ function GLSubpath() { | |||
1368 | ctx.strokeStyle = "black"; | 1416 | ctx.strokeStyle = "black"; |
1369 | if (this._strokeColor) | 1417 | if (this._strokeColor) |
1370 | ctx.strokeStyle = MathUtils.colorToHex( this._strokeColor ); | 1418 | ctx.strokeStyle = MathUtils.colorToHex( this._strokeColor ); |
1371 | ctx.fillStyle = "blue"; | 1419 | ctx.fillStyle = "white"; |
1372 | if (this._fillColor) | 1420 | if (this._fillColor) |
1373 | ctx.fillStyle = MathUtils.colorToHex( this._fillColor ); | 1421 | ctx.fillStyle = MathUtils.colorToHex( this._fillColor ); |
1374 | var lineCap = ['butt','round','square']; | 1422 | var lineCap = ['butt','round','square']; |
@@ -1386,8 +1434,11 @@ function GLSubpath() { | |||
1386 | ctx.bezierCurveTo(prevAnchor.getNextX()-bboxMin[0],prevAnchor.getNextY()-bboxMin[1], currAnchor.getPrevX()-bboxMin[0], currAnchor.getPrevY()-bboxMin[1], currAnchor.getPosX()-bboxMin[0], currAnchor.getPosY()-bboxMin[1]); | 1434 | ctx.bezierCurveTo(prevAnchor.getNextX()-bboxMin[0],prevAnchor.getNextY()-bboxMin[1], currAnchor.getPrevX()-bboxMin[0], currAnchor.getPrevY()-bboxMin[1], currAnchor.getPosX()-bboxMin[0], currAnchor.getPosY()-bboxMin[1]); |
1387 | prevAnchor = currAnchor; | 1435 | prevAnchor = currAnchor; |
1388 | } | 1436 | } |
1437 | if (this._isClosed){ | ||
1438 | ctx.fill(); | ||
1439 | } | ||
1389 | ctx.stroke(); | 1440 | ctx.stroke(); |
1390 | //ctx.fill(); | 1441 | |
1391 | 1442 | ||
1392 | 1443 | ||
1393 | 1444 | ||