diff options
9 files changed, 104 insertions, 118 deletions
diff --git a/js/helper-classes/3D/draw-utils.js b/js/helper-classes/3D/draw-utils.js index 8ddd0d52..bd47ffc3 100755 --- a/js/helper-classes/3D/draw-utils.js +++ b/js/helper-classes/3D/draw-utils.js | |||
@@ -630,6 +630,7 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
630 | value: function () | 630 | value: function () |
631 | { | 631 | { |
632 | this.application.ninja.stage.clearGridCanvas(); | 632 | this.application.ninja.stage.clearGridCanvas(); |
633 | this.drawStageOutline(); | ||
633 | if (!this.isDrawingGrid()) return; | 634 | if (!this.isDrawingGrid()) return; |
634 | 635 | ||
635 | var saveContext = this.getDrawingSurfaceElement(); | 636 | var saveContext = this.getDrawingSurfaceElement(); |
@@ -701,21 +702,6 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
701 | this._lineColor = saveColor; | 702 | this._lineColor = saveColor; |
702 | this._drawingContext.lineWidth = saveLineWidth; | 703 | this._drawingContext.lineWidth = saveLineWidth; |
703 | 704 | ||
704 | if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") { | ||
705 | // draw an outline around the body | ||
706 | var stagePt = MathUtils.getPointOnPlane([0,0,1,0]); | ||
707 | var stageMat = this.getPlaneToWorldMatrix([0,0,1], stagePt); | ||
708 | // glmat4.multiply( tMat, stageMat, stageMat); | ||
709 | pt0 = [0, 0, 0]; | ||
710 | pt1 = [0, height, 0]; | ||
711 | delta = [width, 0, 0]; | ||
712 | this.drawGridLines(pt0, pt1, delta, stageMat, 2); | ||
713 | pt0 = [0, 0, 0]; | ||
714 | pt1 = [width, 0, 0]; | ||
715 | delta = [0, height, 0]; | ||
716 | this.drawGridLines(pt0, pt1, delta, stageMat, 2); | ||
717 | } | ||
718 | |||
719 | // draw the lines | 705 | // draw the lines |
720 | this.redrawGridLines(); | 706 | this.redrawGridLines(); |
721 | 707 | ||
@@ -738,15 +724,11 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
738 | var sourceSpaceMat = this.viewUtils.getLocalToGlobalMatrix( this._sourceSpaceElt ); | 724 | var sourceSpaceMat = this.viewUtils.getLocalToGlobalMatrix( this._sourceSpaceElt ); |
739 | for (var i = 0; i < nLines; i++) { | 725 | for (var i = 0; i < nLines; i++) { |
740 | // transform the points from working plane space to world space | 726 | // transform the points from working plane space to world space |
741 | //var t0 = mat.multiply(p0), | ||
742 | // t1 = mat.multiply(p1); | ||
743 | var t0 = glmat4.multiplyVec3( mat, p0, [] ), | 727 | var t0 = glmat4.multiplyVec3( mat, p0, [] ), |
744 | t1 = glmat4.multiplyVec3( mat, p1, [] ); | 728 | t1 = glmat4.multiplyVec3( mat, p1, [] ); |
745 | 729 | ||
746 | // transform from world space to global screen space | 730 | // transform from world space to global screen space |
747 | if (this._sourceSpaceElt) { | 731 | if (this._sourceSpaceElt) { |
748 | // t0 = this.viewUtils.localToGlobal(t0, this._sourceSpaceElt); | ||
749 | // t1 = this.viewUtils.localToGlobal(t1, this._sourceSpaceElt); | ||
750 | t0 = this.viewUtils.localToGlobal2(t0, sourceSpaceMat); | 732 | t0 = this.viewUtils.localToGlobal2(t0, sourceSpaceMat); |
751 | t1 = this.viewUtils.localToGlobal2(t1, sourceSpaceMat); | 733 | t1 = this.viewUtils.localToGlobal2(t1, sourceSpaceMat); |
752 | } | 734 | } |
@@ -764,9 +746,7 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
764 | line.setVisibility(vis); | 746 | line.setVisibility(vis); |
765 | 747 | ||
766 | // increment the points to the next position | 748 | // increment the points to the next position |
767 | // p0 = p0.add(d); p0[3] = 1.0; | ||
768 | p0 = vecUtils.vecAdd(4, p0, d); p0[3] = 1.0; | 749 | p0 = vecUtils.vecAdd(4, p0, d); p0[3] = 1.0; |
769 | // p1 = p1.add(d); p1[3] = 1.0; | ||
770 | p1 = vecUtils.vecAdd(4, p1, d); p1[3] = 1.0; | 750 | p1 = vecUtils.vecAdd(4, p1, d); p1[3] = 1.0; |
771 | } | 751 | } |
772 | } | 752 | } |
@@ -819,25 +799,12 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
819 | // draw the lines | 799 | // draw the lines |
820 | var line, | 800 | var line, |
821 | nLines = this._gridLineArray.length; | 801 | nLines = this._gridLineArray.length; |
822 | if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") { | ||
823 | nLines = this._gridLineArray.length-4; | ||
824 | } | ||
825 | 802 | ||
826 | for (var i = 0; i < nLines; i++) { | 803 | for (var i = 0; i < nLines; i++) { |
827 | line = this._gridLineArray[i]; | 804 | line = this._gridLineArray[i]; |
828 | this.drawIntersectedLine(line, this._drawingContext); | 805 | this.drawIntersectedLine(line, this._drawingContext); |
829 | } | 806 | } |
830 | 807 | ||
831 | if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") { | ||
832 | this._lineColor = "red"; | ||
833 | i = nLines; | ||
834 | nLines += 4; | ||
835 | for (; i < nLines; i++) { | ||
836 | line = this._gridLineArray[i]; | ||
837 | this.drawIntersectedLine(line, this._drawingContext); | ||
838 | } | ||
839 | } | ||
840 | |||
841 | this.popState(); | 808 | this.popState(); |
842 | } | 809 | } |
843 | }, | 810 | }, |
@@ -1213,6 +1180,43 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, { | |||
1213 | } | 1180 | } |
1214 | }, | 1181 | }, |
1215 | 1182 | ||
1183 | drawStageOutline : { | ||
1184 | value: function() { | ||
1185 | var context = this.application.ninja.stage.gridContext; | ||
1186 | var stage = this.application.ninja.stage; | ||
1187 | var stageRoot = this.application.ninja.currentDocument.model.documentRoot; | ||
1188 | var bounds3D = this.viewUtils.getElementBoundsInGlobal(stageRoot); | ||
1189 | |||
1190 | var l = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[3], [0, 0, 0], [0, stage.canvas.height, 0], 0.1); | ||
1191 | if(!l) return; | ||
1192 | var r = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[3], [stage.canvas.width, 0, 0], [stage.canvas.width, stage.canvas.height, 0], 0.1); | ||
1193 | if(!r) return; | ||
1194 | |||
1195 | var t = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[1], [0, 0, 0], [stage.canvas.width, 0, 0], 0.1); | ||
1196 | if(!t) return; | ||
1197 | var b = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[1], [0, stage.canvas.height, 0], [stage.canvas.width, stage.canvas.height, 0], 0.1); | ||
1198 | if(!b) return; | ||
1199 | |||
1200 | context.save(); | ||
1201 | context.strokeStyle = "#333"; | ||
1202 | context.lineWidth = 0.5; | ||
1203 | |||
1204 | context.beginPath(); | ||
1205 | |||
1206 | context.moveTo(l[0], l[1]); | ||
1207 | context.lineTo(r[0], r[1]); | ||
1208 | |||
1209 | context.moveTo(t[0], t[1]); | ||
1210 | context.lineTo(b[0], b[1]); | ||
1211 | |||
1212 | context.closePath(); | ||
1213 | context.stroke(); | ||
1214 | |||
1215 | context.fillText("(0, 0)", bounds3D[0][0] + 4, bounds3D[0][1] - 6); | ||
1216 | context.restore(); | ||
1217 | } | ||
1218 | }, | ||
1219 | |||
1216 | draw3DCompass : { | 1220 | draw3DCompass : { |
1217 | value: function() { | 1221 | value: function() { |
1218 | // set the element to be the viewport object - temporarily | 1222 | // set the element to be the viewport object - temporarily |
diff --git a/js/helper-classes/3D/math-utils.js b/js/helper-classes/3D/math-utils.js index 35ee8112..44e2499d 100755 --- a/js/helper-classes/3D/math-utils.js +++ b/js/helper-classes/3D/math-utils.js | |||
@@ -333,7 +333,7 @@ var MathUtilsClass = exports.MathUtilsClass = Object.create(Object.prototype, { | |||
333 | 333 | ||
334 | //returns the intersection point between the two segments (null if no intersection) | 334 | //returns the intersection point between the two segments (null if no intersection) |
335 | segSegIntersection2D: { | 335 | segSegIntersection2D: { |
336 | value: function (seg0Start, seg0End, seg1Start, seg1End, epsilon) { | 336 | value: function (seg0Start, seg0End, seg1Start, seg1End, epsilon, mustLieInSegements) { |
337 | //check for parallel segments | 337 | //check for parallel segments |
338 | var denom = (seg1End[1] - seg1Start[1]) * (seg0End[0] - seg0Start[0]) - (seg1End[0] - seg1Start[0]) * (seg0End[1] - seg0Start[1]); | 338 | var denom = (seg1End[1] - seg1Start[1]) * (seg0End[0] - seg0Start[0]) - (seg1End[0] - seg1Start[0]) * (seg0End[1] - seg0Start[1]); |
339 | if (Math.abs(denom) <= epsilon) { | 339 | if (Math.abs(denom) <= epsilon) { |
@@ -349,7 +349,7 @@ var MathUtilsClass = exports.MathUtilsClass = Object.create(Object.prototype, { | |||
349 | paramSeg1 /= denom; | 349 | paramSeg1 /= denom; |
350 | 350 | ||
351 | //check whether the parameters are both between 0 and 1 | 351 | //check whether the parameters are both between 0 and 1 |
352 | if (Math.abs(paramSeg0) > 1.0 || Math.abs(paramSeg1) > 1.0) { | 352 | if (mustLieInSegements && (Math.abs(paramSeg0) > 1.0 || Math.abs(paramSeg1) > 1.0)) { |
353 | return null; //no intersection unless the the intersection point lies on both segments | 353 | return null; //no intersection unless the the intersection point lies on both segments |
354 | } | 354 | } |
355 | 355 | ||
diff --git a/js/helper-classes/3D/view-utils.js b/js/helper-classes/3D/view-utils.js index 5a128408..d7f29caa 100755 --- a/js/helper-classes/3D/view-utils.js +++ b/js/helper-classes/3D/view-utils.js | |||
@@ -244,6 +244,38 @@ exports.ViewUtils = Montage.create(Component, { | |||
244 | } | 244 | } |
245 | }, | 245 | }, |
246 | 246 | ||
247 | getElementBoundsInGlobal: { | ||
248 | value: function (elt) { | ||
249 | this.pushViewportObj(elt); | ||
250 | var bounds3D = this.getElementViewBounds3D(elt); | ||
251 | var tmpMat = this.getLocalToGlobalMatrix(elt); | ||
252 | |||
253 | var zoomFactor = 1; | ||
254 | var stage = this.application.ninja.stage; | ||
255 | if (stage._viewport && stage._viewport.style && stage._viewport.style.zoom) { | ||
256 | zoomFactor = Number(stage._viewport.style.zoom); | ||
257 | } | ||
258 | |||
259 | var sSL = stage._scrollLeft; | ||
260 | var sST = stage._scrollTop; | ||
261 | |||
262 | for (var j=0; j<4; j++) { | ||
263 | var localPt = bounds3D[j]; | ||
264 | var tmpPt = this.localToGlobal2(localPt, tmpMat); | ||
265 | |||
266 | if(zoomFactor !== 1) { | ||
267 | tmpPt = vecUtils.vecScale(3, tmpPt, zoomFactor); | ||
268 | |||
269 | tmpPt[0] += sSL*(zoomFactor - 1); | ||
270 | tmpPt[1] += sST*(zoomFactor - 1); | ||
271 | } | ||
272 | bounds3D[j] = tmpPt; | ||
273 | } | ||
274 | this.popViewportObj(); | ||
275 | return bounds3D; | ||
276 | } | ||
277 | }, | ||