1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g3d.vtk.common;
\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
19 import org.simantics.g3d.scenegraph.RenderListener;
\r
20 import org.simantics.g3d.vtk.action.vtkAction;
\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
33 import vtk.vtkProp3DCollection;
\r
34 import vtk.vtkPropCollection;
\r
35 import vtk.vtkPropPicker;
\r
36 import vtk.vtkScenePicker;
\r
38 public class InteractiveVtkPanel extends vtkPanel {
\r
40 protected vtkGenericRenderWindowInteractor iren;
\r
43 public vtkGenericRenderWindowInteractor getRenderWindowInteractor() {
\r
46 private static final long serialVersionUID = 2815073937537950615L;
\r
49 public InteractiveVtkPanel() {
\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
63 public void mouseClicked(MouseEvent e) {
\r
68 public void mouseMoved(MouseEvent e) {
\r
73 public void mouseEntered(MouseEvent e) {
\r
74 super.mouseEntered(e);
\r
78 public void mouseExited(MouseEvent e) {
\r
83 public void mousePressed(MouseEvent e) {
\r
88 public void mouseDragged(MouseEvent e) {
\r
93 public void mouseReleased(MouseEvent e) {
\r
98 public void keyPressed(KeyEvent e) {
\r
103 public void keyTyped(KeyEvent e) {
\r
107 public void setSize(int x, int y) {
\r
108 if (windowset == 1) {
\r
111 iren.SetSize(x, y);
\r
112 iren.ConfigureEvent();
\r
117 private vtkScenePicker scenePicker;
\r
121 public int getPickType() {
\r
125 public void setPickType(int pickType) {
\r
126 this.pickType = pickType;
\r
129 public vtkProp[] pick(int x, int y) {
\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
137 if (pickType == 0) {
\r
139 vtkPropPicker picker = new vtkPropPicker();
\r
141 picker.PickProp(x, rw.GetSize()[1] - y, ren);
\r
145 vtkAssemblyPath apath = picker.GetPath();
\r
146 return processPick(picker, apath);
\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
157 vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);
\r
158 //int vertexId = scenePicker.GetVertexId(new int[]{x, rw.GetSize()[1] - y});
\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
171 vtkAssemblyNode node = apath.GetLastNode();
\r
172 vtkProp test = (vtkProp) node.GetViewProp();
\r
175 return new vtkProp[]{test};
\r
179 } else if (pickType == 2) {
\r
180 vtkPointPicker picker = new vtkPointPicker();
\r
181 picker.SetTolerance(2.0/(double)rw.GetSize()[0]);
\r
183 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\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
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
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
200 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\r
202 vtkAssemblyPath apath = picker.GetPath();
\r
203 return processPick(picker, apath);
\r
209 public vtkProp[] pick2(int x, int y) {
\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
217 if (pickType == 0) {
\r
219 vtkPropPicker picker = new vtkPropPicker();
\r
221 picker.PickProp(x, rw.GetSize()[1] - y, ren);
\r
224 vtkPropCollection coll = picker.GetPickList();
\r
225 return processPick(picker, coll);
\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
237 vtkAssemblyPath apath = ren.PickProp(x, rw.GetSize()[1] - y);
\r
241 if (apath != null) {
\r
242 apath.InitTraversal();
\r
245 vtkAssemblyNode node = apath.GetLastNode();
\r
246 vtkProp test = (vtkProp) node.GetViewProp();
\r
249 return new vtkProp[]{test};
\r
253 } else if (pickType == 2) {
\r
254 vtkPointPicker picker = new vtkPointPicker();
\r
255 picker.SetTolerance(2.0/(double)rw.GetSize()[0]);
\r
257 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\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
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
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
273 picker.Pick(new double[]{x, rw.GetSize()[1] - y,0}, ren);
\r
275 vtkProp3DCollection coll = picker.GetProp3Ds();
\r
276 return processPick(picker, coll);
\r
282 private vtkProp[] processPick(vtkAbstractPicker picker, vtkAssemblyPath apath) {
\r
283 // double[] pickPos = picker.GetPickPosition();
\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
302 private vtkProp[] processPick(vtkAbstractPicker picker, vtkPropCollection coll) {
\r
303 // double[] pickPos = picker.GetPickPosition();
\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
311 // System.out.println("Picked: " + test.GetClassName() + " " + test.GetVTKId());
\r
323 private vtkAction defaultAction;
\r
324 private vtkAction currentAction;
\r
326 public void setActiveAction(vtkAction action) {
\r
327 if (action.equals(currentAction))
\r
329 if (currentAction != null)
\r
330 currentAction.deattach();
\r
331 currentAction = action;
\r
332 if (action != null)
\r
336 public void setDefaultAction(vtkAction defaultAction) {
\r
337 this.defaultAction = defaultAction;
\r
340 public void useDefaultAction() {
\r
341 setActiveAction(defaultAction);
\r
344 public vtkAction getDefaultAction() {
\r
345 return defaultAction;
\r
350 public synchronized void Render() {
\r
351 //System.out.println("Render " + rendering);
\r
361 public void addListener(RenderListener l) {
\r
365 public void removeListener(RenderListener l) {
\r
366 listeners.remove(l);
\r
369 private List<RenderListener> listeners = new ArrayList<RenderListener>();
\r
371 List<RenderListener> list = new ArrayList<RenderListener>();
\r
373 private void firePreRender() {
\r
374 if (listeners.size() > 0) {
\r
375 list.addAll(listeners);
\r
376 for (RenderListener l : list)
\r
382 private void firePostRender() {
\r
383 if (listeners.size() > 0) {
\r
384 list.addAll(listeners);
\r
385 for (RenderListener l : list)
\r
392 private List<vtkObjectBase> deletable = new ArrayList<vtkObjectBase>();
\r
394 public void addDeletable(vtkObjectBase o) {
\r
398 public void removeDeletable (vtkObjectBase o) {
\r
399 deletable.remove(o);
\r
403 public void Delete() {
\r
404 for (vtkObjectBase o : deletable) {
\r
405 if (o.GetVTKId() != 0) {
\r