]> gerrit.simantics Code Review - simantics/3d.git/blob - 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
1 package org.simantics.g3d.vtk.common;\r
2 \r
3 import java.awt.event.KeyEvent;\r
4 import java.awt.event.MouseEvent;\r
5 import java.util.ArrayList;\r
6 import java.util.List;\r
7 \r
8 import org.simantics.g3d.scenegraph.RenderListener;\r
9 import org.simantics.g3d.vtk.action.vtkAction;\r
10 \r
11 import vtk.vtkAbstractPicker;\r
12 import vtk.vtkAreaPicker;\r
13 import vtk.vtkAssemblyNode;\r
14 import vtk.vtkAssemblyPath;\r
15 import vtk.vtkCellPicker;\r
16 import vtk.vtkGenericRenderWindowInteractor;\r
17 import vtk.vtkInteractorStyleTrackballCamera;\r
18 import vtk.vtkObjectBase;\r
19 import vtk.vtkPanel;\r
20 import vtk.vtkPointPicker;\r
21 import vtk.vtkProp;\r
22 import vtk.vtkProp3DCollection;\r
23 import vtk.vtkPropCollection;\r
24 import vtk.vtkPropPicker;\r
25 import vtk.vtkScenePicker;\r
26 \r
27 public class InteractiveVtkPanel extends vtkPanel {\r
28         \r
29         protected vtkGenericRenderWindowInteractor iren;\r
30     \r
31 \r
32         public vtkGenericRenderWindowInteractor getRenderWindowInteractor() {\r
33         return this.iren;\r
34     }\r
35         private static final long serialVersionUID = 2815073937537950615L;\r
36         \r
37         \r
38         public InteractiveVtkPanel() {\r
39                 super();\r
40                 iren = new vtkGenericRenderWindowInteractor();\r
41                 iren.SetRenderWindow(rw);\r
42         iren.TimerEventResetsTimerOff();\r
43         iren.SetSize(200, 200);\r
44         iren.ConfigureEvent();\r
45         vtkInteractorStyleTrackballCamera style = new vtkInteractorStyleTrackballCamera();\r
46         iren.SetInteractorStyle(style);\r
47         addDeletable(style);\r
48         addDeletable(iren);\r
49         }\r
50         \r
51         @Override\r
52         public void mouseClicked(MouseEvent e) {\r
53 \r
54         }\r
55         \r
56         @Override\r
57         public void mouseMoved(MouseEvent e) {\r
58 \r
59         }\r
60         \r
61         @Override\r
62         public void mouseEntered(MouseEvent e) {\r
63                 super.mouseEntered(e);\r
64         }\r
65         \r
66         @Override\r
67         public void mouseExited(MouseEvent e) {\r
68         \r
69         }\r
70         \r
71         @Override\r
72         public void mousePressed(MouseEvent e) {\r
73                 \r
74         }\r
75         \r
76         @Override\r
77         public void mouseDragged(MouseEvent e) {\r
78                 \r
79         }\r
80         \r
81         @Override\r
82         public void mouseReleased(MouseEvent e) {\r
83         \r
84         }\r
85         \r
86         @Override\r
87         public void keyPressed(KeyEvent e) {\r
88 \r
89         }\r
90         \r
91         @Override\r
92         public void keyTyped(KeyEvent e) {\r
93                 \r
94         }\r
95         \r
96         public void setSize(int x, int y) {\r
97         if (windowset == 1) {\r
98             Lock();\r
99             rw.SetSize(x, y);\r
100             iren.SetSize(x, y);\r
101             iren.ConfigureEvent();\r
102             UnLock();\r
103         }\r
104     }\r
105 \r
106         private vtkScenePicker scenePicker;\r
107         \r
108         int pickType = 4;\r
109         \r
110         public int getPickType() {\r
111                 return pickType;\r
112         }\r
113         \r
114         public void setPickType(int pickType) {\r
115                 this.pickType = pickType;\r
116         }\r
117         \r
118         public vtkProp[] pick(int x, int y) {\r
119                 \r
120                 \r
121 //              vtkPicker picker = new vtkPicker();\r
122 //              vtkAbstractPicker picker = new vtkAbstractPicker();\r
123 //              picker.Pick(x, rw.GetSize()[1] - y, ren);\r
124 //              // see page 60 of VTK user's guide\r
125 //\r
126                 if (pickType == 0) {\r
127         \r
128                         vtkPropPicker picker = new vtkPropPicker();\r
129                         Lock();\r
130                         picker.PickProp(x, rw.GetSize()[1] - y, ren);\r
131         \r
132                         UnLock();\r
133         \r
134                         vtkAssemblyPath apath = picker.GetPath();\r
135                         return processPick(picker, apath);\r
136                         \r
137                 } else if (pickType == 1) {\r
138                         if (scenePicker == null) {\r
139                                 scenePicker = new vtkScenePicker();\r
140                                 scenePicker.SetRenderer(ren);\r
141                                 scenePicker.EnableVertexPickingOn();\r
142                                 \r
143                         }\r
144                         Lock();\r
145 \r
146                         vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);\r
147                         //int vertexId = scenePicker.GetVertexId(new int[]{x, rw.GetSize()[1] - y});\r
148                         \r
149                         UnLock();\r
150                         \r
151                         if (apath != null) {\r
152                                 apath.InitTraversal();\r
153 //                              System.out.println("Pick, actors " + apath.GetNumberOfItems() );\r
154 //                              for (int i = 0; i < apath.GetNumberOfItems(); i++) {\r
155 //                                      vtkAssemblyNode node = apath.GetNextNode();\r
156 //                                      vtkProp test = (vtkProp) node.GetViewProp();\r
157 //                                      System.out.println(test.GetClassName());\r
158 //                              }\r
159                                 \r
160                                 vtkAssemblyNode node = apath.GetLastNode();\r
161                                 vtkProp test = (vtkProp) node.GetViewProp();\r
162                                 apath.Delete();\r
163                                 node.Delete();\r
164                                 return new vtkProp[]{test};\r
165         \r
166                         }\r
167                         \r
168                 } else if (pickType == 2) {\r
169                         vtkPointPicker picker = new vtkPointPicker();\r
170                         picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
171                         Lock();\r
172                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
173                         UnLock();\r
174                         \r
175                         vtkAssemblyPath apath = picker.GetPath();\r
176                         return processPick(picker, apath);\r
177                 } else if (pickType == 3) {\r
178                         vtkAreaPicker picker = new vtkAreaPicker();\r
179                         Lock();\r
180                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
181                         //picker.AreaPick(x-1, rw.GetSize()[1] - y-1,x+1,rw.GetSize()[1] - y+1, ren);\r
182                         UnLock();\r
183                         vtkAssemblyPath apath = picker.GetPath();\r
184                         return processPick(picker, apath);\r
185                 } else if (pickType == 4) {\r
186                         vtkCellPicker picker = new vtkCellPicker();\r
187                         picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
188                         Lock();\r
189                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
190                         UnLock();       \r
191                         vtkAssemblyPath apath = picker.GetPath();\r
192                         return processPick(picker, apath);\r
193                 }\r
194 \r
195                 return null;\r
196         }\r
197         \r
198         public vtkProp[] pick2(int x, int y) {\r
199                 \r
200                 \r
201 //              vtkPicker picker = new vtkPicker();\r
202 //              vtkAbstractPicker picker = new vtkAbstractPicker();\r
203 //              picker.Pick(x, rw.GetSize()[1] - y, ren);\r
204 //              // see page 60 of VTK user's guide\r
205 //\r
206                 if (pickType == 0) {\r
207         \r
208                         vtkPropPicker picker = new vtkPropPicker();\r
209                         Lock();\r
210                         picker.PickProp(x, rw.GetSize()[1] - y, ren);\r
211         \r
212                         UnLock();\r
213                         vtkPropCollection coll = picker.GetPickList();\r
214                         return processPick(picker, coll);\r
215                         \r
216                 } else if (pickType == 1) {\r
217                         if (scenePicker == null) {\r
218                                 scenePicker = new vtkScenePicker();\r
219                                 scenePicker.SetRenderer(ren);\r
220                                 scenePicker.EnableVertexPickingOn();\r
221                                 \r
222                         }\r
223                         Lock();\r
224 \r
225                         \r
226                         vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);\r
227                         \r
228                         UnLock();\r
229                         \r
230                         if (apath != null) {\r
231                                 apath.InitTraversal();\r
232 \r
233                                 \r
234                                 vtkAssemblyNode node = apath.GetLastNode();\r
235                                 vtkProp test = (vtkProp) node.GetViewProp();\r
236                                 apath.Delete();\r
237                                 node.Delete();\r
238                                 return new vtkProp[]{test};\r
239         \r
240                         }\r
241                         \r
242                 } else if (pickType == 2) {\r
243                         vtkPointPicker picker = new vtkPointPicker();\r
244                         picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
245                         Lock();\r
246                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
247                         UnLock();\r
248                         vtkProp3DCollection coll = picker.GetProp3Ds();\r
249                         return processPick(picker, coll);\r
250                 } else if (pickType == 3) {\r
251                         vtkAreaPicker picker = new vtkAreaPicker();\r
252                         Lock();\r
253                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
254                         //picker.AreaPick(x-1, rw.GetSize()[1] - y-1,x+1,rw.GetSize()[1] - y+1, ren);\r
255                         UnLock();\r
256                         vtkProp3DCollection coll = picker.GetProp3Ds();\r
257                         return processPick(picker, coll);\r
258                 } else if (pickType == 4) {\r
259                         vtkCellPicker picker = new vtkCellPicker();\r
260                         picker.SetTolerance(2.0/(double)rw.GetSize()[0]);\r
261                         Lock();\r
262                         picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);\r
263                         UnLock();       \r
264                         vtkProp3DCollection coll = picker.GetProp3Ds();\r
265                         return processPick(picker, coll);\r
266                 }\r
267 \r
268                 return null;\r
269         }\r
270         \r
271         private vtkProp[] processPick(vtkAbstractPicker picker, vtkAssemblyPath apath) {\r
272 //              double[] pickPos = picker.GetPickPosition();\r
273                 picker.Delete();\r
274                 if (apath != null) {\r
275                         apath.InitTraversal();\r
276                         vtkProp result[] = new vtkProp[apath.GetNumberOfItems()];\r
277                         for (int i = apath.GetNumberOfItems()-1; i >= 0; i--) {\r
278                                 vtkAssemblyNode node = apath.GetNextNode();\r
279                                 vtkProp test = (vtkProp) node.GetViewProp();\r
280 //                              System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());\r
281                                 result[i] = test;\r
282                                 node.Delete();\r
283                         }\r
284                         apath.Delete();\r
285                         return result;\r
286 \r
287                 }\r
288                 return null;\r
289         }\r
290         \r
291         private vtkProp[] processPick(vtkAbstractPicker picker, vtkPropCollection coll) {\r
292 //              double[] pickPos = picker.GetPickPosition();\r
293                 picker.Delete();\r
294                 if (coll != null) {\r
295                         coll.InitTraversal();\r
296                         vtkProp result[] = new vtkProp[coll.GetNumberOfItems()];\r
297                         for (int i = coll.GetNumberOfItems()-1; i >= 0; i--) {\r
298                                 vtkProp test = coll.GetNextProp();\r
299                                 \r
300 //                              System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());\r
301                                 result[i] = test;\r
302                                 \r
303                         }\r
304                         coll.Delete();\r
305                         return result;\r
306 \r
307                 }\r
308                 return null;\r
309         }\r
310         \r
311         \r
312         private vtkAction defaultAction;\r
313         private vtkAction currentAction;\r
314         \r
315         public void setActiveAction(vtkAction action) {\r
316                 if (action.equals(currentAction))\r
317                         return;\r
318                 if (currentAction != null)\r
319                         currentAction.deattach();\r
320                 currentAction = action;\r
321                 if (action != null)\r
322                         action.attach();\r
323         }\r
324         \r
325         public void setDefaultAction(vtkAction defaultAction) {\r
326                 this.defaultAction = defaultAction;\r
327         }\r
328         \r
329         public void useDefaultAction() {\r
330                 setActiveAction(defaultAction);\r
331         }\r
332         \r
333         public vtkAction getDefaultAction() {\r
334                 return defaultAction;\r
335         }\r
336         \r
337         \r
338         @Override\r
339         public synchronized void Render() {\r
340                 //System.out.println("Render " + rendering);\r
341                 if (rendering)\r
342                         return;\r
343                 \r
344                 firePreRender();\r
345                 super.Render();\r
346                 firePostRender();\r
347         }\r
348         \r
349         \r
350         public void addListener(RenderListener l) {\r
351                 listeners.add(l);\r
352         }\r
353         \r
354         public void removeListener(RenderListener l) {\r
355                 listeners.remove(l);\r
356         }\r
357         \r
358         private List<RenderListener> listeners = new ArrayList<RenderListener>();\r
359         \r
360         List<RenderListener> list = new ArrayList<RenderListener>();\r
361         \r
362         private void firePreRender() {\r
363                 if (listeners.size() > 0) {\r
364                         list.addAll(listeners);\r
365                         for (RenderListener l : list)\r
366                                 l.preRender();\r
367                         list.clear();\r
368                 }\r
369         }\r
370         \r
371         private void firePostRender() {\r
372                 if (listeners.size() > 0) {\r
373                         list.addAll(listeners);\r
374                         for (RenderListener l : list)\r
375                                 l.postRender();\r
376                         list.clear();\r
377                 }\r
378         }\r
379 \r
380         \r
381         private List<vtkObjectBase> deletable = new ArrayList<vtkObjectBase>();\r
382         \r
383         public void addDeletable(vtkObjectBase o) {\r
384                 deletable.add(o);\r
385         }\r
386         \r
387         public void removeDeletable (vtkObjectBase o) {\r
388                 deletable.remove(o);\r
389         }\r
390         \r
391         @Override\r
392         public void Delete() {\r
393                 for (vtkObjectBase o : deletable) {\r
394                         if (o.GetVTKId() != 0) {\r
395                                 o.Delete();\r
396                         }\r
397                 }\r
398                 deletable.clear();\r
399                 \r
400                 super.Delete();\r
401         }\r
402 }\r