aboutsummaryrefslogtreecommitdiff
path: root/js/tools/Rotate3DToolBase.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/tools/Rotate3DToolBase.js')
-rwxr-xr-xjs/tools/Rotate3DToolBase.js506
1 files changed, 383 insertions, 123 deletions
diff --git a/js/tools/Rotate3DToolBase.js b/js/tools/Rotate3DToolBase.js
index 696408bf..4fa8657e 100755
--- a/js/tools/Rotate3DToolBase.js
+++ b/js/tools/Rotate3DToolBase.js
@@ -21,6 +21,153 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, {
21 21
22 _inLocalMode: { value: true, enumerable: true }, 22 _inLocalMode: { value: true, enumerable: true },
23 23
24 rotateStage: {
25 value: false
26 },
27
28 initializeSnapping : {
29 value : function(event)
30 {
31// console.log( "initializeSnapping" );
32
33 var selectedElements = this.application.ninja.selectedElements;
34 if(this.rotateStage) {
35 selectedElements = [this.application.ninja.currentDocument.documentRoot];
36 }
37
38 this._mouseDownHitRec = null;
39 this._mouseUpHitRec = null;
40
41 snapManager.clearAvoidList();
42 snapManager.clearDragPlane();
43
44 // the translate tool does snap align to the bounds of the object only.
45 // turn off snap align to the cursor. This needs to be re-enabled in the mouse up method
46 snapManager.enableSnapAlign( false );
47
48 // snap to element and snap to grid are conditionally enabled based
49 // on the snap results of the mouse down. enable everything for the first snap
50 this._snapToElements = snapManager.elementSnapEnabledAppLevel();
51 this._snapToGrid = snapManager.gridSnapEnabledAppLevel();
52
53 this._dragPlane = null;
54 this._clickedOnStage = false;
55 var do3DSnap = true;
56
57 if(this._handleMode === null)
58 {
59 snapManager.enableElementSnap ( true );
60 snapManager.enableGridSnap ( true );
61 }
62// else
63// {
64// this._delta = null;
65 // special case for z-translation
66// if(this._handleMode === 0)
67// {
68// this._dragPlane = viewUtils.getNormalToUnprojectedElementPlane(this._target);
69// snapManager.setupDragPlaneFromPlane(this._dragPlane);
70// do3DSnap = false;
71
72// snapManager.enableElementSnap ( false );
73// snapManager.enableGridSnap ( false );
74// }
75// }
76
77 if (selectedElements.length)
78 {
79 var point = webkitConvertPointFromPageToNode(this.application.ninja.stage.canvas,
80 new WebKitPoint(event.pageX, event.pageY));
81
82 // do the snap before setting up the avoid list to allow
83 // a snap on the mouse down
84 var hitRec = snapManager.snap(point.x, point.y, do3DSnap);
85
86// if(this._handleMode === 2)
87// {
88// // translate z doesn't snap to element so hitRec's element will always be different
89// // from what the browser says we clicked on. So, skip this check.
90// }
91// else
92// {
93// // Check that hitRec's element matches element that browser says we clicked on
94// // TODO - This is still not working when using a handle that is on top of an
95// // element that is not currently selected
96// var elt = this.application.ninja.stage.GetSelectableElement(event);
97// if(elt && (elt !== hitRec.getElement()))
98// {
99// hitRec = snapManager.findHitRecordForElement(elt);
100// }
101// if(elt === this.application.ninja.currentSelectedContainer)
102// {
103// this._clickedOnStage = true;
104// }
105// }
106
107 // we don't want to snap to selected objects during the drag
108// var len = this._targets.length;
109// for(var i=0; i<len; i++)
110// {
111// snapManager.addToAvoidList( this._targets[i].elt );
112// }
113 if (hitRec)
114 {
115 // disable snap attributes
116 if (hitRec.getType() == hitRec.SNAP_TYPE_ELEMENT)
117 {
118 this._snapToElements = false;
119 this._snapToGrid = false;
120 }
121 else if (hitRec.getType() == hitRec.SNAP_TYPE_ELEMENT_CENTER)
122 {
123 snapManager.enableSnapAlign( snapManager.snapAlignEnabledAppLevel() );
124 }
125
126 if(this._handleMode === 0)
127 this.clickedObject = this._target;
128
129 // parameterize the snap point on the target
130 this._snapParam = this.parameterizeSnap( hitRec );
131
132 if(!this._dragPlane)
133 {
134 if (selectedElements.length === 1)
135 {
136 this._dragPlane = viewUtils.getUnprojectedElementPlane(this._clickedObject);
137 snapManager.setupDragPlaneFromPlane(this._dragPlane);
138 }
139 else
140 {
141 this._dragPlane = snapManager.setupDragPlanes( hitRec, true );
142 }
143
144 }
145
146 // no quadrant snapping for the rotate tool
147 this._shouldUseQuadPt = false;
148
149 var wpHitRec = hitRec.convertToWorkingPlane( this._dragPlane );
150 this._mouseDownHitRec = wpHitRec;
151 this._mouseUpHitRec = null;
152
153 var pt = hitRec.getScreenPoint();
154 this.downPoint.x = pt[0];
155 this.downPoint.y = pt[1];
156 this.downPoint.z = pt[2];
157
158 // TODO - need to figure out snapManager dependency by drawUtils.
159 // For now, bypassing by calling snapManager.drawLastHit();
160// drawUtils.refreshDisplay();
161// snapManager.drawLastHit();
162 }
163 }
164 else
165 {
166 this.target = null;
167 }
168 }
169 },
170
24 drawWithoutSnapping: 171 drawWithoutSnapping:
25 { 172 {
26 value: function(event) 173 value: function(event)
@@ -42,6 +189,33 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, {
42 } 189 }
43 }, 190 },
44 191
192 HandleMouseMove: {
193 value: function(event) {
194 if(this._escape) {
195 this._escape = false;
196 this.isDrawing = true;
197 }
198
199 if(this.isDrawing) {
200 this._hasDraw = true; // Flag for position of element
201 this.doDraw(event);
202 } else {
203 this._showFeedbackOnMouseMove(event);
204 if(this._canSnap)
205 {
206 this.doSnap(event);
207 }
208 }
209
210 this.DrawHandles(this._delta);
211
212 if(this._canSnap)
213 {
214 snapManager.drawLastHit();
215 }
216 }
217 },
218
45 modifyElements: { 219 modifyElements: {
46 value: function(data, event) { 220 value: function(data, event) {
47 var mat, 221 var mat,
@@ -49,24 +223,42 @@ exports.Rotate3DToolBase = Montage.create(ModifierToolBase, {
49 pt0 = data.pt0, 223 pt0 = data.pt0,
50 pt1 = data.pt1; 224 pt1 = data.pt1;
51 225
226 var selectedElements = this.application.ninja.selectedElements;
227 if(this.rotateStage) {
228 selectedElements = [this.application.ninja.currentDocument.documentRoot];
229 }
230
52 if(this._handleMode !== null) 231 if(this._handleMode !== null)
53 { 232 {
54 if(this._activateOriginHandle) 233 if(this._activateOriginHandle)
55 { 234 {
56 // move the transform origin handle 235 // move the transform origin handle directly to the snap point (pt1)
57 var dx = pt1.x - pt0.x; 236 this._origin[0] = pt1.x;
58 var dy = pt1.y - pt0.y; 237 this._origin[1] = pt1.y;
59 this._origin[0] += dx; 238 this._origin[2] = pt1.z;
60 this._origin[1] += dy; 239
240 var sw2gMat = viewUtils.getStageWorldToGlobalMatrix();
241 var g2swMat = glmat4.inverse( sw2gMat, [] );
242 var swOrigin = MathUtils.transformAndDivideHomogeneousPoint( this._origin, g2swMat );
243 //console.log( "modifyElements, _origin: " + this._origin + ", in stageWorld: " + swOrigin );
61 244
62 var len = this._targets.length; 245 var len = selectedElements.length;
63 if(len === 1) 246 if(len === 1)
64 { 247 {
65 this._startOriginArray[0][0] += dx; 248 var elt = selectedElements[0];
66 this._startOriginArray[0][1] += dy; 249 var g2lMat = elt.elementModel.getProperty("g2l");
250 var localOrigin = MathUtils.transformAndDivideHomogeneousPoint( this._origin, g2lMat );
251
252 viewUtils.pushViewportObj( elt );
253 var viewOrigin = viewUtils.screenToView( localOrigin[0], localOrigin[1], localOrigin[2] );