--- /dev/null
+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