--- /dev/null
+package org.simantics.g3d.scenegraph;\r
+\r
+import javax.vecmath.Quat4d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.simantics.g3d.ontology.G3D;\r
+import org.simantics.g3d.property.annotations.GetPropertyValue;\r
+import org.simantics.g3d.property.annotations.PropertyContributor;\r
+import org.simantics.g3d.property.annotations.SetPropertyValue;\r
+import org.simantics.g3d.scenegraph.base.INode;\r
+import org.simantics.g3d.scenegraph.base.Node;\r
+import org.simantics.g3d.tools.NodeTools;\r
+import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
+import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
+\r
+\r
+@PropertyContributor\r
+public class G3DNode extends Node implements IG3DNode {\r
+ \r
+ private Vector3d position = new Vector3d();\r
+ private Quat4d orientation = new Quat4d(0,0,0,1);\r
+ \r
+ @Override\r
+ @GetPropertyValue(value = G3D.URIs.hasOrientation, tabId = "Transform", name = "Orientation")\r
+ public Quat4d getOrientation() {\r
+ return orientation;\r
+ }\r
+ \r
+ @RelatedGetValue(G3D.URIs.hasOrientation)\r
+ public double[] getOrientationArr() {\r
+ double arr[] = new double[4];\r
+ orientation.get(arr);\r
+ return arr;\r
+ \r
+ }\r
+ \r
+ @Override\r
+ @GetPropertyValue(value = G3D.URIs.hasPosition, tabId = "Transform", name = "Position")\r
+ public Vector3d getPosition() {\r
+ return position;\r
+ }\r
+ \r
+ @RelatedGetValue(G3D.URIs.hasPosition)\r
+ public double[] getPositionArr() {\r
+ double arr[] = new double[3];\r
+ position.get(arr);\r
+ return arr;\r
+ }\r
+ \r
+ @Override\r
+ @SetPropertyValue(G3D.URIs.hasOrientation)\r
+ public void setOrientation(Quat4d orientation) {\r
+ assert(orientation != null);\r
+ this.orientation = orientation;\r
+ \r
+ firePropertyChanged(G3D.URIs.hasOrientation);\r
+ }\r
+ \r
+ @RelatedSetValue(G3D.URIs.hasOrientation)\r
+ public void setOrientation(double[] arr) {\r
+ if (arr == null)\r
+ return;\r
+ setOrientation(new Quat4d(arr));\r
+ }\r
+ \r
+ @Override\r
+ @SetPropertyValue(G3D.URIs.hasPosition)\r
+ public void setPosition(Vector3d position) {\r
+ assert(position != null);\r
+ this.position = position;\r
+ \r
+ firePropertyChanged(G3D.URIs.hasPosition);\r
+ }\r
+ \r
+ @RelatedSetValue(G3D.URIs.hasPosition)\r
+ public void setPosition(double[] arr) {\r
+ if (arr == null)\r
+ return;\r
+ setPosition(new Vector3d(arr));\r
+ }\r
+ \r
+ @Override\r
+ @GetPropertyValue(value = G3D.URIs.hasWorldPosition, tabId = "Transform", name = "World Position")\r
+ public Vector3d getWorldPosition() {\r
+ IG3DNode parent = (IG3DNode)getParent();\r
+ if (parent == null)\r
+ return position;\r
+ return NodeTools.getWorldPosition(parent, new Vector3d(position));\r
+ }\r
+ \r
+ \r
+ public Vector3d getWorldPosition(Vector3d localPosition) {\r
+ return NodeTools.getWorldPosition(this,localPosition);\r
+ }\r
+\r
+ \r
+ @Override\r
+ @GetPropertyValue(value = G3D.URIs.hasWorldOrientation, tabId = "Transform", name = "World Orientation")\r
+ public Quat4d getWorldOrientation() {\r
+ return getWorldOrientation(new Quat4d(orientation));\r
+ }\r
+ \r
+ public Quat4d getWorldOrientation(Quat4d localOrientation) {\r
+ IG3DNode parent = (IG3DNode)getParent();\r
+ if (parent == null)\r
+ return localOrientation;\r
+ return NodeTools.getWorldOrientation(parent, localOrientation);\r
+ }\r
+ \r
+ @Override\r
+ public Vector3d getLocalPosition(Vector3d worldPosition) {\r
+ IG3DNode parent = (IG3DNode)getParent();\r
+ if (parent == null)\r
+ return worldPosition;\r
+ return NodeTools.getLocalPosition(parent,new Vector3d(worldPosition));\r
+ }\r
+ \r
+ @Override\r
+ public Quat4d getLocalOrientation(Quat4d worldOrientation) {\r
+ IG3DNode parent = (IG3DNode)getParent();\r
+ if (parent == null)\r
+ return worldOrientation;\r
+ return NodeTools.getLocalOrientation(parent, new Quat4d(worldOrientation));\r
+ }\r
+ \r
+ @Override\r
+ @SetPropertyValue(G3D.URIs.hasWorldPosition)\r
+ public void setWorldPosition(Vector3d position) {\r
+ Vector3d localPos = getLocalPosition(position);\r
+ setPosition(localPos);\r
+ }\r
+ \r
+ @Override\r
+ @SetPropertyValue(G3D.URIs.hasWorldOrientation)\r
+ public void setWorldOrientation(Quat4d orientation) {\r
+ Quat4d localOr = getLocalOrientation(orientation);\r
+ setOrientation(localOr);\r
+ }\r
+ \r
+ @Override\r
+ public Object getAdapter(Class adapter) {\r
+ if (INode.class == adapter)\r
+ return this;\r
+ if (IG3DNode.class == adapter)\r
+ return this;\r
+ return null;\r
+ }\r
+\r
+}\r