aboutsummaryrefslogtreecommitdiff
path: root/js/tools/Translate3DToolBase.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/tools/Translate3DToolBase.js')
-rw-r--r--js/tools/Translate3DToolBase.js357
1 files changed, 357 insertions, 0 deletions
diff --git a/js/tools/Translate3DToolBase.js b/js/tools/Translate3DToolBase.js
new file mode 100644
index 00000000..cbf76830
--- /dev/null
+++ b/js/tools/Translate3DToolBase.js
@@ -0,0 +1,357 @@
1/* <copyright>
2This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
3No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
4(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
5</copyright> */
6
7/* Base class for the 3D translate tools
8Subclass TranslateObject3DTool will translate the object that was clicked.
9*/
10var Montage = require("montage/core/core").Montage,
11 ModifierToolBase = require("js/tools/modifier-tool-base").ModifierToolBase,
12 toolHandleModule = require("js/stage/tool-handle"),
13 snapManager = require("js/helper-classes/3D/snap-manager").SnapManager,
14 viewUtils = require("js/helper-classes/3D/view-utils").ViewUtils,
15 vecUtils = require("js/helper-classes/3D/vec-utils").VecUtils,
16 drawUtils = require("js/helper-classes/3D/draw-utils").DrawUtils,
17 ElementsMediator = require("js/mediators/element-mediator").ElementMediator;
18
19exports.Translate3DToolBase = Montage.create(ModifierToolBase,
20{
21 _inLocalMode: { value: true, enumerable: true },
22
23 HandleDoubleClick : {
24 value : function()
25 {
26 }
27 },
28
29 modifyElements : {
30 value : function(data, event)
31 {
32 // form the translation vector and post translate the matrix by it.
33 var delta = vecUtils.vecSubtract( 3, data.pt1, data.pt0 );
34 if(this._handleMode !== null)
35 {
36 switch(this._handleMode)
37 {
38 case 0:
39 delta[1] = 0;
40 delta[2] = 0;
41 break;
42 case 1:
43 delta[0] = 0;
44 delta[2] = 0;
45 break;
46 case 2:
47 delta[0] = 0;
48 delta[1] = 0;
49 break;
50 }
51
52 this._updateDelta(delta, this._handleMode);
53 }
54 else if(this._mode === 1)
55 {
56 delta[2] = delta[1];
57 delta[0] = 0;
58 delta[1] = 0;
59 }
60
61 var transMat = Matrix.Translation( delta );
62 if(this._inLocalMode && (this._targets.length === 1) )
63 {
64 this._translateLocally(transMat);
65 }
66 else
67 {
68 this._translateGlobally(transMat);
69 }
70 }
71 },
72
73
74 Reset : {
75 value : function()
76 {
77 var item,
78 elt,
79 mat,
80 dist,
81 newStyles = [],
82 previousStyles = [],
83 len = this._targets.length;
84 for(var i = 0; i < len; i++)
85 {
86 // Reset to the identity matrix but retain the rotation values
87 item = this._targets[i];
88 elt = item.elt;
89 mat = item.mat.slice(0);
90 mat[12] = 0;
91 mat[13] = 0;
92 mat[14] = 0;
93
94 dist = this._undoArray[i].dist;
95
96 var previousStyleStr = {dist:dist, mat:item.mat};
97
98 var newStyleStr = {dist:dist, mat:mat};
99
100 previousStyles.push(previousStyleStr);
101 newStyles.push(newStyleStr);
102 }
103
104 ElementsMediator.set3DProperties(this.application.ninja.selectedElements,
105 newStyles,
106 "Change",
107 "translateTool",
108 previousStyles
109 );
110
111 this.isDrawing = false;
112 this.endDraw(event);
113
114// this.UpdateSelection(true);
115 this.Configure(true);
116 }
117 },
118
119 // We will only translate single elements locally
120 _translateLocally: {
121 value: function (transMat) {
122 var mat = glmat4.multiply(this._startMat, transMat, []);
123 viewUtils.setMatrixForElement( this._target, mat, true );
124 if(this._mode !== 1)
125 {
126 this._startMat = mat;
127 }
128 }
129 },
130
131 _translateGlobally: {
132 value: function (transMat) {
133 var len = this._targets.length,
134 i = 0,
135 item,
136 elt,
137 curMat,
138 matInv = glmat4.inverse(this._startMat, []),
139 nMat = glmat4.multiply(transMat, this._startMat, [] ),
140 qMat = glmat4.multiply(matInv, nMat, []);
141
142 var shouldUpdateStartMat = true;
143
144 if(this._clickedObject === this.application.ninja.currentDocument.documentRoot)
145 {
146 shouldUpdateStartMat = false;
147 }
148 else if(this._mode !== 1)
149 {
150 this._startMat = nMat;
151 }
152
153 for(i = 0; i < len; i++)
154 {
155 item = this._targets[i];
156 elt = item.elt;
157 curMat = item.mat;
158
159 glmat4.multiply(curMat, qMat, curMat);
160
161 viewUtils.setMatrixForElement( elt, curMat, true);
162
163 if(shouldUpdateStartMat)
164 {
165 this._targets[i].mat = curMat;
166 }
167 }
168 }
169 },
170
171 _updateTargets: {
172 value: function(addToUndoStack) {
173 var newStyles = [],
174 previousStyles = [],
175 len = this.application.ninja.selectedElements.length;
176 this._targets = [];
177 for(var i = 0; i < len; i++)
178 {
179 var elt = this.application.ninja.selectedElements[i]._element;
180
181 var curMat = viewUtils.getMatrixFromElement(elt);
182 var curMatInv = glmat4.inverse(curMat, []);
183
184 this._targets.push({elt:elt, mat:curMat, matInv:curMatInv});
185 if(addToUndoStack)
186 {
187 var previousStyleStr = {dist:this._undoArray[i].dist, mat:MathUtils.scientificToDecimal(this._undoArray[i].mat.slice(0), 5)};
188
189 var newStyleStr = {dist:viewUtils.getPerspectiveDistFromElement(elt), mat:MathUtils.scientificToDecimal(curMat, 5)};
190
191 previousStyles.push(previousStyleStr);
192 newStyles.push(newStyleStr);
193 }
194 }
195 if(addToUndoStack)
196 {
197 ElementsMediator.set3DProperties(this.application.ninja.selectedElements,
198 newStyles,
199 "Change",
200 "translateTool",
201 previousStyles
202 );
203 }
204 // Save previous value for undo/redo
205 this._undoArray = [];
206 for(i = 0, len = this._targets.length; i < len; i++)
207 {
208 var elt = this._targets[i].elt;
209 var _mat = viewUtils.getMatrixFromElement(elt);
210 var _dist = viewUtils.getPerspectiveDistFromElement(elt);
211 this._undoArray.push({mat:_mat, dist:_dist});
212 }
213
214 }
215 },
216
217 HandleAltKeyDown: {
218 value: function(event) {
219 this._inLocalMode = !this._inLocalMode;
220 this.DrawHandles();
221 }
222 },
223
224 HandleAltKeyUp: {
225 value: function(event) {
226 this._inLocalMode = !this._inLocalMode;
227 this.DrawHandles();
228 }
229 },
230
231 handleScroll: {
232 value: function(event) {
233 this.captureSelectionDrawn(null);
234 }
235 },
236