aboutsummaryrefslogtreecommitdiff
path: root/js/helper-classes/3D
diff options
context:
space:
mode:
Diffstat (limited to 'js/helper-classes/3D')
-rwxr-xr-xjs/helper-classes/3D/draw-utils.js102
-rwxr-xr-xjs/helper-classes/3D/math-utils.js4
-rwxr-xr-xjs/helper-classes/3D/view-utils.js32
3 files changed, 102 insertions, 36 deletions
diff --git a/js/helper-classes/3D/draw-utils.js b/js/helper-classes/3D/draw-utils.js
index 5d210d41..9c4f31b7 100755
--- a/js/helper-classes/3D/draw-utils.js
+++ b/js/helper-classes/3D/draw-utils.js
@@ -654,6 +654,7 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
654 value: function () 654 value: function ()
655 { 655 {
656 this.application.ninja.stage.clearGridCanvas(); 656 this.application.ninja.stage.clearGridCanvas();
657 this.drawStageOutline();
657 if (!this.isDrawingGrid()) return; 658 if (!this.isDrawingGrid()) return;
658 659
659 var saveContext = this.getDrawingSurfaceElement(); 660 var saveContext = this.getDrawingSurfaceElement();
@@ -725,21 +726,6 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
725 this._lineColor = saveColor; 726 this._lineColor = saveColor;
726 this._drawingContext.lineWidth = saveLineWidth; 727 this._drawingContext.lineWidth = saveLineWidth;
727 728
728 if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") {
729 // draw an outline around the body
730 var stagePt = MathUtils.getPointOnPlane([0,0,1,0]);
731 var stageMat = this.getPlaneToWorldMatrix([0,0,1], stagePt);
732 // glmat4.multiply( tMat, stageMat, stageMat);
733 pt0 = [0, 0, 0];
734 pt1 = [0, height, 0];
735 delta = [width, 0, 0];
736 this.drawGridLines(pt0, pt1, delta, stageMat, 2);
737 pt0 = [0, 0, 0];
738 pt1 = [width, 0, 0];
739 delta = [0, height, 0];
740 this.drawGridLines(pt0, pt1, delta, stageMat, 2);
741 }
742
743 // draw the lines 729 // draw the lines
744 this.redrawGridLines(); 730 this.redrawGridLines();
745 731
@@ -762,15 +748,11 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
762 var sourceSpaceMat = this.viewUtils.getLocalToGlobalMatrix( this._sourceSpaceElt ); 748 var sourceSpaceMat = this.viewUtils.getLocalToGlobalMatrix( this._sourceSpaceElt );
763 for (var i = 0; i < nLines; i++) { 749 for (var i = 0; i < nLines; i++) {
764 // transform the points from working plane space to world space 750 // transform the points from working plane space to world space
765 //var t0 = mat.multiply(p0),
766 // t1 = mat.multiply(p1);
767 var t0 = glmat4.multiplyVec3( mat, p0, [] ), 751 var t0 = glmat4.multiplyVec3( mat, p0, [] ),
768 t1 = glmat4.multiplyVec3( mat, p1, [] ); 752 t1 = glmat4.multiplyVec3( mat, p1, [] );
769 753
770 // transform from world space to global screen space 754 // transform from world space to global screen space
771 if (this._sourceSpaceElt) { 755 if (this._sourceSpaceElt) {
772// t0 = this.viewUtils.localToGlobal(t0, this._sourceSpaceElt);
773// t1 = this.viewUtils.localToGlobal(t1, this._sourceSpaceElt);
774 t0 = this.viewUtils.localToGlobal2(t0, sourceSpaceMat); 756 t0 = this.viewUtils.localToGlobal2(t0, sourceSpaceMat);
775 t1 = this.viewUtils.localToGlobal2(t1, sourceSpaceMat); 757 t1 = this.viewUtils.localToGlobal2(t1, sourceSpaceMat);
776 } 758 }
@@ -788,9 +770,7 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
788 line.setVisibility(vis); 770 line.setVisibility(vis);
789 771
790 // increment the points to the next position 772 // increment the points to the next position
791// p0 = p0.add(d); p0[3] = 1.0;
792 p0 = vecUtils.vecAdd(4, p0, d); p0[3] = 1.0; 773 p0 = vecUtils.vecAdd(4, p0, d); p0[3] = 1.0;
793// p1 = p1.add(d); p1[3] = 1.0;
794 p1 = vecUtils.vecAdd(4, p1, d); p1[3] = 1.0; 774 p1 = vecUtils.vecAdd(4, p1, d); p1[3] = 1.0;
795 } 775 }
796 } 776 }
@@ -843,25 +823,12 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
843 // draw the lines 823 // draw the lines
844 var line, 824 var line,
845 nLines = this._gridLineArray.length; 825 nLines = this._gridLineArray.length;
846 if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") {
847 nLines = this._gridLineArray.length-4;
848 }
849 826
850 for (var i = 0; i < nLines; i++) { 827 for (var i = 0; i < nLines; i++) {
851 line = this._gridLineArray[i]; 828 line = this._gridLineArray[i];
852 this.drawIntersectedLine(line, this._drawingContext); 829 this.drawIntersectedLine(line, this._drawingContext);
853 } 830 }
854 831
855 if(this.application.ninja.currentDocument.model.documentRoot.id !== "UserContent") {
856 this._lineColor = "red";
857 i = nLines;
858 nLines += 4;
859 for (; i < nLines; i++) {
860 line = this._gridLineArray[i];
861 this.drawIntersectedLine(line, this._drawingContext);
862 }
863 }
864
865 this.popState(); 832 this.popState();
866 } 833 }
867 }, 834 },
@@ -1237,6 +1204,73 @@ var DrawUtils = exports.DrawUtils = Montage.create(Component, {
1237 } 1204 }
1238 }, 1205 },
1239 1206
1207 drawStageOutline : {
1208 value: function() {
1209 var context = this.application.ninja.stage.gridContext;
1210 var stage = this.application.ninja.stage;
1211 var stageRoot = this.application.ninja.currentDocument.model.documentRoot;
1212
1213 // draw an outline around the template body if stage has any transforms
1214 if(stage.currentDocument.model.views.design._template && !MathUtils.isIdentityMatrix(this.viewUtils.getMatrixFromElement(stageRoot))) {
1215 var saveContext = this.getDrawingSurfaceElement();
1216 this.setDrawingSurfaceElement(this.application.ninja.stage.gridCanvas);
1217
1218 var stagePt = MathUtils.getPointOnPlane([0,0,1,0]);
1219 var stageMat = this.getPlaneToWorldMatrix([0,0,1], stagePt);
1220 var width = this.snapManager.getStageWidth(),
1221 height = this.snapManager.getStageHeight(),
1222 pt0 = [0, 0, 0],
1223 pt1 = [0, height, 0],
1224 delta = [width, 0, 0];
1225
1226 this._gridLineArray.length = 0;
1227 this.drawGridLines(pt0, pt1, delta, stageMat, 2);
1228
1229 pt0 = [0, 0, 0];
1230 pt1 = [width, 0, 0];
1231 delta = [0, height, 0];
1232 this.drawGridLines(pt0, pt1, delta, stageMat, 2);
1233
1234 this._lineColor = "red";
1235 for (var i = 0; i < 4; i++) {
1236 this.drawIntersectedLine(this._gridLineArray[i], this._drawingContext);
1237 }
1238
1239 this.setDrawingSurfaceElement(saveContext);
1240 }
1241
1242 // draw reference lines across origin
1243 var bounds3D = this.viewUtils.getElementBoundsInGlobal(stageRoot);
1244 var l = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[3], [0, 0, 0], [0, stage.canvas.height, 0], 0.1);
1245 if(!l) return;
1246 var r = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[3], [stage.canvas.width, 0, 0], [stage.canvas.width, stage.canvas.height, 0], 0.1);
1247 if(!r) return;
1248
1249 var t = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[1], [0, 0, 0], [stage.canvas.width, 0, 0], 0.1);
1250 if(!t) return;
1251 var b = MathUtils.segSegIntersection2D(bounds3D[0], bounds3D[1], [0, stage.canvas.height, 0], [stage.canvas.width, stage.canvas.height, 0], 0.1);
1252 if(!b) return;
1253
1254 context.save();
1255 context.strokeStyle = "#333";
1256 context.lineWidth = 0.5;
1257
1258 context.beginPath();
1259
1260 context.moveTo(l[0], l[1]);
1261 context.lineTo(r[0], r[1]);
1262
1263 context.moveTo(t[0], t[1]);
1264 context.lineTo(b[0], b[1]);
1265
1266 context.closePath();
1267 context.stroke();
1268
1269 context.fillText("(0, 0)", bounds3D[0][0] + 4, bounds3D[0][1] - 6);
1270 context.restore();
1271 }
1272 },
1273
1240 draw3DCompass : { 1274 draw3DCompass : {
1241 value: function() { 1275 value: function() {
1242 // set the element to be the viewport object - temporarily 1276 // 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