1 package org.simantics.g3d.vtk.common;
\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
8 import org.simantics.g3d.scenegraph.RenderListener;
\r
9 import org.simantics.g3d.vtk.action.vtkAction;
\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
22 import vtk.vtkProp3DCollection;
\r
23 import vtk.vtkPropCollection;
\r
24 import vtk.vtkPropPicker;
\r
25 import vtk.vtkScenePicker;
\r
27 public class InteractiveVtkPanel extends vtkPanel {
\r
29 protected vtkGenericRenderWindowInteractor iren;
\r
32 public vtkGenericRenderWindowInteractor getRenderWindowInteractor() {
\r
35 private static final long serialVersionUID = 2815073937537950615L;
\r
38 public InteractiveVtkPanel() {
\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
52 public void mouseClicked(MouseEvent e) {
\r
57 public void mouseMoved(MouseEvent e) {
\r
62 public void mouseEntered(MouseEvent e) {
\r
63 super.mouseEntered(e);
\r
67 public void mouseExited(MouseEvent e) {
\r
72 public void mousePressed(MouseEvent e) {
\r
77 public void mouseDragged(MouseEvent e) {
\r
82 public void mouseReleased(MouseEvent e) {
\r
87 public void keyPressed(KeyEvent e) {
\r
92 public void keyTyped(KeyEvent e) {
\r
96 public void setSize(int x, int y) {
\r
97 if (windowset == 1) {
\r
100 iren.SetSize(x, y);
\r
101 iren.ConfigureEvent();
\r
106 private vtkScenePicker scenePicker;
\r
110 public int getPickType() {
\r
114 public void setPickType(int pickType) {
\r
115 this.pickType = pickType;
\r
118 public vtkProp[] pick(int x, int y) {
\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
126 if (pickType == 0) {
\r
128 vtkPropPicker picker = new vtkPropPicker();
\r
130 picker.PickProp(x, rw.GetSize()[1] - y, ren);
\r
134 vtkAssemblyPath apath = picker.GetPath();
\r
135 return processPick(picker, apath);
\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
146 vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);
\r
147 //int vertexId = scenePicker.GetVertexId(new int[]{x, rw.GetSize()[1] - y});
\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
160 vtkAssemblyNode node = apath.GetLastNode();
\r
161 vtkProp test = (vtkProp) node.GetViewProp();
\r
164 return new vtkProp[]{test};
\r
168 } else if (pickType == 2) {
\r
169 vtkPointPicker picker = new vtkPointPicker();
\r
170 picker.SetTolerance(2.0/(double)rw.GetSize()[0]);
\r
172 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\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
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
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
189 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\r
191 vtkAssemblyPath apath = picker.GetPath();
\r
192 return processPick(picker, apath);
\r
198 public vtkProp[] pick2(int x, int y) {
\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
206 if (pickType == 0) {
\r
208 vtkPropPicker picker = new vtkPropPicker();
\r
210 picker.PickProp(x, rw.GetSize()[1] - y, ren);
\r
213 vtkPropCollection coll = picker.GetPickList();
\r
214 return processPick(picker, coll);
\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
226 vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);
\r
230 if (apath != null) {
\r
231 apath.InitTraversal();
\r
234 vtkAssemblyNode node = apath.GetLastNode();
\r
235 vtkProp test = (vtkProp) node.GetViewProp();
\r
238 return new vtkProp[]{test};
\r
242 } else if (pickType == 2) {
\r
243 vtkPointPicker picker = new vtkPointPicker();
\r
244 picker.SetTolerance(2.0/(double)rw.GetSize()[0]);
\r
246 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\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
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
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
262 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\r
264 vtkProp3DCollection coll = picker.GetProp3Ds();
\r
265 return processPick(picker, coll);
\r
271 private vtkProp[] processPick(vtkAbstractPicker picker, vtkAssemblyPath apath) {
\r
272 // double[] pickPos = picker.GetPickPosition();
\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
291 private vtkProp[] processPick(vtkAbstractPicker picker, vtkPropCollection coll) {
\r
292 // double[] pickPos = picker.GetPickPosition();
\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
300 // System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());
\r
312 private vtkAction defaultAction;
\r
313 private vtkAction currentAction;
\r
315 public void setActiveAction(vtkAction action) {
\r
316 if (action.equals(currentAction))
\r
318 if (currentAction != null)
\r
319 currentAction.deattach();
\r
320 currentAction = action;
\r
321 if (action != null)
\r
325 public void setDefaultAction(vtkAction defaultAction) {
\r
326 this.defaultAction = defaultAction;
\r
329 public void useDefaultAction() {
\r
330 setActiveAction(defaultAction);
\r
333 public vtkAction getDefaultAction() {
\r
334 return defaultAction;
\r
339 public synchronized void Render() {
\r
340 //System.out.println("Render " + rendering);
\r
350 public void addListener(RenderListener l) {
\r
354 public void removeListener(RenderListener l) {
\r
355 listeners.remove(l);
\r
358 private List<RenderListener> listeners = new ArrayList<RenderListener>();
\r
360 List<RenderListener> list = new ArrayList<RenderListener>();
\r
362 private void firePreRender() {
\r
363 if (listeners.size() > 0) {
\r
364 list.addAll(listeners);
\r
365 for (RenderListener l : list)
\r
371 private void firePostRender() {
\r
372 if (listeners.size() > 0) {
\r
373 list.addAll(listeners);
\r
374 for (RenderListener l : list)
\r
381 private List<vtkObjectBase> deletable = new ArrayList<vtkObjectBase>();
\r
383 public void addDeletable(vtkObjectBase o) {
\r
387 public void removeDeletable (vtkObjectBase o) {
\r
388 deletable.remove(o);
\r
392 public void Delete() {
\r
393 for (vtkObjectBase o : deletable) {
\r
394 if (o.GetVTKId() != 0) {
\r