diff options
Diffstat (limited to 'js/tools/Rotate3DToolBase.js')
-rwxr-xr-x | js/tools/Rotate3DToolBase.js | 236 |
1 files changed, 194 insertions, 42 deletions
diff --git a/js/tools/Rotate3DToolBase.js b/js/tools/Rotate3DToolBase.js index 2e121b0b..6bd92353 100755 --- a/js/tools/Rotate3DToolBase.js +++ b/js/tools/Rotate3DToolBase.js | |||
@@ -46,25 +46,70 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
46 | } | 46 | } |
47 | }, | 47 | }, |
48 | 48 | ||
49 | HandleMouseMove: { | ||
50 | value: function(event) { | ||
51 | if(this._escape) { | ||
52 | this._escape = false; | ||
53 | this.isDrawing = true; | ||
54 | } | ||
55 | |||
56 | if(this.isDrawing) { | ||
57 | this._hasDraw = true; // Flag for position of element | ||
58 | this.doDraw(event); | ||
59 | } else { | ||
60 | this._showFeedbackOnMouseMove(event); | ||
61 | if(this._canSnap) | ||
62 | { | ||
63 | this.doSnap(event); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | this.DrawHandles(this._delta); | ||
68 | |||
69 | if(this._canSnap) | ||
70 | { | ||
71 | snapManager.drawLastHit(); | ||
72 | } | ||
73 | } | ||
74 | }, | ||
75 | |||
49 | modifyElements: { | 76 | modifyElements: { |
50 | value: function(data, event) { | 77 | value: function(data, event) { |
51 | var mat, angle, pt0 = data.pt0, pt1 = data.pt1; | 78 | var mat, |
52 | 79 | angle, | |
53 | if(this._handleMode !== null) { | 80 | pt0 = data.pt0, |
54 | if(this._activateOriginHandle) { | 81 | pt1 = data.pt1; |
55 | // move the transform origin handle | 82 | |
56 | var dx = pt1.x - pt0.x; | 83 | if(this._handleMode !== null) |
57 | var dy = pt1.y - pt0.y; | 84 | { |
58 | this._origin[0] += dx; | 85 | if(this._activateOriginHandle) |
59 | this._origin[1] += dy; | 86 | { |
60 | 87 | // move the transform origin handle directly to the snap point (pt1) | |
61 | if( this.rotateStage || (this.application.ninja.selectedElements.length === 1)) { | 88 | this._origin[0] = pt1.x; |
62 | this._startOriginArray[0][0] += dx; | 89 | this._origin[1] = pt1.y; |
63 | this._startOriginArray[0][1] += dy; | 90 | this._origin[2] = pt1.z; |
91 | |||
92 | var sw2gMat = viewUtils.getStageWorldToGlobalMatrix(); | ||
93 | var g2swMat = glmat4.inverse( sw2gMat, [] ); | ||
94 | var swOrigin = MathUtils.transformAndDivideHomogeneousPoint( this._origin, g2swMat ); | ||
95 | //console.log( "modifyElements, _origin: " + this._origin + ", in stageWorld: " + swOrigin ); | ||
96 | |||
97 | var len = this._targets.length; | ||
98 | if(len === 1) | ||
99 | { | ||
100 | var g2lMat = this._targets[0].g2l; | ||
101 | var localOrigin = MathUtils.transformAndDivideHomogeneousPoint( this._origin, g2lMat ); | ||
102 | var elt = this._targets[0].elt; | ||
103 | viewUtils.pushViewportObj( elt ); | ||
104 | var viewOrigin = viewUtils.screenToView( localOrigin[0], localOrigin[1], localOrigin[2] ); | ||
105 | viewUtils.popViewportObj(); | ||
106 | this._startOriginArray[0] = viewOrigin; | ||
107 | //console.log( "Rotate3DToolBase.modifyElements, _startOriginArray[0]: " + this._startOriginArray[0] ); | ||
64 | } | 108 | } |
65 | 109 | ||
66 | this.downPoint.x = pt1.x; | 110 | this.downPoint.x = pt1.x; |
67 | this.downPoint.y = pt1.y; | 111 | this.downPoint.y = pt1.y; |
112 | this.downPoint.z = pt1.z; | ||
68 | this.DrawHandles(); | 113 | this.DrawHandles(); |
69 | return; | 114 | return; |
70 | } | 115 | } |
@@ -133,6 +178,7 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
133 | 178 | ||
134 | if(this._inLocalMode && (this.application.ninja.selectedElements.length === 1 || this.rotateStage) ) | 179 | if(this._inLocalMode && (this.application.ninja.selectedElements.length === 1 || this.rotateStage) ) |
135 | { | 180 | { |
181 | console.log( "modifyElements: rotateLocally " ); | ||
136 | this._rotateLocally(mat); | 182 | this._rotateLocally(mat); |
137 | } | 183 | } |
138 | else | 184 | else |
@@ -154,12 +200,14 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
154 | } | 200 | } |
155 | var len = selectedElements.length; | 201 | var len = selectedElements.length; |
156 | for(var i = 0; i < len; i++) { | 202 | for(var i = 0; i < len; i++) { |
157 | var elt = selectedElements[i].elementModel.getProperty("elt"); | 203 | var elt = selectedElements[i]; |
158 | var curMat = selectedElements[i].elementModel.getProperty("mat"); | 204 | var curMat = elt.elementModel.getProperty("mat"); |
159 | 205 | ||
160 | // pre-translate by the transformation center | 206 | // pre-translate by the transformation center |
161 | var tMat = Matrix.I(4); | 207 | var tMat = Matrix.I(4); |
162 | 208 | ||
209 | // _startOriginArray is the location of the center of rotation | ||
210 | // in view space of the element. | ||
163 | var transformCtr = this._startOriginArray[i]; | 211 | var transformCtr = this._startOriginArray[i]; |
164 | 212 | ||
165 | tMat[12] = transformCtr[0]; | 213 | tMat[12] = transformCtr[0]; |
@@ -179,7 +227,7 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
179 | glmat4.multiply(mat, tMat, mat); | 227 | glmat4.multiply(mat, tMat, mat); |
180 | 228 | ||
181 | // while moving, set inline style to improve performance | 229 | // while moving, set inline style to improve performance |
182 | viewUtils.setMatrixForElement(selectedElements[i], mat, true ); | 230 | viewUtils.setMatrixForElement( elt, mat, true ); |
183 | } | 231 | } |
184 | } | 232 | } |
185 | }, | 233 | }, |
@@ -197,6 +245,8 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
197 | var transformCtr = this._startOriginArray[i].slice(0); | 245 | var transformCtr = this._startOriginArray[i].slice(0); |
198 | transformCtr = MathUtils.transformPoint(transformCtr, curMat); | 246 | transformCtr = MathUtils.transformPoint(transformCtr, curMat); |
199 | 247 | ||
248 | console.log( "modifyElements: rotateGlobally, ctr: " + transformCtr ); | ||
249 | |||
200 | tMat[12] = transformCtr[0]; | 250 | tMat[12] = transformCtr[0]; |
201 | tMat[13] = transformCtr[1]; | 251 | tMat[13] = transformCtr[1]; |
202 | tMat[14] = transformCtr[2]; | 252 | tMat[14] = transformCtr[2]; |
@@ -265,6 +315,7 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
265 | 315 | ||
266 | viewUtils.pushViewportObj( this.target ); | 316 | viewUtils.pushViewportObj( this.target ); |
267 | var eltCtr = viewUtils.getCenterOfProjection(); | 317 | var eltCtr = viewUtils.getCenterOfProjection(); |
318 | eltCtr[2] = 0; | ||
268 | viewUtils.popViewportObj(); | 319 | viewUtils.popViewportObj(); |
269 | 320 | ||
270 | var ctrOffset = this.target.elementModel.props3D.m_transformCtr; | 321 | var ctrOffset = this.target.elementModel.props3D.m_transformCtr; |
@@ -275,16 +326,18 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
275 | } | 326 | } |
276 | 327 | ||
277 | this._origin = viewUtils.localToGlobal(eltCtr, this.target); | 328 | this._origin = viewUtils.localToGlobal(eltCtr, this.target); |
329 | //console.log( "Rotate3DToolBase.captureSelectionDrawn _origin: " + this._origin ); | ||
278 | this._updateTargets(); | 330 | this._updateTargets(); |
279 | this._setTransformOrigin(false); | 331 | this._setTransformOrigin(false); |
280 | } | 332 | } |
281 | else | 333 | else |
282 | { | 334 | { |
283 | this.target = this.application.ninja.currentDocument.documentRoot; | 335 | this.target = this.application.ninja.currentDocument.documentRoot; |
284 | this._origin = drawUtils._selectionCtr.slice(0); | 336 | //this._origin = drawUtils._selectionCtr.slice(0); |
285 | this._origin[0] += this.application.ninja.stage.userContentLeft; | 337 | //this._origin[0] += this.application.ninja.stage.userContentLeft; |
286 | this._origin[1] += this.application.ninja.stage.userContentTop; | 338 | //this._origin[1] += this.application.ninja.stage.userContentTop; |
287 | this._updateTargets(); | 339 | this._updateTargets(); |
340 | this._origin = this.calculateMultiSelOrigin(); | ||
288 | this._setTransformOrigin(true); | 341 | this._setTransformOrigin(true); |
289 | } | 342 | } |
290 | } | 343 | } |
@@ -301,17 +354,35 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
301 | } | 354 | } |
302 | }, | 355 | }, |
303 | 356 | ||
357 | /* | ||
358 | _updateHandlesOrigin: { | ||
359 | value: function () { } | ||
360 | }, | ||
361 | */ | ||
362 | |||
304 | _updateTargets: { | 363 | _updateTargets: { |
305 | value: function(addToUndo) { | 364 | value: function(addToUndo) { |
306 | var mod3dObject = [], self = this; | 365 | var mod3dObject = [], |
366 | self = this; | ||
307 | 367 | ||
308 | this.application.ninja.selectedElements.forEach(function(element) { | 368 | this.application.ninja.selectedElements.forEach(function(element) { |
309 | viewUtils.pushViewportObj(element); | 369 | var curMat = viewUtils.getMatrixFromElement(elt); |
370 | var curMatInv = glmat4.inverse(curMat, []); | ||
371 | |||
372 | viewUtils.pushViewportObj( elt ); | ||
310 | var eltCtr = viewUtils.getCenterOfProjection(); | 373 | var eltCtr = viewUtils.getCenterOfProjection(); |
311 | viewUtils.popViewportObj(); | 374 | viewUtils.popViewportObj(); |
312 | eltCtr = viewUtils.localToGlobal(eltCtr, element); | 375 | |
376 | // cache the local to global and global to local matrices | ||
377 | var l2gMat = viewUtils.getLocalToGlobalMatrix( elt ); | ||
378 | var g2lMat = glmat4.inverse( l2gMat, [] ); | ||
379 | eltCtr = MathUtils.transformAndDivideHomogeneousPoint( eltCtr, l2gMat ); | ||
313 | 380 | ||
314 | element.elementModel.setProperty("ctr", eltCtr); | 381 | element.elementModel.setProperty("ctr", eltCtr); |
382 | element.elementModel.setProperty("mat", curMat); | ||
383 | element.elementModel.setProperty("matInv", curMatInv); | ||
384 | element.elementModel.setProperty("l2g", l2gMat); | ||
385 | element.elementModel.setProperty("g2l", g2lMat); | ||
315 | 386 | ||
316 | if(addToUndo) { | 387 | if(addToUndo) { |
317 | var previousMat = element.elementModel.getProperty("mat").slice(0); | 388 | var previousMat = element.elementModel.getProperty("mat").slice(0); |
@@ -335,40 +406,84 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { | |||
335 | } | 406 | } |
336 | }, | 407 | }, |
337 | 408 | ||
409 | calculateMultiSelOrigin: | ||
410 | { | ||
411 | value: function() | ||
412 | { |