diff options
Diffstat (limited to 'js/helper-classes/3D/snap-manager.js')
-rwxr-xr-x | js/helper-classes/3D/snap-manager.js | 78 |
1 files changed, 48 insertions, 30 deletions
diff --git a/js/helper-classes/3D/snap-manager.js b/js/helper-classes/3D/snap-manager.js index 372be345..cf8a91db 100755 --- a/js/helper-classes/3D/snap-manager.js +++ b/js/helper-classes/3D/snap-manager.js | |||
@@ -40,6 +40,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
40 | 40 | ||
41 | // keep a reference to the most recent hitRecord. Used for drawing feedback on the stage | 41 | // keep a reference to the most recent hitRecord. Used for drawing feedback on the stage |
42 | _lastHit : { value: null, writable: true }, | 42 | _lastHit : { value: null, writable: true }, |
43 | _hitRecords : { value: [], writable: true }, | ||
43 | 44 | ||
44 | // keep a list of objects to avoid snapping to | 45 | // keep a list of objects to avoid snapping to |
45 | _avoidList : { value: [], writable: true }, | 46 | _avoidList : { value: [], writable: true }, |
@@ -210,9 +211,9 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
210 | var stage = this.getStage(); | 211 | var stage = this.getStage(); |
211 | var parentPt; | 212 | var parentPt; |
212 | if (quadPt) | 213 | if (quadPt) |
213 | parentPt = Vector.create([quadPt[0], quadPt[1], 0.0]); | 214 | parentPt = [quadPt[0], quadPt[1], 0.0]; |
214 | else | 215 | else |
215 | parentPt = Vector.create([xScreen, yScreen, 0.0]); | 216 | parentPt = [xScreen, yScreen, 0.0]; |
216 | var vec = viewUtils.parentToChildVec(parentPt, stage); | 217 | var vec = viewUtils.parentToChildVec(parentPt, stage); |
217 | if (vec) | 218 | if (vec) |
218 | { | 219 | { |
@@ -274,6 +275,11 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
274 | } //if (hitRecArray.length == 0) | 275 | } //if (hitRecArray.length == 0) |
275 | 276 | ||
276 | var rtnHit; | 277 | var rtnHit; |
278 | |||
279 | // Save reference to hit records to verify last hit record's element matches browser's elementFromPoint | ||
280 | this._hitRecords.length = 0; | ||
281 | this._hitRecords = hitRecArray; | ||
282 | |||
277 | if (hitRecArray.length > 0) | 283 | if (hitRecArray.length > 0) |
278 | { | 284 | { |
279 | this.sortHitRecords( hitRecArray ); | 285 | this.sortHitRecords( hitRecArray ); |
@@ -315,7 +321,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
315 | 321 | ||
316 | // get the point to the lower left of the plane point and | 322 | // get the point to the lower left of the plane point and |
317 | // see if it falls within the snap distance | 323 | // see if it falls within the snap distance |
318 | var origin = Vector.create( [-0.5*this.getStageWidth(), -0.5*this.getStageHeight()] ); | 324 | var origin = [-0.5*this.getStageWidth(), -0.5*this.getStageHeight()]; |
319 | var planePt = hitRec.getLocalPoint(); | 325 | var planePt = hitRec.getLocalPoint(); |
320 | var dToOrigin = MathUtils.vecSubtract(planePt, origin); | 326 | var dToOrigin = MathUtils.vecSubtract(planePt, origin); |
321 | var nx = Math.floor( dToOrigin[0]/dx), | 327 | var nx = Math.floor( dToOrigin[0]/dx), |
@@ -332,11 +338,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
332 | return false; | 338 | return false; |
333 | } | 339 | } |
334 | 340 | ||
335 | var pt00 = Vector.create( [ | 341 | var pt00 = [ origin[0] + nx*dx, origin[1] + ny*dy, 0.0 ]; |
336 | origin[0] + nx*dx, | ||
337 | origin[1] + ny*dy, | ||
338 | 0.0 | ||
339 | ] ); | ||
340 | var planeMat = hitRec.getPlaneMatrix(); | 342 | var planeMat = hitRec.getPlaneMatrix(); |
341 | var scrPt2 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(pt00,planeMat), stage ); | 343 | var scrPt2 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(pt00,planeMat), stage ); |
342 | scrPt2 = MathUtils.makeDimension3( scrPt2 ); | 344 | scrPt2 = MathUtils.makeDimension3( scrPt2 ); |
@@ -360,11 +362,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
360 | return true; | 362 | return true; |
361 | 363 | ||
362 | // check the far corner point and 2 edges out from it | 364 | // check the far corner point and 2 edges out from it |
363 | var pt11 = Vector.create( [ | 365 | var pt11 = [ origin[0] + (nx+1)*dx, origin[1] + (ny+1)*dy, 0.0 ]; |
364 | origin[0] + (nx+1)*dx, | ||
365 | origin[1] + (ny+1)*dy, | ||
366 | 0.0 | ||
367 | ] ); | ||
368 | var scrPt4 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(pt11,planeMat), stage ); | 366 | var scrPt4 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(pt11,planeMat), stage ); |
369 | scrPt4 = MathUtils.makeDimension3( scrPt4 ); | 367 | scrPt4 = MathUtils.makeDimension3( scrPt4 ); |
370 | scrPt4 = vecUtils.vecAdd(3, viewUtils.viewToScreen( MathUtils.transformPoint(scrPt4, stageMat) ), offset ); | 368 | scrPt4 = vecUtils.vecAdd(3, viewUtils.viewToScreen( MathUtils.transformPoint(scrPt4, stageMat) ), offset ); |
@@ -414,11 +412,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
414 | horizontalLineCount = 2; | 412 | horizontalLineCount = 2; |
415 | } | 413 | } |
416 | 414 | ||
417 | var edgePt = Vector.create( [ | 415 | var edgePt = [ gridOrigin[0] + nx*dx, gridOrigin[1] + ny*dy, 0.0 ]; |
418 | gridOrigin[0] + nx*dx, | ||
419 | gridOrigin[1] + ny*dy, | ||
420 | 0.0 | ||
421 | ] ); | ||
422 | var scrPt2 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(edgePt,planeMat), stage ); | 416 | var scrPt2 = viewUtils.postViewToStageWorld( MathUtils.transformPoint(edgePt,planeMat), stage ); |
423 | scrPt2 = MathUtils.makeDimension3( scrPt2 ); | 417 | scrPt2 = MathUtils.makeDimension3( scrPt2 ); |
424 | scrPt2 = vecUtils.vecAdd(3, viewUtils.viewToScreen( MathUtils.transformPoint(scrPt2, stageMat) ), offset ); | 418 | scrPt2 = vecUtils.vecAdd(3, viewUtils.viewToScreen( MathUtils.transformPoint(scrPt2, stageMat) ), offset ); |
@@ -843,7 +837,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
843 | MathUtils.makeDimension3( stageOffset ); | 837 | MathUtils.makeDimension3( stageOffset ); |
844 | 838 | ||
845 | var x = vPt[0], y = hPt[1]; | 839 | var x = vPt[0], y = hPt[1]; |
846 | var localPt = Vector.create( [x,y,0,1] ); | 840 | var localPt = [x,y,0,1]; |
847 | var viewPt = MathUtils.transformPoint( localPt, planeToViewMat ); | 841 | var viewPt = MathUtils.transformPoint( localPt, planeToViewMat ); |
848 | var scrPt = vecUtils.vecAdd(3, viewUtils.viewToScreen( viewPt ), stageOffset ); | 842 | var scrPt = vecUtils.vecAdd(3, viewUtils.viewToScreen( viewPt ), stageOffset ); |
849 | 843 | ||
@@ -1185,7 +1179,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1185 | // Calculate the local point | 1179 | // Calculate the local point |
1186 | var planeMat; | 1180 | var planeMat; |
1187 | var mat = viewUtils.getMatrixFromElement( elt ); | 1181 | var mat = viewUtils.getMatrixFromElement( elt ); |
1188 | var wp = Vector.create([0,0,1,0]); | 1182 | var wp = [0,0,1,0]; |
1189 | wp = MathUtils.transformPlane( wp, mat ); | 1183 | wp = MathUtils.transformPlane( wp, mat ); |
1190 | var wpMat = drawUtils.getPlaneToWorldMatrix(wp, MathUtils.getPointOnPlane(wp)); | 1184 | var wpMat = drawUtils.getPlaneToWorldMatrix(wp, MathUtils.getPointOnPlane(wp)); |
1191 | //var wpMatInv = wpMat.inverse(); | 1185 | //var wpMatInv = wpMat.inverse(); |
@@ -1277,7 +1271,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1277 | { | 1271 | { |
1278 | // convert to GL coordinates | 1272 | // convert to GL coordinates |
1279 | var glPt = this.globalScreenToWebGL( targetScrPt, elt ); | 1273 | var glPt = this.globalScreenToWebGL( targetScrPt, elt ); |
1280 | var eyePt = Vector.create( [0, 0, world.getViewDistance()] ); | 1274 | var eyePt = [0, 0, world.getViewDistance()]; |
1281 | var dir = vecUtils.vecSubtract(3, glPt, eyePt); | 1275 | var dir = vecUtils.vecSubtract(3, glPt, eyePt); |
1282 | 1276 | ||
1283 | // recursively go through the tree testing all objects | 1277 | // recursively go through the tree testing all objects |
@@ -1528,7 +1522,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1528 | viewUtils.pushViewportObj( elt ); | 1522 | viewUtils.pushViewportObj( elt ); |
1529 | var cop = viewUtils.getCenterOfProjection(); | 1523 | var cop = viewUtils.getCenterOfProjection(); |
1530 | viewUtils.popViewportObj(); | 1524 | viewUtils.popViewportObj(); |
1531 | var s2v = Matrix.Translation(Vector.create([-cop[0], -cop[1], 0])); | 1525 | var s2v = Matrix.Translation([-cop[0], -cop[1], 0]); |
1532 | var vToNDC = Matrix.I(4); | 1526 | var vToNDC = Matrix.I(4); |
1533 | vToNDC[0] = 1.0/(0.5*world.getViewportWidth()); | 1527 | vToNDC[0] = 1.0/(0.5*world.getViewportWidth()); |
1534 | vToNDC[5] = 1.0/(0.5*world.getViewportHeight()); | 1528 | vToNDC[5] = 1.0/(0.5*world.getViewportHeight()); |
@@ -1566,11 +1560,11 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1566 | tmpPt2 = MathUtils.applyHomogeneousCoordinate( tmpPt2 ); | 1560 | tmpPt2 = MathUtils.applyHomogeneousCoordinate( tmpPt2 ); |
1567 | 1561 | ||
1568 | // project the 2 object space points onto the original plane of the object | 1562 | // project the 2 object space points onto the original plane of the object |
1569 | var tmpPt3 = MathUtils.vecIntersectPlane( tmpPt1, vecUtils.vecSubtract(3, tmpPt2, tmpPt1), Vector.create([0,0,1,0]) ); | 1563 | var tmpPt3 = MathUtils.vecIntersectPlane( tmpPt1, vecUtils.vecSubtract(3, tmpPt2, tmpPt1), [0,0,1,0]); |
1570 | //console.log( "object space pt: " + tmpPt3 ); | 1564 | //console.log( "object space pt: " + tmpPt3 ); |
1571 | 1565 | ||
1572 | // get the z value in NDC space of the projection plane | 1566 | // get the z value in NDC space of the projection plane |
1573 | var ndcPt = MathUtils.transformHomogeneousPoint( Vector.create( [0, 0, 0] ), glToNDC ); | 1567 | var ndcPt = MathUtils.transformHomogeneousPoint( [0, 0, 0], glToNDC ); |
1574 | ndcPt = MathUtils.applyHomogeneousCoordinate( ndcPt ); | 1568 | ndcPt = MathUtils.applyHomogeneousCoordinate( ndcPt ); |
1575 | var zNDC = ndcPt[2]; | 1569 | var zNDC = ndcPt[2]; |
1576 | 1570 | ||
@@ -1642,7 +1636,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1642 | var drawingGrid = drawUtils.isDrawingGrid(); | 1636 | var drawingGrid = drawUtils.isDrawingGrid(); |
1643 | 1637 | ||
1644 | // get the Z axis of the matrix | 1638 | // get the Z axis of the matrix |
1645 | var dir = Vector.create([mat[8], mat[9], mat[10]]); | 1639 | var dir = [mat[8], mat[9], mat[10]]; |
1646 | dir = vecUtils.vecNormalize(3, dir, 1.0); | 1640 | dir = vecUtils.vecNormalize(3, dir, 1.0); |
1647 | var x = Math.abs(dir[0]), | 1641 | var x = Math.abs(dir[0]), |
1648 | y = Math.abs(dir[1]), | 1642 | y = Math.abs(dir[1]), |
@@ -1653,7 +1647,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1653 | //x = 0; y = 0; z = 1; // X/Y plane | 1647 | //x = 0; y = 0; z = 1; // X/Y plane |
1654 | 1648 | ||
1655 | var id; | 1649 | var id; |
1656 | var plane = Vector.create([0, 0, 0, 0]); | 1650 | var plane = [0, 0, 0, 0]; |
1657 | var change = false; | 1651 | var change = false; |
1658 | if (x > y) { | 1652 | if (x > y) { |
1659 | if (x > z) { | 1653 | if (x > z) { |
@@ -1823,7 +1817,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1823 | MathUtils.makeDimension3( stageOffset ); | 1817 | MathUtils.makeDimension3( stageOffset ); |
1824 | 1818 | ||
1825 | var x = vPt[0], y = hPt[1]; | 1819 | var x = vPt[0], y = hPt[1]; |
1826 | var localPt = Vector.create( [x,y,0,1] ); | 1820 | var localPt = [x,y,0,1]; |
1827 | var planeToViewMat = this.getPlaneToViewMat(); | 1821 | var planeToViewMat = this.getPlaneToViewMat(); |
1828 | var viewPt = MathUtils.transformPoint( localPt, planeToViewMat ); | 1822 | var viewPt = MathUtils.transformPoint( localPt, planeToViewMat ); |
1829 | var scrPt = vecUtils.vecAdd(3, viewUtils.viewToScreen( viewPt ), stageOffset ); | 1823 | var scrPt = vecUtils.vecAdd(3, viewUtils.viewToScreen( viewPt ), stageOffset ); |
@@ -1872,7 +1866,7 @@ var SnapManager = exports.SnapManager = Montage.create(Component, { | |||
1872 | MathUtils.makeDimension3( stageOffset ); | 1866 | MathUtils.makeDimension3( stageOffset ); |
1873 | 1867 | ||
1874 | var y = hPt[1], x = vPt[0]; | 1868 | var y = hPt[1], x = vPt[0]; |