aboutsummaryrefslogtreecommitdiff
path: root/js/tools/Translate3DToolBase.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/tools/Translate3DToolBase.js')
-rwxr-xr-xjs/tools/Translate3DToolBase.js134
1 files changed, 105 insertions, 29 deletions
diff --git a/js/tools/Translate3DToolBase.js b/js/tools/Translate3DToolBase.js
index 04359567..f81ce6d6 100755
--- a/js/tools/Translate3DToolBase.js
+++ b/js/tools/Translate3DToolBase.js
@@ -70,6 +70,7 @@ exports.Translate3DToolBase = Montage.create(ModifierToolBase,
70 this._delta = delta.slice(0); 70 this._delta = delta.slice(0);
71 } 71 }
72 72
73 //console.log( "modifyElements delta: " + delta );
73 var transMat = Matrix.Translation( delta ); 74 var transMat = Matrix.Translation( delta );
74 75
75 //console.log( "Translate: " + delta ); 76 //console.log( "Translate: " + delta );
@@ -135,28 +136,35 @@ exports.Translate3DToolBase = Montage.create(ModifierToolBase,
135 136
136 _translateGlobally: { 137 _translateGlobally: {
137 value: function (transMat) { 138 value: function (transMat) {
138 //console.log( "_translateGlobally, startMat: " + this._startMat + ", transMat: " + transMat );
139 //console.log( "_translateGlobally, transMat: " + transMat ); 139 //console.log( "_translateGlobally, transMat: " + transMat );
140 var self = this, 140 var selectedElements = this.application.ninja.selectedElements;
141 curMat = viewUtils.getMatrixFromElement( this._target ), 141
142 var len = selectedElements.length,
143 self = this,
144 target = selectedElements[0],
145 curMat = viewUtils.getMatrixFromElement( target ),
142 matInv = glmat4.inverse(this._startMat, []), 146 matInv = glmat4.inverse(this._startMat, []),
143 nMat = glmat4.multiply(transMat, this._startMat, [] ); 147 nMat = glmat4.multiply(transMat, this._startMat, [] );
144// qMat = glmat4.multiply(matInv, nMat, []); 148// qMat = glmat4.multiply(matInv, nMat, []);
145 149
146 if(this._mode === 1) { 150 if(this._mode === 1) {
151 if (len > 1) curMat = target.elementModel.getProperty("mat").slice();
147 var curInv = glmat4.inverse( curMat, [] ); 152 var curInv = glmat4.inverse( curMat, [] );
148 transMat = glmat4.multiply( nMat, curInv, [] ); 153 transMat = glmat4.multiply( nMat, curInv, [] );
149 } 154 }
150 155
151 var shouldUpdateStartMat = true; 156 var shouldUpdateStartMat = true;
152 157
153 if(this._clickedOnStage) { 158 if(this._clickedOnStage || ((this._handleMode === 2) && (len > 1)))
159 {
154 shouldUpdateStartMat = false; 160 shouldUpdateStartMat = false;
155 } else if(this._mode !== 1) { 161 }
162 else if(this._mode !== 1)
163 {
156 this._startMat = nMat; 164 this._startMat = nMat;
157 } 165 }
158 166
159 this.application.ninja.selectedElements.forEach(function(element) { 167 selectedElements.forEach(function(element) {
160 curMat = element.elementModel.getProperty("mat").slice(0); 168 curMat = element.elementModel.getProperty("mat").slice(0);
161 169
162// glmat4.multiply(curMat, qMat, curMat); 170// glmat4.multiply(curMat, qMat, curMat);
@@ -249,42 +257,107 @@ exports.Translate3DToolBase = Montage.create(ModifierToolBase,
249 viewUtils.popViewportObj(); 257 viewUtils.popViewportObj();
250 ctr[2] = 0; 258 ctr[2] = 0;
251 259
252// var ctrOffset = item.elementModel.props3D.m_transformCtr;
253// if(ctrOffset)
254// {
255// ctr = vecUtils.vecAdd(3, ctr, ctrOffset);
256// }
257
258 this._origin = viewUtils.localToGlobal(ctr, item); 260 this._origin = viewUtils.localToGlobal(ctr, item);
259 } 261 }
260 else 262 else
261 { 263 {
262 if(this._origin) 264 this._origin = undefined;
263 { 265 this._origin = this.calculateMultiSelOrigin();
264 if(this._delta) 266 }
265 { 267 }
266 if(this._handleMode !== null) 268 }
267 { 269 },
268// this._origin[this._handleMode] = this._delta; 270
269 } 271 captureSelectionDrawn: {
270 else 272 value: function(event){
271 { 273 this._origin = null;
272 this._origin[0] += this._delta[0]; 274 this._startOriginArray = null;
273 this._origin[1] += this._delta[1]; 275
274 } 276 var len = this.application.ninja.selectedElements.length;
275 } 277 if(len) {
278 if(len === 1) {
279 this.target = this.application.ninja.selectedElements[0];
280 drawUtils.addElement(this.target);
281
282 viewUtils.pushViewportObj( this.target );
283 var eltCtr = viewUtils.getCenterOfProjection();
284 eltCtr[2] = 0;
285 viewUtils.popViewportObj();
286
287 var ctrOffset = this.target.elementModel.props3D.m_transformCtr;
288 if(ctrOffset) {
289 eltCtr[2] = 0;
290 eltCtr = vecUtils.vecAdd(3, eltCtr, ctrOffset);
276 } 291 }
292
293 this._origin = viewUtils.localToGlobal(eltCtr, this.target);
294// console.log( "Rotate3DToolBase.captureSelectionDrawn _origin: " + this._origin );
295 this._updateTargets();
296 //this._setTransformOrigin(false);
297 }
298 else {
299 this.target = this.application.ninja.currentDocument.documentRoot;
300 //this._origin = drawUtils._selectionCtr.slice(0);
301 //this._origin[0] += this.application.ninja.stage.userContentLeft;
302 //this._origin[1] += this.application.ninja.stage.userContentTop;
303 this._updateTargets();
304 this._origin = this.calculateMultiSelOrigin();
305 //this._setTransformOrigin(true);
306 }
307 }
308 else {
309 this.target = null;
310 }
311 this.DrawHandles();
312
313 if(event)
314 {
315 this.eventManager.removeEventListener("selectionDrawn", this, true);
316 }
317 }
318 },
319
320 calculateMultiSelOrigin:
321 {
322 value: function()
323 {
324 var minPt, maxPt, i,j;
325 this._startOriginArray = [];
326 var len = this.application.ninja.selectedElements.length;
327 for (i = 0; i < len; i++)
328 {
329 // get the next element and localToGlobal matrix
330 var elt = this.application.ninja.selectedElements[i];
331 var l2g = elt.elementModel.getProperty("l2g");
332
333 // get the element bounds in 'plane' space
334 var bounds = viewUtils.getElementViewBounds3D( elt );
335 for (j=0; j<4; j++)
336 {
337 var localPt = bounds[j];
338 //var pt = MathUtils.transformAndDivideHomogeneousPoint( localPt, l2g );
339 var pt = viewUtils.localToStageWorld( localPt, elt );
340 if (!minPt)
341 {
342 minPt = pt.slice();
343 maxPt = pt.slice();
344 }
277 else 345 else
278 { 346 {
279 this._origin = drawUtils._selectionCtr.slice(0); 347 minPt[0] = Math.min(minPt[0],pt[0]); minPt[1] = Math.min(minPt[1],pt[1]); minPt[2] = Math.min(minPt[2],pt[2]);
280 this._origin[0] += this.application.ninja.stage.userContentLeft; 348 maxPt[0] = Math.max(maxPt[0],pt[0]); maxPt[1] = Math.max(maxPt[1],pt[1]); maxPt[2] = Math.max(maxPt[2],pt[2]);
281 this._origin[1] += this.application.ninja.stage.userContentTop;
282 } 349 }
283 } 350 }
284 } 351 }
352 var stageWorldCtr = [ 0.5*(minPt[0] + maxPt[0]), 0.5*(minPt[1] + maxPt[1]), 0.5*(minPt[2] + maxPt[2]) ];
353 var globalCtr = MathUtils.transformAndDivideHomogeneousPoint( stageWorldCtr, viewUtils.getStageWorldToGlobalMatrix() );
354// console.log( "resetting _origin to: " + this._origin );
355
356 return globalCtr;
285 } 357 }
286 }, 358 },
287 359
360
288 DrawHandles: { 361 DrawHandles: {
289 value: function (delta) { 362 value: function (delta) {
290 this.application.ninja.stage.clearDrawingCanvas(); 363 this.application.ninja.stage.clearDrawingCanvas();
@@ -322,6 +395,9 @@ exports.Translate3DToolBase = Montage.create(ModifierToolBase,
322 this._updateHandlesOrigin(); 395 this._updateHandlesOrigin();
323 var base = this._origin.slice(0); 396 var base = this._origin.slice(0);
324 397
398// if (this.isDrawing)
399// console.log( "handle origin: " + base );
400
325 var len = this.application.ninja.selectedElements.length; 401 var len = this.application.ninja.selectedElements.length;
326 var lMode = this._inLocalMode; 402 var lMode = this._inLocalMode;
327 if(len === 1) 403 if(len === 1)