--- /dev/null
+package org.simantics.g3d.vtk.common;\r
+\r
+import java.awt.event.KeyEvent;\r
+import java.awt.event.MouseEvent;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.g3d.scenegraph.RenderListener;\r
+import org.simantics.g3d.vtk.action.vtkAction;\r
+\r
+import vtk.vtkAbstractPicker;\r
+import vtk.vtkAreaPicker;\r
+import vtk.vtkAssemblyNode;\r
+import vtk.vtkAssemblyPath;\r
+import vtk.vtkCellPicker;\r
+import vtk.vtkGenericRenderWindowInteractor;\r
+import vtk.vtkInteractorStyleTrackballCamera;\r
+import vtk.vtkObjectBase;\r
+import vtk.vtkPanel;\r
+import vtk.vtkPointPicker;\r
+import vtk.vtkProp;\r
+import vtk.vtkProp3DCollection;\r
+import vtk.vtkPropCollection;\r
+import vtk.vtkPropPicker;\r
+import vtk.vtkScenePicker;\r
+\r
+public class InteractiveVtkPanel extends vtkPanel {\r
+ \r
+ protected vtkGenericRenderWindowInteractor iren;\r
+ \r
+\r
+ public vtkGenericRenderWindowInteractor getRenderWindowInteractor() {\r
+ return this.iren;\r
+ }\r
+ private static final long serialVersionUID = 2815073937537950615L;\r
+ \r
+ \r
+ public InteractiveVtkPanel() {\r
+ super();\r
+ iren = new vtkGenericRenderWindowInteractor();\r
+ iren.SetRenderWindow(rw);\r
+ iren.TimerEventResetsTimerOff();\r
+ iren.SetSize(200, 200);\r
+ iren.ConfigureEvent();\r
+ vtkInteractorStyleTrackballCamera style = new vtkInteractorStyleTrackballCamera();\r
+ iren.SetInteractorStyle(style);\r
+ addDeletable(style);\r
+ addDeletable(iren);\r
+ }\r
+ \r
+ @Override\r
+ public void mouseClicked(MouseEvent e) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void mouseMoved(MouseEvent e) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void mouseEntered(MouseEvent e) {\r
+ super.mouseEntered(e);\r
+ }\r
+ \r
+ @Override\r
+ public void mouseExited(MouseEvent e) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void mousePressed(MouseEvent e) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void mouseDragged(MouseEvent e) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void mouseReleased(MouseEvent e) {\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void keyPressed(KeyEvent e) {\r
+\r
+ }\r
+ \r
+ @Override\r
+ public void keyTyped(KeyEvent e) {\r
+ \r
+ }\r
+ \r
+ public void setSize(int x, int y) {\r
+ if (windowset == 1) {\r
+ Lock();\r
+ rw.SetSize(x, y);\r
+ iren.SetSize(x, y);\r
+ iren.ConfigureEvent();\r
+ UnLock();\r
+ }\r
+ }\r
+\r
+ private vtkScenePicker scenePicker;\r
+ \r
+ int pickType = 4;\r
+ \r
+ public int getPickType() {\r
+ return pickType;\r
+ }\r
+ \r
+ public void setPickType(int pickType) {\r
+ this.pickType = pickType;\r
+ }\r
+ \r
+ public vtkProp[] pick(int x, int y) {\r
+ \r
+ \r
+// vtkPicker picker = new vtkPicker();\r
+// vtkAbstractPicker picker = new vtkAbstractPicker();\r
+// picker.Pick(x, rw.GetSize()[1] - y, ren);\r
+// // see page 60 of VTK user's guide\r
+//\r
+ if (pickType == 0) {\r
+ \r
+ vtkPropPicker picker = new vtkPropPicker();\r
+ Lock();\r
+ picker.PickProp(x, rw.GetSize()[1] - y, ren);\r
+ \r
+ UnLock();\r
+ \r
+ vtkAssemblyPath apath = picker.GetPath();\r
+ return processPick(picker, apath);\r
+ \r
+ } else if (pickType == 1) {\r
+ if (scenePicker == null) {\r
+ scenePicker = new vtkScenePicker();\r
+ scenePicker.SetRenderer(ren);\r
+ scenePicker.EnableVertexPickingOn();\r
+ \r
+ }\r
+ Lock();\r
+\r
+ vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);\r
+ //int vertexId = scenePicker.GetVertexId(new int[]{x, rw.GetSize()[1] - y});\r
+ \r
+ UnLock();\r
+ \r
+ if (apath != null) {\r
+ apath.InitTraversal();\r
+// System.out.println("Pick, actors " + apath.GetNumberOfItems() );\r
+// for (int i = 0; i < apath.GetNumberOfItems(); i++) {\r
+// vtkAssemblyNode node = apath.GetNextNode();\r
+// vtkProp test = (vtkProp) node.GetViewProp();\r
+// System.out.println(test.GetClassName());\r
+// }\r
+ \r
+ vtkAssemblyNode node = apath.GetLastNode();\r
+ vtkProp test = (vtkProp) node.GetViewProp();\r
+ apath.Delete();\r
+ node.Delete();\r
+ return new vtkProp[]{test};\r
+ \r
+ }\r
+ \r
+ } else if (pickType == 2) {\r
+ vtkPointPicker picker = new vtkPointPicker();\r
+ picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ UnLock();\r
+ \r
+ vtkAssemblyPath apath = picker.GetPath();\r
+ return processPick(picker, apath);\r
+ } else if (pickType == 3) {\r
+ vtkAreaPicker picker = new vtkAreaPicker();\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ //picker.AreaPick(x-1, rw.GetSize()[1] - y-1,x+1,rw.GetSize()[1] - y+1, ren);\r
+ UnLock();\r
+ vtkAssemblyPath apath = picker.GetPath();\r
+ return processPick(picker, apath);\r
+ } else if (pickType == 4) {\r
+ vtkCellPicker picker = new vtkCellPicker();\r
+ picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ UnLock(); \r
+ vtkAssemblyPath apath = picker.GetPath();\r
+ return processPick(picker, apath);\r
+ }\r
+\r
+ return null;\r
+ }\r
+ \r
+ public vtkProp[] pick2(int x, int y) {\r
+ \r
+ \r
+// vtkPicker picker = new vtkPicker();\r
+// vtkAbstractPicker picker = new vtkAbstractPicker();\r
+// picker.Pick(x, rw.GetSize()[1] - y, ren);\r
+// // see page 60 of VTK user's guide\r
+//\r
+ if (pickType == 0) {\r
+ \r
+ vtkPropPicker picker = new vtkPropPicker();\r
+ Lock();\r
+ picker.PickProp(x, rw.GetSize()[1] - y, ren);\r
+ \r
+ UnLock();\r
+ vtkPropCollection coll = picker.GetPickList();\r
+ return processPick(picker, coll);\r
+ \r
+ } else if (pickType == 1) {\r
+ if (scenePicker == null) {\r
+ scenePicker = new vtkScenePicker();\r
+ scenePicker.SetRenderer(ren);\r
+ scenePicker.EnableVertexPickingOn();\r
+ \r
+ }\r
+ Lock();\r
+\r
+ \r
+ vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);\r
+ \r
+ UnLock();\r
+ \r
+ if (apath != null) {\r
+ apath.InitTraversal();\r
+\r
+ \r
+ vtkAssemblyNode node = apath.GetLastNode();\r
+ vtkProp test = (vtkProp) node.GetViewProp();\r
+ apath.Delete();\r
+ node.Delete();\r
+ return new vtkProp[]{test};\r
+ \r
+ }\r
+ \r
+ } else if (pickType == 2) {\r
+ vtkPointPicker picker = new vtkPointPicker();\r
+ picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ UnLock();\r
+ vtkProp3DCollection coll = picker.GetProp3Ds();\r
+ return processPick(picker, coll);\r
+ } else if (pickType == 3) {\r
+ vtkAreaPicker picker = new vtkAreaPicker();\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ //picker.AreaPick(x-1, rw.GetSize()[1] - y-1,x+1,rw.GetSize()[1] - y+1, ren);\r
+ UnLock();\r
+ vtkProp3DCollection coll = picker.GetProp3Ds();\r
+ return processPick(picker, coll);\r
+ } else if (pickType == 4) {\r
+ vtkCellPicker picker = new vtkCellPicker();\r
+ picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
+ Lock();\r
+ picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
+ UnLock(); \r
+ vtkProp3DCollection coll = picker.GetProp3Ds();\r
+ return processPick(picker, coll);\r
+ }\r
+\r
+ return null;\r
+ }\r
+ \r
+ private vtkProp[] processPick(vtkAbstractPicker picker, vtkAssemblyPath apath) {\r
+// double[] pickPos = picker.GetPickPosition();\r
+ picker.Delete();\r
+ if (apath != null) {\r
+ apath.InitTraversal();\r
+ vtkProp result[] = new vtkProp[apath.GetNumberOfItems()];\r
+ for (int i = apath.GetNumberOfItems()-1; i >= 0; i--) {\r
+ vtkAssemblyNode node = apath.GetNextNode();\r
+ vtkProp test = (vtkProp) node.GetViewProp();\r
+// System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());\r
+ result[i] = test;\r
+ node.Delete();\r
+ }\r
+ apath.Delete();\r
+ return result;\r
+\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ private vtkProp[] processPick(vtkAbstractPicker picker, vtkPropCollection coll) {\r
+// double[] pickPos = picker.GetPickPosition();\r
+ picker.Delete();\r
+ if (coll != null) {\r
+ coll.InitTraversal();\r
+ vtkProp result[] = new vtkProp[coll.GetNumberOfItems()];\r
+ for (int i = coll.GetNumberOfItems()-1; i >= 0; i--) {\r
+ vtkProp test = coll.GetNextProp();\r
+ \r
+// System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());\r
+ result[i] = test;\r
+ \r
+ }\r
+ coll.Delete();\r
+ return result;\r
+\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ \r
+ private vtkAction defaultAction;\r
+ private vtkAction currentAction;\r
+ \r
+ public void setActiveAction(vtkAction action) {\r
+ if (action.equals(currentAction))\r
+ return;\r
+ if (currentAction != null)\r
+ currentAction.deattach();\r
+ currentAction = action;\r
+ if (action != null)\r
+ action.attach();\r
+ }\r
+ \r
+ public void setDefaultAction(vtkAction defaultAction) {\r
+ this.defaultAction = defaultAction;\r
+ }\r
+ \r
+ public void useDefaultAction() {\r
+ setActiveAction(defaultAction);\r
+ }\r
+ \r
+ public vtkAction getDefaultAction() {\r
+ return defaultAction;\r
+ }\r
+ \r
+ \r
+ @Override\r
+ public synchronized void Render() {\r
+ //System.out.println("Render " + rendering);\r
+ if (rendering)\r
+ return;\r
+ \r
+ firePreRender();\r
+ super.Render();\r
+ firePostRender();\r
+ }\r
+ \r
+ \r
+ public void addListener(RenderListener l) {\r
+ listeners.add(l);\r
+ }\r
+ \r
+ public void removeListener(RenderListener l) {\r
+ listeners.remove(l);\r
+ }\r
+ \r
+ private List<RenderListener> listeners = new ArrayList<RenderListener>();\r
+ \r
+ List<RenderListener> list = new ArrayList<RenderListener>();\r
+ \r
+ private void firePreRender() {\r
+ if (listeners.size() > 0) {\r
+ list.addAll(listeners);\r
+ for (RenderListener l : list)\r
+ l.preRender();\r
+ list.clear();\r
+ }\r
+ }\r
+ \r
+ private void firePostRender() {\r
+ if (listeners.size() > 0) {\r
+ list.addAll(listeners);\r
+ for (RenderListener l : list)\r
+ l.postRender();\r
+ list.clear();\r
+ }\r
+ }\r
+\r
+ \r
+ private List<vtkObjectBase> deletable = new ArrayList<vtkObjectBase>();\r
+ \r
+ public void addDeletable(vtkObjectBase o) {\r
+ deletable.add(o);\r
+ }\r
+ \r
+ public void removeDeletable (vtkObjectBase o) {\r
+ deletable.remove(o);\r
+ }\r
+ \r
+ @Override\r
+ public void Delete() {\r
+ for (vtkObjectBase o : deletable) {\r
+ if (o.GetVTKId() != 0) {\r
+ o.Delete();\r
+ }\r
+ }\r
+ deletable.clear();\r
+ \r
+ super.Delete();\r
+ }\r
+}\r