]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - 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
diff --git a/org.simantics.g3d/src/org/simantics/g3d/property/QuatPropertyManipulator.java b/org.simantics.g3d/src/org/simantics/g3d/property/QuatPropertyManipulator.java
new file mode 100644 (file)
index 0000000..ca792ef
--- /dev/null
@@ -0,0 +1,265 @@
+package org.simantics.g3d.property;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Quat4d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.simantics.g3d.Activator;\r
+import org.simantics.g3d.math.EulerTools;\r
+import org.simantics.g3d.math.EulerTools.Order;\r
+import org.simantics.g3d.math.MathTools;\r
+import org.simantics.g3d.preferences.PreferenceConstants;\r
+\r
+public class QuatPropertyManipulator implements PropertyManipulator {\r
+       \r
+       ValueProvider provider;\r
+       protected Object input;\r
+       \r
+       enum EditType {QUATERNION,AXIS_ANGLE,EULER};\r
+       \r
+       EditType type = EditType.QUATERNION;\r
+       Order order;\r
+       \r
+       boolean editMode;\r
+       Object editValue = null;\r
+       \r
+       public QuatPropertyManipulator(ValueProvider provider, Object input) {\r
+               this.provider = provider;\r
+               this.input = input;\r
+               \r
+               String set = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.ORIENTATION_PRESENTATION);\r
+               if ("quat".equals(set)) {\r
+                       type = EditType.QUATERNION;\r
+               } else if ("aa".equals(set)) {\r
+                       type = EditType.AXIS_ANGLE;\r
+               } else if ("euler".equals(set)) {\r
+                       type = EditType.EULER;\r
+                       String eulerOrder = Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.EULER_ANGLE_ORDER);\r
+                       order = Order.valueOf(eulerOrder);\r
+                       if (order == null)\r
+                               order = Order.YXZ;\r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public String getDescription(int i) {\r
+               switch (type) {\r
+               case QUATERNION:\r
+                       if (i == 0)\r
+                               return "X";\r
+                       if (i == 1)\r
+                               return "Y";\r
+                       if (i == 2)\r
+                               return "Z";\r
+                       if (i == 3)\r
+                               return "W";\r
+                       break;\r
+               case AXIS_ANGLE:\r
+                       if (i == 0)\r
+                               return "X";\r
+                       if (i == 1)\r
+                               return "Y";\r
+                       if (i == 2)\r
+                               return "Z";\r
+                       if (i == 3)\r
+                               return "Angle";\r
+                       break;\r
+               case EULER:\r
+                       if (i > 3)\r
+                               return null;\r
+                       return order.toString().substring(i, i+1);\r
+               default:\r
+                       break;\r
+               }\r
+               return null;\r
+       }\r
+       \r
+       @Override\r
+       public int getValueCount() {\r
+               switch (type) {\r
+               case QUATERNION:\r
+                       return 4;\r
+               case AXIS_ANGLE:\r
+                       return 4;\r
+               case EULER:\r
+                       return 3;\r
+               default:\r
+                       break;\r
+               }\r
+               return 0;\r
+       }\r
+       \r
+       @Override\r
+       public String getValue(int i) {\r
+               try {\r
+                       Quat4d q = (Quat4d) provider.getValue(input);\r
+                       double d = 0;\r
+                       switch (type) {\r
+                       case QUATERNION:\r
+                               if (editMode)\r
+                                       q = (Quat4d)editValue;\r
+                               else\r
+                                       q = new Quat4d(q);\r
+                               \r
+                               if (i == 0)\r
+                                       d = q.x;\r
+                               if (i == 1)\r
+                                       d = q.y;\r
+                               if (i == 2)\r
+                                       d = q.z;\r
+                               if (i == 3)\r
+                                       d = q.w;\r
+                               break;\r
+                               \r
+                       case AXIS_ANGLE: {\r
+                               AxisAngle4d aa;\r
+                               if (editMode)\r
+                                       aa = (AxisAngle4d)editValue;\r
+                               else {\r
+                                       aa = new AxisAngle4d();\r
+                                       aa.set(q);\r
+                               }\r
+                               if (i == 0)\r
+                                       d = aa.x;\r
+                               if (i == 1)\r
+                                       d = aa.y;\r
+                               if (i == 2)\r
+                                       d = aa.z;\r
+                               if (i == 3)\r
+                                       d = MathTools.radToDeg(aa.angle);\r
+                               break;\r
+                       }\r
+                       case EULER: {\r
+                               Vector3d aa;\r
+                               if (editMode)\r
+                                       aa = (Vector3d)editValue;\r
+                               else\r
+                                       aa = EulerTools.getEulerFromQuat(order, q);//MathTools.getEuler(q);\r
+                               if (i == 0)\r
+                                       d = aa.x;\r
+                               if (i == 1)\r
+                                       d = aa.y;\r
+                               if (i == 2)\r
+                                       d = aa.z;\r
+                               d = MathTools.radToDeg(d);\r
+                       }\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+                       return Double.toString(d);\r
+               } catch (Exception e) {\r
+                       return null;\r
+               }\r
+       }\r
+       \r
+       \r
+       \r
+       @Override\r
+       public String setValue(String value, int i) {\r
+               try {\r
+                       Double d = Double.parseDouble(value);\r
+                       Quat4d q = (Quat4d) provider.getValue(input);\r
+                       switch (type) {\r
+                       case QUATERNION:\r
+                               if (editMode)\r
+                                       q = (Quat4d)editValue;\r
+                               else\r
+                                       q = new Quat4d(q);\r
+                               \r
+                               if (i == 0)\r
+                                       q.x = d;\r
+                               if (i == 1)\r
+                                       q.y = d;\r
+                               if (i == 2)\r
+                                       q.z = d;\r
+                               if (i == 3)\r
+                                       q.w = d;\r
+                               break;\r
+                       case AXIS_ANGLE: {\r
+                               AxisAngle4d aa;\r
+                               if (editMode)\r
+                                       aa = (AxisAngle4d) editValue;\r
+                               else {\r
+                                       aa = new AxisAngle4d();\r
+                                       aa.set(q);\r
+                               }\r
+                               if (i == 0)\r
+                                       aa.x = d;\r
+                               if (i == 1)\r
+                                       aa.y = d;\r
+                               if (i == 2)\r
+                                       aa.z = d;\r
+                               if (i == 3)\r
+                                       aa.angle = MathTools.degToRad(d);\r
+                               q = new Quat4d();\r
+                               MathTools.getQuat(aa,q);\r
+                               break;\r
+                       }\r
+                       case EULER: {\r
+                               Vector3d e;\r
+                               if (editMode)\r
+                                       e = (Vector3d)editValue;\r
+                               else \r
+                                       e = EulerTools.getEulerFromQuat(order, q);//MathTools.getEuler(q);\r
+                               d = MathTools.degToRad(d);\r
+                               if (i == 0)\r
+                                       e.x = d;\r
+                               if (i == 1)\r
+                                       e.y = d;\r
+                               if (i == 2)\r
+                                       e.z = d;\r
+                               q = EulerTools.getQuatFromEuler(order, e);//MathTools.getQuat(e);\r
+                       }\r
+                       default:\r
+                               break;\r
+                       }\r
+                       q.normalize();\r
+                       setValue(q);\r
+               } catch (Exception e) {\r
+                       return e.getMessage();\r
+               }\r
+               return null;\r
+       }\r
+       \r
+       protected void setValue(Quat4d q) throws Exception {\r
+               provider.setValue(input, q);\r
+       }\r
+       \r
+       private void storeEditValue() {\r
+               try {\r
+                       Quat4d q = (Quat4d) provider.getValue(input);\r
+                       switch (type) {\r
+                       case QUATERNION:\r
+                               editValue = q;\r
+                               break;\r
+                       case AXIS_ANGLE:\r
+                               AxisAngle4d aa = new AxisAngle4d();\r
+                               aa.set(q);\r
+                               editValue = aa;\r
+                               break;\r
+                       case EULER:\r
+                               Vector3d e = EulerTools.getEulerFromQuat(order, q);\r
+                               editValue = e;\r
+                               break;\r
+                       }\r
+               } catch (Exception e) {\r
+                       \r
+               }\r
+       }\r
+       \r
+       @Override\r
+       public boolean getEditMode() {\r
+               return editMode;\r
+       }\r
+       \r
+       @Override\r
+       public void setEditMode(boolean b) {\r
+               editMode = b;\r
+               if (editMode) {\r
+                       storeEditValue();\r
+               }\r
+               \r
+       }\r
+\r
+}\r