]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/InteractiveVtkPanel.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / common / InteractiveVtkPanel.java
diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/InteractiveVtkPanel.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/InteractiveVtkPanel.java
new file mode 100644 (file)
index 0000000..40fe6c6
--- /dev/null
@@ -0,0 +1,402 @@
+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