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