From a62cfc5976b03a9b6c7ee2f308312319b6b0e142 Mon Sep 17 00:00:00 2001 From: hwc487 Date: Mon, 16 Apr 2012 10:34:14 -0700 Subject: 3D translation fixes --- js/tools/Rotate3DToolBase.js | 27 ++++++++++ js/tools/Translate3DToolBase.js | 115 ++++++++++++++++++++++++++++++++-------- 2 files changed, 120 insertions(+), 22 deletions(-) (limited to 'js') diff --git a/js/tools/Rotate3DToolBase.js b/js/tools/Rotate3DToolBase.js index 880eefc4..d08b3a31 100755 --- a/js/tools/Rotate3DToolBase.js +++ b/js/tools/Rotate3DToolBase.js @@ -43,6 +43,33 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, { } }, + HandleMouseMove: { + value: function(event) { + if(this._escape) { + this._escape = false; + this.isDrawing = true; + } + + if(this.isDrawing) { + this._hasDraw = true; // Flag for position of element + this.doDraw(event); + } else { + this._showFeedbackOnMouseMove(event); + if(this._canSnap) + { + this.doSnap(event); + } + } + + this.DrawHandles(this._delta); + + if(this._canSnap) + { + snapManager.drawLastHit(); + } + } + }, + modifyElements: { value: function(data, event) { var mat, diff --git a/js/tools/Translate3DToolBase.js b/js/tools/Translate3DToolBase.js index a39dafad..41dbb3ae 100755 --- a/js/tools/Translate3DToolBase.js +++ b/js/tools/Translate3DToolBase.js @@ -296,42 +296,113 @@ exports.Translate3DToolBase = Montage.create(ModifierToolBase, viewUtils.popViewportObj(); ctr[2] = 0; -// var ctrOffset = item.elementModel.props3D.m_transformCtr; -// if(ctrOffset) -// { -// ctr = vecUtils.vecAdd(3, ctr, ctrOffset); -// } - this._origin = viewUtils.localToGlobal(ctr, item); } else { - if(this._origin) + this._origin = undefined; + this._origin = this.calculateMultiSelOrigin(); + } + } + } + }, + + captureSelectionDrawn: { + value: function(event){ + this._origin = null; + this._targets = []; + this._startOriginArray = null; + + var len = this.application.ninja.selectedElements.length; + if(len) + { + if(len === 1) + { + this.target = this.application.ninja.selectedElements[0]; + drawUtils.addElement(this.target); + + viewUtils.pushViewportObj( this.target ); + var eltCtr = viewUtils.getCenterOfProjection(); + eltCtr[2] = 0; + viewUtils.popViewportObj(); + + var ctrOffset = this.target.elementModel.props3D.m_transformCtr; + if(ctrOffset) + { + eltCtr[2] = 0; + eltCtr = vecUtils.vecAdd(3, eltCtr, ctrOffset); + } + + this._origin = viewUtils.localToGlobal(eltCtr, this.target); + console.log( "Rotate3DToolBase.captureSelectionDrawn _origin: " + this._origin ); + this._updateTargets(); + //this._setTransformOrigin(false); + } + else + { + this.target = this.application.ninja.currentDocument.documentRoot; + //this._origin = drawUtils._selectionCtr.slice(0); + //this._origin[0] += this.application.ninja.stage.userContentLeft; + //this._origin[1] += this.application.ninja.stage.userContentTop; + this._updateTargets(); + this._origin = this.calculateMultiSelOrigin(); + //this._setTransformOrigin(true); + } + } + else + { + this.target = null; + } + this.DrawHandles(); + + if(event) + { + this.eventManager.removeEventListener("selectionDrawn", this, true); + } + } + }, + + calculateMultiSelOrigin: + { + value: function() + { + var minPt, maxPt, i,j; + this._startOriginArray = []; + var len = this.application.ninja.selectedElements.length; + for (i = 0; i < len; i++) + { + // get the next element and localToGlobal matrix + elt = this._targets[i].elt; + var l2g = this._targets[i].l2g; + + // get the element bounds in 'plane' space + bounds = viewUtils.getElementViewBounds3D( elt ); + for (j=0; j<4; j++) + { + var localPt = bounds[j]; + //var pt = MathUtils.transformAndDivideHomogeneousPoint( localPt, l2g ); + var pt = viewUtils.localToStageWorld( localPt, elt ); + if (!minPt) { - if(this._delta) - { - if(this._handleMode !== null) - { -// this._origin[this._handleMode] = this._delta; - } - else - { - this._origin[0] += this._delta[0]; - this._origin[1] += this._delta[1]; - } - } + minPt = pt.slice(); + maxPt = pt.slice(); } else { - this._origin = drawUtils._selectionCtr.slice(0); - this._origin[0] += this.application.ninja.stage.userContentLeft; - this._origin[1] += this.application.ninja.stage.userContentTop; + minPt[0] = Math.min(minPt[0],pt[0]); minPt[1] = Math.min(minPt[1],pt[1]); minPt[2] = Math.min(minPt[2],pt[2]); + maxPt[0] = Math.max(maxPt[0],pt[0]); maxPt[1] = Math.max(maxPt[1],pt[1]); maxPt[2] = Math.max(maxPt[2],pt[2]); } } } + var stageWorldCtr = [ 0.5*(minPt[0] + maxPt[0]), 0.5*(minPt[1] + maxPt[1]), 0.5*(minPt[2] + maxPt[2]) ]; + var globalCtr = MathUtils.transformAndDivideHomogeneousPoint( stageWorldCtr, viewUtils.getStageWorldToGlobalMatrix() ); + console.log( "resetting _origin to: " + this._origin ); + + return globalCtr; } }, + DrawHandles: { value: function (delta) { this.application.ninja.stage.clearDrawingCanvas(); -- cgit v1.2.3