diff options
Diffstat (limited to 'js/helper-classes/3D/view-utils.js')
-rwxr-xr-x | js/helper-classes/3D/view-utils.js | 171 |
1 files changed, 94 insertions, 77 deletions
diff --git a/js/helper-classes/3D/view-utils.js b/js/helper-classes/3D/view-utils.js index 40a19b90..a3d09404 100755 --- a/js/helper-classes/3D/view-utils.js +++ b/js/helper-classes/3D/view-utils.js | |||
@@ -18,18 +18,11 @@ exports.ViewUtils = Montage.create(Component, { | |||
18 | // Instance variables | 18 | // Instance variables |
19 | /////////////////////////////////////////////////////////////////////// | 19 | /////////////////////////////////////////////////////////////////////// |
20 | 20 | ||
21 | m_viewportObj : { value: null, writable: true}, | 21 | m_viewportObj : { value: null}, |
22 | _perspectiveDist: { value: null, writable: true}, | 22 | _perspectiveDist: { value: null}, |
23 | 23 | ||
24 | // keep a stack of viewport objects | 24 | // keep a stack of viewport objects |
25 | _viewportObjStack: { value: [], writable: true }, | 25 | _viewportObjStack: { value: []}, |
26 | |||
27 | _currentDocument: { value: null , writable: true}, | ||
28 | _userContentLeft: { value: null , writable: true}, | ||
29 | _userContentTop: { value: null , writable: true}, | ||
30 | |||
31 | _rootElement: { value: null, writable: true}, | ||
32 | _stageElement: { value: null, writable: true}, | ||
33 | 26 | ||
34 | /////////////////////////////////////////////////////////////////////// | 27 | /////////////////////////////////////////////////////////////////////// |
35 | // Property accessors | 28 | // Property accessors |
@@ -43,18 +36,6 @@ exports.ViewUtils = Montage.create(Component, { | |||
43 | }, | 36 | }, |
44 | getViewportObj: { value: function() { return this.m_viewportObj; } }, | 37 | getViewportObj: { value: function() { return this.m_viewportObj; } }, |
45 | 38 | ||
46 | setRootElement: { value: function( elt ) { this._rootElement = elt; } }, | ||
47 | getRootElement: { value: function () { return this._rootElement; } }, | ||
48 | |||
49 | setStageElement: { value: function( elt ) { this._stageElement = elt; } }, | ||
50 | getStageElement: { value: function () { return this._stageElement; } }, | ||
51 | |||
52 | setCurrentDocument: { value: function(value) { this._currentDocument = value; }}, | ||
53 | |||
54 | setUserContentLeft: { value: function(value) { this._userContentLeft = value; }}, | ||
55 | setUserContentTop: { value: function(value) { this._userContentTop = value; }}, | ||
56 | |||
57 | |||
58 | getPerspectiveDistance: { value: function () { return this._perspectiveDist; } }, | 39 | getPerspectiveDistance: { value: function () { return this._perspectiveDist; } }, |
59 | 40 | ||
60 | /////////////////////////////////////////////////////////////////////// | 41 | /////////////////////////////////////////////////////////////////////// |
@@ -124,35 +105,73 @@ exports.ViewUtils = Montage.create(Component, { | |||
124 | } | 105 | } |
125 | }, | 106 | }, |
126 | 107 | ||
127 | getNormalToUnprojectedElementPlane: { | 108 | /* |
128 | value: function( elt ) { | 109 | * This method will return a normal to a plane containing the Z axis and either the |
129 | var mat = this.getMatrixFromElement(elt); | 110 | * x or y axis of the element. |
111 | */ | ||
112 | getNormalToUnprojectedElementPlane: | ||
113 | { | ||
114 | value: function( elt, axis, localMode ) | ||
115 | { | ||
116 | var objMat = this.getMatrixFromElement(elt); | ||
117 | var objMatInv = glmat4.inverse( objMat, [] ); | ||
130 | 118 | ||
131 | var xVec = [mat[0], mat[1], mat[2], mat[3]]; | 119 | var xVec = [1,0,0]; |
132 | var yVec = [mat[4], mat[5], mat[6], mat[7]]; | 120 | var yVec = [0,1,0]; |
121 | var zVec = [0,0,1]; | ||
133 | 122 | ||
134 | var stage = this.application.ninja.currentDocument.documentRoot; | 123 | var stage = this.application.ninja.currentDocument.model.documentRoot; |
135 | var stageMat = this.getMatrixFromElement(stage); | 124 | var stageMat = this.getMatrixFromElement(stage); |
136 | var stagePlane = [stageMat[8], stageMat[9], stageMat[10], stageMat[11]]; | ||
137 | 125 | ||
138 | if (elt === stage) | 126 | var mat = glmat4.multiply( stageMat, objMat, [] ); |
127 | |||
128 | var viewDir; | ||
129 | if (localMode) | ||
130 | { | ||
131 | var matInv = glmat4.inverse( mat, [] ); | ||
132 | viewDir = MathUtils.transformVector( [0,0,1], matInv ); | ||
133 | } | ||
134 | else | ||
139 | { | 135 | { |
140 | xVec = [1,0,0]; | 136 | var stageInv = glmat4.inverse( stageMat, [] ); |
141 | yVec = [0,1,0]; | 137 | viewDir = MathUtils.transformVector( [0,0,1], stageInv ); |
142 | } | 138 | } |
143 | 139 | ||
144 | var xDot = Math.abs(vecUtils.vecDot(3, xVec, stagePlane)); | 140 | var plane; |
145 | var yDot = Math.abs(vecUtils.vecDot(3, yVec, stagePlane)); | 141 | var xDot, yDot, zDot; |
142 | switch (axis) | ||
143 | { | ||
144 | case 0: | ||
145 | yDot = Math.abs(vecUtils.vecDot(3, yVec, viewDir)); | ||
146 | zDot = Math.abs(vecUtils.vecDot(3, zVec, viewDir)); | ||
147 | if(yDot > zDot) | ||
148 | plane = vecUtils.vecCross( 3, zVec, xVec ); | ||
149 | else | ||
150 | plane = vecUtils.vecCross( 3, yVec, xVec ); | ||
151 | break; | ||
152 | |||
153 | case 1: | ||
154 | xDot = Math.abs(vecUtils.vecDot(3, yVec, viewDir)); | ||
155 | zDot = Math.abs(vecUtils.vecDot(3, zVec, viewDir)); | ||
156 | if(xDot > zDot) | ||
157 | plane = vecUtils.vecCross( 3, zVec, yVec ); | ||
158 | else | ||
159 | plane = vecUtils.vecCross( 3, xVec, yVec ); | ||
160 | break; | ||
161 | break; | ||
162 | |||
163 | case 2: | ||
164 | xDot = Math.abs(vecUtils.vecDot(3, xVec, viewDir)); | ||
165 | yDot = Math.abs(vecUtils.vecDot(3, yVec, viewDir)); | ||
166 | |||
167 | if(xDot > yDot) | ||
168 | plane = vecUtils.vecCross( 3, yVec, zVec ); | ||
169 | else | ||
170 | plane = vecUtils.vecCross( 3, xVec, zVec ); | ||
171 | break; | ||
172 | } | ||
146 | 173 | ||
147 | var plane; | 174 | if (localMode) plane = MathUtils.transformVector( plane, objMat ); |
148 | if(xDot > yDot) | ||
149 | { | ||
150 | plane = xVec; | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | plane = yVec; | ||
155 | } | ||
156 | 175 | ||
157 | // The translation value is a point on the plane | 176 | // The translation value is a point on the plane |
158 | this.pushViewportObj( elt ); | 177 | this.pushViewportObj( elt ); |
@@ -242,6 +261,11 @@ exports.ViewUtils = Montage.create(Component, { | |||
242 | value: function( localPt, elt ) { | 261 | value: function( localPt, elt ) { |
243 | this.pushViewportObj( elt ); | 262 | this.pushViewportObj( elt ); |
244 | var viewPt = this.screenToView( localPt[0], localPt[1], localPt[2] ); | 263 | var viewPt = this.screenToView( localPt[0], localPt[1], localPt[2] ); |
264 | if ((elt == null) || (elt === this._stageElement)) | ||
265 | { | ||
266 | this.popViewportObj(); | ||
267 | return viewPt; | ||
268 | } | ||
245 | var mat = this.getMatrixFromElement( elt ); | 269 | var mat = this.getMatrixFromElement( elt ); |
246 | var worldPt = MathUtils.transformPoint( viewPt, mat ); | 270 | var worldPt = MathUtils.transformPoint( viewPt, mat ); |
247 | var stageWorldPt = this.postViewToStageWorld( worldPt, elt ); | 271 | var stageWorldPt = this.postViewToStageWorld( worldPt, elt ); |
@@ -256,7 +280,7 @@ exports.ViewUtils = Montage.create(Component, { | |||
256 | // into stage world space. | 280 | // into stage world space. |
257 | postViewToStageWorld: { | 281 | postViewToStageWorld: { |
258 | value: function( localPt, elt ) { | 282 | value: function( localPt, elt ) { |
259 | if ((elt == null) || (elt === this._stageElement)) return localPt; | 283 | if ((elt == null) || (elt === this.application.ninja.currentDocument.model.documentRoot)) return localPt; |
260 | 284 | ||
261 | // get the 3D transformation and 2D offset from the element | 285 | // get the 3D transformation and 2D offset from the element |
262 | var pt = localPt.slice(0); | 286 | var pt = localPt.slice(0); |
@@ -283,7 +307,7 @@ exports.ViewUtils = Montage.create(Component, { | |||
283 | this.popViewportObj(); | 307 | this.popViewportObj(); |
284 | 308 | ||
285 | // check if we are done | 309 | // check if we are done |
286 | if (parent === this._stageElement) break; | 310 | if (parent === this.application.ninja.currentDocument.model.documentRoot) break; |
287 | 311 | ||
288 | if (this.elementHas3D( parent )) | 312 | if (this.elementHas3D( parent )) |
289 | { | 313 | { |
@@ -308,15 +332,17 @@ exports.ViewUtils = Montage.create(Component, { | |||
308 | 332 | ||
309 | // transform the bounds up the tree | 333 | // transform the bounds up the tree |
310 | var child = elt; | 334 | var child = elt; |
311 | var parent = elt.offsetParent; | 335 | while ( child ) |
312 | while ( parent ) | ||
313 | { | 336 | { |
314 | pt = this.childToParent( pt, child ); | 337 | pt = this.childToParent( pt, child ); |
315 | 338 | ||
316 | if (parent === this._rootElement) break; | 339 | // if (child === this.application.ninja.currentDocument.model.documentRoot) break; |
340 | // child = child.offsetParent; | ||
317 | 341 | ||
318 | child = parent; | 342 | if (child === this.application.ninja.currentDocument.model.documentRoot) break; |
319 | parent = parent.offsetParent; | 343 | if (child === this.application.ninja.currentDocument.model.documentRoot.parentNode) break; |
344 | child = child.offsetParent; | ||
345 | if (child === this.application.ninja.currentDocument.model.documentRoot.parentNode) break; | ||
320 | } | 346 | } |
321 | 347 | ||
322 | ///////////////////////////////////////////////////////// | 348 | ///////////////////////////////////////////////////////// |
@@ -352,7 +378,8 @@ exports.ViewUtils = Montage.create(Component, { | |||
352 | 378 | ||
353 | // transform the bounds up the tree | 379 | // transform the bounds up the tree |
354 | var parent = child.offsetParent; | 380 | var parent = child.offsetParent; |
355 | if ( parent ) | 381 | // TODO - Should have a different way to check for new template mode |
382 | if ( parent || (child === this.application.ninja.currentDocument.model.documentRoot) ) | ||
356 | { | 383 | { |
357 | this.setViewportObj( child ); | 384 | this.setViewportObj( child ); |
358 | 385 | ||
@@ -365,7 +392,7 @@ exports.ViewUtils = Montage.create(Component, { | |||
365 | { | 392 | { |
366 | // TODO - Comm |