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