--- /dev/null
+package org.simantics.g3d.vtk.gizmo;\r
+\r
+import java.util.Collection;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Tuple3d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.simantics.g3d.gizmo.Gizmo;\r
+import org.simantics.g3d.math.MathTools;\r
+\r
+import vtk.vtkProp;\r
+import vtk.vtkProp3D;\r
+import vtk.vtkRenderer;\r
+\r
+public abstract class vtkGizmo implements Gizmo<vtkProp> {\r
+\r
+ private vtkRenderer ren1;\r
+ private Collection<vtkProp> gizmo;\r
+ \r
+ private Tuple3d position;\r
+ private AxisAngle4d orientation;\r
+ private Tuple3d scale;\r
+ \r
+ @Override\r
+ public void attach(Object renderingPart) {\r
+ if (ren1 != null)\r
+ throw new RuntimeException("Gizmo is attached");\r
+ ren1 = (vtkRenderer)renderingPart;\r
+ attachActors();\r
+ }\r
+ \r
+ @Override\r
+ public void deattach() {\r
+ if (ren1 == null)\r
+ throw new RuntimeException("Gizmo is not attached");\r
+ deattachActors();\r
+ ren1 = null;\r
+ }\r
+ \r
+ public boolean isAttached() {\r
+ return (ren1 != null);\r
+ }\r
+ \r
+ protected void attachActors() {\r
+ gizmo = getGizmo();\r
+ for (vtkProp p : gizmo) {\r
+ ren1.AddActor(p);\r
+ }\r
+ if (position != null)\r
+ setPosition(position);\r
+ if (orientation != null)\r
+ setRotation(orientation);\r
+ if (scale != null)\r
+ setScale(scale);\r
+ }\r
+ \r
+ protected void deattachActors() {\r
+ for (vtkProp p : gizmo) {\r
+ ren1.RemoveActor(p);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public boolean isPartOf(vtkProp pickedObject) {\r
+ for (vtkProp prop : gizmo) {\r
+ if (prop.equals(pickedObject))\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ public void setPosition(Tuple3d position) {\r
+ this.position = position;\r
+ for (vtkProp p : gizmo) {\r
+ ((vtkProp3D)p).SetPosition(position.x, position.y, position.z);\r
+ }\r
+ }\r
+ \r
+ public void setRotation(AxisAngle4d q) {\r
+ this.orientation = q;\r
+ for (vtkProp p : gizmo) {\r
+ ((vtkProp3D)p).SetOrientation(0,0,0);\r
+ ((vtkProp3D)p).RotateWXYZ(MathTools.radToDeg(q.angle), q.x, q.y, q.z);\r
+ }\r
+ }\r
+ \r
+ \r
+ public void setScale(Tuple3d s) {\r
+ this.scale = s;\r
+ for (vtkProp p : gizmo) {\r
+ ((vtkProp3D)p).SetScale(s.x, s.y, s.z);\r
+ }\r
+ }\r
+ \r
+ public void setScale(double s) {\r
+ this.scale = new Vector3d(s,s,s);\r
+ for (vtkProp p : gizmo) {\r
+ ((vtkProp3D)p).SetScale(s, s, s);\r
+ }\r
+ }\r
+ \r
+ public abstract Collection<vtkProp> getGizmo();\r
+ \r
+// public double[] add(double[] color1, double[] color2) {\r
+// double[] result = new double[]{color1[0]+color2[0],color1[1],+color2[1],color1[2]+color2[2]};\r
+// return result;\r
+// }\r
+// \r
+// public double[] add(double[] color1, double[] color2, double[] color3) {\r
+// double[] result = new double[]{color1[0]+color2[0]+color3[0],color1[1],+color2[1]+color3[1],color1[2]+color2[2]+color3[2]};\r
+// return result;\r
+// }\r
+ \r
+ public double[] add(double[]... color) {\r
+ double result[] = new double[]{0,0,0};\r
+ for (double c[] : color) {\r
+ for (int i = 0; i < 3; i++)\r
+ result[i] += c[i];\r
+ }\r
+ \r
+ return result;\r
+ }\r
+ \r
+ \r
+ public vtkRenderer getRenderer() {\r
+ return ren1;\r
+ }\r
+ \r
+ \r
+ \r
+}\r