]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/property/QuatPropertyManipulator.java
Force zero offset for concentric reducers
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / property / QuatPropertyManipulator.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g3d.property;\r
13 \r
14 import javax.vecmath.AxisAngle4d;\r
15 import javax.vecmath.Quat4d;\r
16 import javax.vecmath.Vector3d;\r
17 \r
18 import org.simantics.g3d.Activator;\r
19 import org.simantics.g3d.math.EulerTools;\r
20 import org.simantics.g3d.math.EulerTools.Order;\r
21 import org.simantics.g3d.math.MathTools;\r
22 import org.simantics.g3d.preferences.PreferenceConstants;\r
23 \r
24 public class QuatPropertyManipulator implements PropertyManipulator {\r
25         \r
26         ValueProvider provider;\r
27         protected Object input;\r
28         \r
29         enum EditType {QUATERNION,AXIS_ANGLE,EULER};\r
30         \r
31         EditType type = EditType.QUATERNION;\r
32         Order order;\r
33         \r
34         boolean editMode;\r
35         Object editValue = null;\r
36         \r
37         public QuatPropertyManipulator(ValueProvider provider, Object input) {\r
38                 this.provider = provider;\r
39                 this.input = input;\r
40                 \r
41                 String set = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.ORIENTATION_PRESENTATION);\r
42                 if ("quat".equals(set)) {\r
43                         type = EditType.QUATERNION;\r
44                 } else if ("aa".equals(set)) {\r
45                         type = EditType.AXIS_ANGLE;\r
46                 } else if ("euler".equals(set)) {\r
47                         type = EditType.EULER;\r
48                         String eulerOrder = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.EULER_ANGLE_ORDER);\r
49                         order = Order.valueOf(eulerOrder);\r
50                         if (order == null)\r
51                                 order = Order.YXZ;\r
52                 }\r
53         }\r
54         \r
55         @Override\r
56         public String getDescription(int i) {\r
57                 switch (type) {\r
58                 case QUATERNION:\r
59                         if (i == 0)\r
60                                 return "X";\r
61                         if (i == 1)\r
62                                 return "Y";\r
63                         if (i == 2)\r
64                                 return "Z";\r
65                         if (i == 3)\r
66                                 return "W";\r
67                         break;\r
68                 case AXIS_ANGLE:\r
69                         if (i == 0)\r
70                                 return "X";\r
71                         if (i == 1)\r
72                                 return "Y";\r
73                         if (i == 2)\r
74                                 return "Z";\r
75                         if (i == 3)\r
76                                 return "Angle";\r
77                         break;\r
78                 case EULER:\r
79                         if (i > 3)\r
80                                 return null;\r
81                         return order.toString().substring(i, i+1);\r
82                 default:\r
83                         break;\r
84                 }\r
85                 return null;\r
86         }\r
87         \r
88         @Override\r
89         public int getValueCount() {\r
90                 switch (type) {\r
91                 case QUATERNION:\r
92                         return 4;\r
93                 case AXIS_ANGLE:\r
94                         return 4;\r
95                 case EULER:\r
96                         return 3;\r
97                 default:\r
98                         break;\r
99                 }\r
100                 return 0;\r
101         }\r
102         \r
103         @Override\r
104         public String getValue(int i) {\r
105                 try {\r
106                         Quat4d q = (Quat4d) provider.getValue(input);\r
107                         double d = 0;\r
108                         switch (type) {\r
109                         case QUATERNION:\r
110                                 if (editMode)\r
111                                         q = (Quat4d)editValue;\r
112                                 else\r
113                                         q = new Quat4d(q);\r
114                                 \r
115                                 if (i == 0)\r
116                                         d = q.x;\r
117                                 if (i == 1)\r
118                                         d = q.y;\r
119                                 if (i == 2)\r
120                                         d = q.z;\r
121                                 if (i == 3)\r
122                                         d = q.w;\r
123                                 break;\r
124                                 \r
125                         case AXIS_ANGLE: {\r
126                                 AxisAngle4d aa;\r
127                                 if (editMode)\r
128                                         aa = (AxisAngle4d)editValue;\r
129                                 else {\r
130                                         aa = new AxisAngle4d();\r
131                                         aa.set(q);\r
132                                 }\r
133                                 if (i == 0)\r
134                                         d = aa.x;\r
135                                 if (i == 1)\r
136                                         d = aa.y;\r
137                                 if (i == 2)\r
138                                         d = aa.z;\r
139                                 if (i == 3)\r
140                                         d = MathTools.radToDeg(aa.angle);\r
141                                 break;\r
142                         }\r
143                         case EULER: {\r
144                                 Vector3d aa;\r
145                                 if (editMode)\r
146                                         aa = (Vector3d)editValue;\r
147                                 else\r
148                                         aa = EulerTools.getEulerFromQuat(order, q);//MathTools.getEuler(q);\r
149                                 if (i == 0)\r
150                                         d = aa.x;\r
151                                 if (i == 1)\r
152                                         d = aa.y;\r
153                                 if (i == 2)\r
154                                         d = aa.z;\r
155                                 d = MathTools.radToDeg(d);\r
156                         }\r
157 \r
158                         default:\r
159                                 break;\r
160                         }\r
161                         return Double.toString(d);\r
162                 } catch (Exception e) {\r
163                         return null;\r
164                 }\r
165         }\r
166         \r
167         \r
168         \r
169         @Override\r
170         public String setValue(String value, int i) {\r
171                 try {\r
172                         Double d = Double.parseDouble(value);\r
173                         Quat4d q = (Quat4d) provider.getValue(input);\r
174                         switch (type) {\r
175                         case QUATERNION:\r
176                                 if (editMode)\r
177                                         q = (Quat4d)editValue;\r
178                                 else\r
179                                         q = new Quat4d(q);\r
180                                 \r
181                                 if (i == 0)\r
182                                         q.x = d;\r
183                                 if (i == 1)\r
184                                         q.y = d;\r
185                                 if (i == 2)\r
186                                         q.z = d;\r
187                                 if (i == 3)\r
188                                         q.w = d;\r
189                                 break;\r
190                         case AXIS_ANGLE: {\r
191                                 AxisAngle4d aa;\r
192                                 if (editMode)\r
193                                         aa = (AxisAngle4d) editValue;\r
194                                 else {\r
195                                         aa = new AxisAngle4d();\r
196                                         aa.set(q);\r
197                                 }\r
198                                 if (i == 0)\r
199                                         aa.x = d;\r
200                                 if (i == 1)\r
201                                         aa.y = d;\r
202                                 if (i == 2)\r
203                                         aa.z = d;\r
204                                 if (i == 3)\r
205                                         aa.angle = MathTools.degToRad(d);\r
206                                 q = new Quat4d();\r
207                                 MathTools.getQuat(aa,q);\r
208                                 break;\r
209                         }\r
210                         case EULER: {\r
211                                 Vector3d e;\r
212                                 if (editMode)\r
213                                         e = (Vector3d)editValue;\r
214                                 else \r
215                                         e = EulerTools.getEulerFromQuat(order, q);//MathTools.getEuler(q);\r
216                                 d = MathTools.degToRad(d);\r
217                                 if (i == 0)\r
218                                         e.x = d;\r
219                                 if (i == 1)\r
220                                         e.y = d;\r
221                                 if (i == 2)\r
222                                         e.z = d;\r
223                                 q = EulerTools.getQuatFromEuler(order, e);//MathTools.getQuat(e);\r
224                         }\r
225                         default:\r
226                                 break;\r
227                         }\r
228                         q.normalize();\r
229                         setValue(q);\r
230                 } catch (Exception e) {\r
231                         return e.getMessage();\r
232                 }\r
233                 return null;\r
234         }\r
235         \r
236         protected void setValue(Quat4d q) throws Exception {\r
237                 provider.setValue(input, q);\r
238         }\r
239         \r
240         private void storeEditValue() {\r
241                 try {\r
242                         Quat4d q = (Quat4d) provider.getValue(input);\r
243                         switch (type) {\r
244                         case QUATERNION:\r
245                                 editValue = q;\r
246                                 break;\r
247                         case AXIS_ANGLE:\r
248                                 AxisAngle4d aa = new AxisAngle4d();\r
249                                 aa.set(q);\r
250                                 editValue = aa;\r
251                                 break;\r
252                         case EULER:\r
253                                 Vector3d e = EulerTools.getEulerFromQuat(order, q);\r
254                                 editValue = e;\r
255                                 break;\r
256                         }\r
257                 } catch (Exception e) {\r
258                         \r
259                 }\r
260         }\r
261         \r
262         @Override\r
263         public boolean getEditMode() {\r
264                 return editMode;\r
265         }\r
266         \r
267         @Override\r
268         public void setEditMode(boolean b) {\r
269                 editMode = b;\r
270                 if (editMode) {\r
271                         storeEditValue();\r
272                 }\r
273                 \r
274         }\r
275 \r
276 }\r