]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkEffect.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / utils / vtkEffect.java
diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkEffect.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkEffect.java
new file mode 100644 (file)
index 0000000..0d00c2a
--- /dev/null
@@ -0,0 +1,362 @@
+package org.simantics.g3d.vtk.utils;\r
+\r
+import javax.vecmath.AxisAngle4d;\r
+import javax.vecmath.Vector3d;\r
+\r
+import org.simantics.g3d.math.MathTools;\r
+import org.simantics.g3d.vtk.shape.IvtkVisualObject;\r
+\r
+import vtk.vtkActor;\r
+import vtk.vtkCamera;\r
+import vtk.vtkContourFilter;\r
+import vtk.vtkDataObject;\r
+import vtk.vtkOutlineFilter;\r
+import vtk.vtkOutlineSource;\r
+import vtk.vtkPolyData;\r
+import vtk.vtkPolyDataMapper;\r
+import vtk.vtkPolyDataSilhouette;\r
+import vtk.vtkProp3D;\r
+import vtk.vtkRenderWindow;\r
+import vtk.vtkRenderer;\r
+import vtk.vtkTransform;\r
+import vtk.vtkTransformPolyDataFilter;\r
+import vtk.vtkWindowToImageFilter;\r
+\r
+public class vtkEffect {\r
+\r
+       private static vtkRenderer tmpRenderer;\r
+       \r
+       public static vtkRenderer getRenderer() {\r
+               if (tmpRenderer == null)\r
+                       tmpRenderer = new vtkRenderer();\r
+               return tmpRenderer;\r
+       }\r
+       public static vtkActor createContour(vtkProp3D tmpProp) {\r
+               \r
+               vtkRenderer tmpRenderer = getRenderer();\r
+               tmpRenderer.SetBackground(1,1,1);\r
+               \r
+               \r
+               if (tmpProp instanceof IvtkVisualObject) {\r
+                       ((IvtkVisualObject)tmpProp).addToRenderer();\r
+               } else {\r
+                       tmpRenderer.AddActor(tmpProp);\r
+               }\r
+               \r
+               if (tmpProp instanceof vtkActor) {\r
+                       ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);\r
+               }\r
+               \r
+               \r
+               double bounds_data[] = tmpProp.GetBounds();\r
+               double center_data[] = tmpProp.GetCenter();\r
+               \r
+               tmpRenderer.ResetCamera();\r
+               tmpRenderer.GetActiveCamera().SetParallelProjection(1);\r
+               \r
+               vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();\r
+               tmpRenderWindow.SetOffScreenRendering(1);\r
+               tmpRenderWindow.AddRenderer(tmpRenderer);\r
+               tmpRenderWindow.Render();\r
+               \r
+               vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();\r
+               windowToImageFilter.SetInput(tmpRenderWindow);\r
+               windowToImageFilter.SetMagnification(2);\r
+               windowToImageFilter.Update();\r
+               \r
+               vtkContourFilter contourFilter = new vtkContourFilter();\r
+               contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());\r
+               \r
+               contourFilter.SetValue(0, 255);\r
+               contourFilter.Update();\r
+               \r
+               vtkPolyData contour = contourFilter.GetOutput();\r
+               \r
+               double bounds_contour[] = new double[6]; \r
+               double center_contour[] = new double[3];\r
+               double trans_x=0., trans_y=0., trans_z=0., ratio_x=0., ratio_y=0.;\r
+               contour.GetBounds(bounds_contour);\r
+        \r
+               ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);\r
+               ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);\r
+               \r
+               vtkTransform transform1 = new vtkTransform();\r
+               transform1.Scale(ratio_x,ratio_y,1);\r
+               \r
+               vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();\r
+               tFilter1.SetInput(contour);\r
+               tFilter1.SetTransform(transform1);\r
+               tFilter1.Update();\r
+               \r
+               contour = tFilter1.GetOutput();\r
+               \r
+               contour.GetCenter(center_contour);\r
+               trans_x = center_data[0]-center_contour[0];\r
+               trans_y = center_data[1]-center_contour[1];\r
+               trans_z = center_data[2]-center_contour[2];\r
+\r
+               vtkTransform transform2 = new vtkTransform();\r
+               transform2.Translate( trans_x, trans_y, trans_z);\r
+               \r
+               vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();\r
+               tFilter2.SetInput(contour);\r
+               tFilter2.SetTransform(transform2);\r
+               tFilter2.Update();\r
+               \r
+               contour = tFilter2.GetOutput();\r
+               \r
+               vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
+               mapper.SetInput(contour);\r
+               \r
+                \r
+               vtkActor actor =new vtkActor();\r
+               actor.SetMapper(mapper);\r
+               actor.GetProperty().SetLineWidth(2.);\r
+               \r
+               tmpRenderer.RemoveActor(tmpProp);\r
+               \r
+               tFilter1.Delete();\r
+               tFilter2.Delete();\r
+               contour.Delete();\r
+               contourFilter.Delete();\r
+               mapper.Delete();\r
+               tmpRenderWindow.Delete();\r
+               transform1.Delete();\r
+               transform2.Delete();\r
+               windowToImageFilter.Delete();\r
+               \r
+               return actor;\r
+       }\r
+       \r
+       public static vtkActor createContour(vtkProp3D tmpProp, vtkRenderer ren) {\r
+               \r
+               vtkRenderer tmpRenderer = getRenderer();\r
+               tmpRenderer.SetBackground(1,1,1);\r
+               \r
+               \r
+               if (tmpProp instanceof IvtkVisualObject) {\r
+                       ((IvtkVisualObject)tmpProp).addToRenderer();\r
+               } else {\r
+                       tmpRenderer.AddActor(tmpProp);\r
+               }\r
+               \r
+               if (tmpProp instanceof vtkActor) {\r
+                       ((vtkActor)tmpProp).GetProperty().SetColor(0, 0, 0);\r
+               }\r
+               \r
+               \r
+               //double bounds_data[] = tmpProp.GetBounds();\r
+               double center_data[] = tmpProp.GetCenter();\r
+               \r
+               tmpRenderer.ResetCamera();\r
+               \r
+               vtkCamera camera = ren.GetActiveCamera();\r
+               \r
+               vtkCamera tmpCamera = tmpRenderer.GetActiveCamera(); \r
+               tmpCamera.SetParallelProjection(camera.GetParallelProjection());\r
+               \r
+               \r
+               Vector3d pos = new Vector3d(camera.GetPosition());\r
+               Vector3d foc = new Vector3d(camera.GetFocalPoint());\r
+               Vector3d dir = new Vector3d();\r
+               dir.sub(pos,foc);\r
+               double l = dir.length();\r
+//             dir.scale(1.0/l);\r
+//             \r
+//             \r
+//\r
+//             \r
+//             dir.scale(2.0);\r
+//             Vector3d tmpFoc = new Vector3d(tmpCamera.GetFocalPoint());\r
+//             tmpFoc.add(dir);\r
+//             tmpCamera.SetPosition(tmpFoc.x,tmpFoc.y,tmpFoc.z);\r
+//             tmpCamera.SetRoll(camera.GetRoll());\r
+               \r
+               tmpCamera.DeepCopy(camera);\r
+               //tmpCamera.SetModelTransformMatrix(camera.GetModelTransformMatrix());\r
+               tmpCamera.UpdateViewport(tmpRenderer);\r
+               \r
+               vtkRenderWindow tmpRenderWindow = new vtkRenderWindow();\r
+               tmpRenderWindow.SetOffScreenRendering(1);\r
+               tmpRenderWindow.AddRenderer(tmpRenderer);\r
+               tmpRenderWindow.Render();\r
+               \r
+               vtkWindowToImageFilter windowToImageFilter = new vtkWindowToImageFilter();\r
+               windowToImageFilter.SetInput(tmpRenderWindow);\r
+               windowToImageFilter.SetMagnification(2);\r
+               windowToImageFilter.Update();\r
+               \r
+               vtkContourFilter contourFilter = new vtkContourFilter();\r
+               contourFilter.SetInputConnection(windowToImageFilter.GetOutputPort());\r
+               \r
+               contourFilter.SetValue(0, 255);\r
+               contourFilter.Update();\r
+               \r
+               vtkPolyData contour = contourFilter.GetOutput();\r
+               \r
+               \r
+               double or[] = camera.GetOrientationWXYZ();\r
+               AxisAngle4d aa = new AxisAngle4d();\r
+               aa.angle = -MathTools.degToRad(or[0]);\r
+               aa.x = or[1];\r
+               aa.y = or[2];\r
+               aa.z = or[3];\r
+               \r
+               vtkTransform transform0 = new vtkTransform();\r
+               transform0.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+               \r
+               vtkTransformPolyDataFilter tFilter0 = new vtkTransformPolyDataFilter();\r
+               tFilter0.SetInput(contour);\r
+               tFilter0.SetTransform(transform0);\r
+               tFilter0.Update();\r
+               \r
+               contour.Delete();\r
+               contour = tFilter0.GetOutput();\r
+               \r
+               double bounds_contour[] = new double[6]; \r
+               \r
+               double trans_x=0., trans_y=0., trans_z=0., ratio_x=0.002, ratio_y=0.002, ratio_z=0.002;\r
+               contour.GetBounds(bounds_contour);\r
+//      \r
+//             ratio_x = (bounds_data[1]-bounds_data[0])/(bounds_contour[1]-bounds_contour[0]);\r
+//             ratio_y = (bounds_data[3]-bounds_data[2])/(bounds_contour[3]-bounds_contour[2]);\r
+//             ratio_z = (bounds_data[5]-bounds_data[4])/(bounds_contour[5]-bounds_contour[4]);\r
+               ratio_x = l*0.0008;\r
+               ratio_y = l*0.0008;\r
+               ratio_z = l*0.0008;\r
+               \r
+               \r
+               System.out.println(ratio_x + " " + ratio_y);\r
+               \r
+               \r
+//             \r
+               vtkTransform transform1 = new vtkTransform();\r
+               transform1.Scale(ratio_x,ratio_y,ratio_z);\r
+               \r
+               vtkTransformPolyDataFilter tFilter1 = new vtkTransformPolyDataFilter();\r
+               tFilter1.SetInput(contour);\r
+               tFilter1.SetTransform(transform1);\r
+               tFilter1.Update();\r
+               \r
+               contour.Delete();\r
+               contour = tFilter1.GetOutput();\r
+               \r
+               double center_contour[] = new double[3];\r
+               contour.GetCenter(center_contour);\r
+               trans_x = center_data[0]-center_contour[0];\r
+               trans_y = center_data[1]-center_contour[1];\r
+               trans_z = center_data[2]-center_contour[2];\r
+//             \r
+               System.out.println(trans_x + " " + trans_y + " " + trans_z);\r
+//\r
+               vtkTransform transform2 = new vtkTransform();\r
+               transform2.Translate( trans_x, trans_y, trans_z);\r
+               \r
+               vtkTransformPolyDataFilter tFilter2 = new vtkTransformPolyDataFilter();\r
+               tFilter2.SetInput(contour);\r
+               tFilter2.SetTransform(transform2);\r
+               tFilter2.Update();\r
+               \r
+               contour.Delete();\r
+               contour = tFilter2.GetOutput();\r
+               \r
+               vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
+               mapper.SetInput(contour);\r
+               \r
+                \r
+               vtkActor actor =new vtkActor();\r
+               actor.SetMapper(mapper);\r
+               actor.GetProperty().SetLineWidth(2.);\r
+               actor.GetProperty().SetColor(0,0,1);\r
+               actor.GetProperty().Delete();\r
+               \r
+               tmpRenderer.RemoveActor(tmpProp);\r
+               \r
+               tFilter0.Delete();\r
+               tFilter1.Delete();\r
+               tFilter2.Delete();\r
+               contour.Delete();\r
+               contourFilter.Delete();\r
+               mapper.Delete();\r
+               tmpRenderWindow.Delete();\r
+               transform0.Delete();\r
+               transform1.Delete();\r
+               transform2.Delete();\r
+               windowToImageFilter.GetOutputPort().Delete();\r
+               windowToImageFilter.Delete();\r
+               \r
+               ren.AddActor(actor);\r
+               \r
+//             vtkMatrix4x4 m = camera.GetModelTransformMatrix();\r
+//             m.Invert();\r
+//             actor.SetUserMatrix(m);\r
+               //m.Delete();\r
+               //actor.SetPosition(trans_x,trans_y, trans_z);\r
+               //actor.RotateWXYZ(MathTools.radToDeg(aa.angle), aa.x, aa.y, aa.z);\r
+               //\r
+               return actor;\r
+       }\r
+       \r
+       public static vtkActor createSilhouette(vtkRenderer ren, vtkDataObject data) {\r
+               \r
+               \r
+               vtkPolyDataSilhouette silhouette = new vtkPolyDataSilhouette();\r
+               \r
+               silhouette.SetInput(data);\r
+               silhouette.SetCamera(ren.GetActiveCamera());\r
+               silhouette.SetEnableFeatureAngle(0);\r
+               vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
+               \r
+               mapper.SetInputConnection(silhouette.GetOutputPort());\r
+               \r
+               vtkActor actor = new vtkActor();\r
+               actor.SetMapper(mapper);\r
+               \r
+               silhouette.GetOutputPort().Delete();\r
+               silhouette.Delete();\r
+               mapper.Delete();\r
+               \r
+               return actor;\r
+       }\r
+       \r
+       public static vtkActor createOutline(vtkDataObject data) {\r
+               vtkOutlineFilter filter = new vtkOutlineFilter();\r
+               filter.SetInput(data);\r
+               vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
+               mapper.SetInputConnection(filter.GetOutputPort());\r
+               \r
+               vtkActor actor = new vtkActor();\r
+               actor.SetMapper(mapper);\r
+               \r
+               filter.GetOutputPort().Delete();\r
+               filter.Delete();\r
+               mapper.Delete();\r
+               \r
+               return actor;\r
+       }\r
+       \r
+       public static vtkActor createOutline(vtkProp3D prop) {\r
+\r
+               double bounds[] = prop.GetBounds();\r
+\r
+               vtkOutlineSource source = new vtkOutlineSource();\r
+               source.SetBounds(bounds);\r
+               \r
+               vtkOutlineFilter filter = new vtkOutlineFilter();\r
+               filter.SetInput(source.GetOutput());\r
+               vtkPolyDataMapper mapper = new vtkPolyDataMapper();\r
+               mapper.SetInputConnection(filter.GetOutputPort());\r
+               \r
+               vtkActor actor = new vtkActor();\r
+               actor.SetMapper(mapper);\r
+               \r
+               source.GetOutput().Delete();\r
+               source.Delete();\r
+               filter.GetOutputPort().Delete();\r
+               filter.Delete();\r
+               mapper.Delete();\r
+               \r
+               actor.SetPickable(0);\r
+               return actor;\r
+       }\r
+}\r