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