+package org.simantics.g3d.vtk.utils;\r
+\r
+import java.util.Collection;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Matrix4d;\r
+import javax.vecmath.Point2d;\r
+import javax.vecmath.Point3d;\r
+import javax.vecmath.Quat4d;\r
+import javax.vecmath.Tuple3d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.simantics.g3d.math.MathTools;\r
+import org.simantics.g3d.math.Ray;\r
+\r
+import vtk.vtkMatrix4x4;\r
+import vtk.vtkProp3D;\r
+import vtk.vtkRenderer;\r
+\r
+public class vtkUtil {\r
+\r
+ public static Ray createMouseRay(vtkRenderer ren1, double x, double y) {\r
+ Point2d screenPos = new Point2d(x,y);\r
+ Point3d worldCoords = getWorldCoordinates(ren1, screenPos, 0);\r
+ Point3d worldCoords2 = getWorldCoordinates(ren1, screenPos, 1);\r
+ Vector3d dir = new Vector3d(worldCoords2);\r
+ dir.sub(worldCoords);\r
+ return new Ray(worldCoords, dir);\r
+ }\r
+ \r
+ public static Point3d getWorldCoordinates(vtkRenderer ren1, Point2d screenPosition, double zPos) {\r
+ \r
+ ren1.SetDisplayPoint(screenPosition.x, ren1.GetSize()[1]-screenPosition.y, zPos);\r
+ ren1.DisplayToWorld();\r
+ double world[] = ren1.GetWorldPoint(); \r
+\r
+ return new Point3d(world);\r
+ \r
+ }\r
+ \r
+ public static Point2d getScreenCoordinates(vtkRenderer ren1, Tuple3d worldPos) {\r
+ ren1.SetWorldPoint(worldPos.x, worldPos.y, worldPos.z, 0.0);\r
+ ren1.WorldToDisplay();\r
+ double screen[] = ren1.GetDisplayPoint();\r
+ \r
+ return new Point2d(screen);\r
+ \r
+ }\r
+\r
+ public static Matrix4d getMatrix(vtkMatrix4x4 ptm) {\r
+ Matrix4d mat = new Matrix4d();\r
+ for (int i = 0; i < 4; i++) {\r
+ for (int j = 0; j < 4; j++) {\r
+ mat.setElement(i, j, ptm.GetElement(i, j));\r
+ }\r
+ }\r
+\r
+ return mat;\r
+ }\r
+ \r
+ public static vtkMatrix4x4 getMatrix(Matrix4d m) {\r
+ vtkMatrix4x4 mat= new vtkMatrix4x4();\r
+ for (int i = 0; i < 4; i++) {\r
+ for (int j = 0; j < 4; j++) {\r
+ mat.SetElement(i, j, m.getElement(i, j));\r
+ }\r
+ }\r
+ return mat;\r
+ }\r
+ \r
+ public static void updateTransform(Collection<vtkProp3D> props, Vector3d pos, Quat4d q) {\r
+ AxisAngle4d aa = new AxisAngle4d();\r
+ aa.set(q);\r
+ updateTransform(props, pos, aa);\r
+ }\r
+ \r
+ public static void updateTransform(vtkProp3D actor, double pos[], AxisAngle4d aa) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ actor.SetPosition(pos);\r
+ }\r
+ \r
+ public static void updateTransform(vtkProp3D actor, AxisAngle4d aa) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ }\r
+ \r
+ \r
+ public static void updateTransform(Collection<vtkProp3D> props, Vector3d pos, AxisAngle4d aa) {\r
+ for (vtkProp3D actor : props) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ actor.SetPosition(pos.x, pos.y, pos.z);\r
+ }\r
+ }\r
+ \r
+ public static void updateTransform(Collection<vtkProp3D> props, Vector3d pos, AxisAngle4d aa, double scale) {\r
+ for (vtkProp3D actor : props) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ actor.SetScale(scale);\r
+ actor.SetPosition(pos.x,pos.y,pos.z);\r
+ }\r
+ }\r
+ \r
+ public static void updateTransform(vtkProp3D actor, Vector3d pos, AxisAngle4d aa, double scale) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ actor.SetScale(scale);\r
+ actor.SetPosition(pos.x,pos.y,pos.z);\r
+ }\r
+ \r
+ public static void updateTransform(vtkProp3D actor, Vector3d pos, AxisAngle4d aa, double scalex, double scaley, double scalez) {\r
+ actor.SetOrientation(0, 0, 0);\r
+ actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+ actor.SetScale(scalex,scaley, scalez);\r
+ actor.SetPosition(pos.x,pos.y,pos.z);\r
+ }\r
+}\r