1 package org.simantics.g3d.vtk.action;
\r
3 import java.awt.event.InputEvent;
\r
4 import java.awt.event.MouseEvent;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Collection;
\r
7 import java.util.HashSet;
\r
8 import java.util.List;
\r
9 import java.util.Set;
\r
11 import org.eclipse.jface.viewers.ISelection;
\r
12 import org.eclipse.jface.viewers.ISelectionChangedListener;
\r
13 import org.eclipse.jface.viewers.ISelectionProvider;
\r
14 import org.eclipse.jface.viewers.SelectionChangedEvent;
\r
15 import org.eclipse.jface.viewers.StructuredSelection;
\r
16 import org.eclipse.swt.widgets.Display;
\r
17 import org.simantics.g3d.tools.AdaptationUtils;
\r
18 import org.simantics.g3d.vtk.common.InteractiveVtkPanel;
\r
20 import vtk.vtkActor;
\r
21 import vtk.vtkCamera;
\r
23 import vtk.vtkRenderWindow;
\r
24 import vtk.vtkRenderer;
\r
26 public class vtkCameraAndSelectorAction extends vtkAction implements ISelectionProvider {
\r
28 protected vtkRenderer ren;
\r
29 protected int lastX;
\r
30 protected int lastY;
\r
31 protected vtkRenderWindow rw;
\r
32 protected vtkCamera cam;
\r
33 protected int InteractionMode = 1;
\r
35 public vtkCameraAndSelectorAction(InteractiveVtkPanel panel) {
\r
37 this.ren = panel.GetRenderer();
\r
38 this.rw = panel.GetRenderWindow();
\r
39 this.cam = ren.GetActiveCamera();
\r
42 public void Lock() {
\r
46 public void UnLock() {
\r
50 public void InteractionModeRotate()
\r
52 this.InteractionMode = 1;
\r
55 public void InteractionModeTranslate()
\r
57 this.InteractionMode = 2;
\r
60 public void InteractionModeZoom()
\r
62 this.InteractionMode = 3;
\r
65 public void resetCameraClippingRange() {
\r
67 ren.ResetCameraClippingRange();
\r
71 public void resetCamera() {
\r
77 public void mousePressed(MouseEvent e)
\r
80 if (ren.VisibleActorCount() == 0) return;
\r
81 rw.SetDesiredUpdateRate(5.0);
\r
84 if ((e.getModifiers()==InputEvent.BUTTON2_MASK) ||
\r
85 (e.getModifiers()==(InputEvent.BUTTON1_MASK | InputEvent.SHIFT_MASK)))
\r
87 InteractionModeTranslate();
\r
89 else if (e.getModifiers()==InputEvent.BUTTON3_MASK)
\r
91 InteractionModeZoom();
\r
95 InteractionModeRotate();
\r
99 public void mouseReleased(MouseEvent e)
\r
101 rw.SetDesiredUpdateRate(0.01);
\r
106 public void mouseDragged(MouseEvent e)
\r
108 if (ren.VisibleActorCount() == 0) return;
\r
112 if (this.InteractionMode == 1)
\r
114 cam.Azimuth(lastX - x);
\r
115 cam.Elevation(y - lastY);
\r
116 cam.OrthogonalizeViewUp();
\r
117 resetCameraClippingRange();
\r
118 panel.UpdateLight();
\r
121 if (this.InteractionMode == 2)
\r
125 double APoint[] = new double[3];
\r
129 // get the current focal point and position
\r
130 FPoint = cam.GetFocalPoint();
\r
131 PPoint = cam.GetPosition();
\r
133 // calculate the focal depth since we'll be using it a lot
\r
134 ren.SetWorldPoint(FPoint[0],FPoint[1],FPoint[2],1.0);
\r
135 ren.WorldToDisplay();
\r
136 focalDepth = ren.GetDisplayPoint()[2];
\r
138 APoint[0] = rw.GetSize()[0]/2.0 + (x - lastX);
\r
139 APoint[1] = rw.GetSize()[1]/2.0 - (y - lastY);
\r
140 APoint[2] = focalDepth;
\r
141 ren.SetDisplayPoint(APoint);
\r
142 ren.DisplayToWorld();
\r
143 RPoint = ren.GetWorldPoint();
\r
144 if (RPoint[3] != 0.0)
\r
146 RPoint[0] = RPoint[0]/RPoint[3];
\r
147 RPoint[1] = RPoint[1]/RPoint[3];
\r
148 RPoint[2] = RPoint[2]/RPoint[3];
\r
152 * Compute a translation vector, moving everything 1/2
\r
153 * the distance to the cursor. (Arbitrary scale factor)
\r
156 (FPoint[0]-RPoint[0])/2.0 + FPoint[0],
\r
157 (FPoint[1]-RPoint[1])/2.0 + FPoint[1],
\r
158 (FPoint[2]-RPoint[2])/2.0 + FPoint[2]);
\r
160 (FPoint[0]-RPoint[0])/2.0 + PPoint[0],
\r
161 (FPoint[1]-RPoint[1])/2.0 + PPoint[1],
\r
162 (FPoint[2]-RPoint[2])/2.0 + PPoint[2]);
\r
163 resetCameraClippingRange();
\r
166 if (this.InteractionMode == 3)
\r
169 //double clippingRange[];
\r
171 zoomFactor = Math.pow(1.02,(y - lastY));
\r
172 if (cam.GetParallelProjection() == 1)
\r
174 cam.SetParallelScale(cam.GetParallelScale()/zoomFactor);
\r
178 cam.Dolly(zoomFactor);
\r
179 resetCameraClippingRange();
\r
188 private List<vtkProp> selectActors = new ArrayList<vtkProp>();
\r
189 private List<vtkProp> hoverActor = new ArrayList<vtkProp>();
\r
192 public void mouseClicked(MouseEvent e) {
\r
193 if (!panel.isFocusOwner())
\r
195 if (e.getButton() != MouseEvent.BUTTON1)
\r
197 vtkProp spick[] = panel.pick(e.getX(), e.getY());
\r
198 if (spick != null && spick.length > 0) {
\r
199 for (vtkProp selectActor : spick) {
\r
200 if (!e.isControlDown()) {
\r
201 selectActors.clear();
\r
202 selectActors.add(selectActor);
\r
204 if (selectActors.contains(selectActor))
\r
205 selectActors.remove(selectActor);
\r
207 selectActors.add(selectActor);
\r
210 fireSelectionChanged();
\r
211 } else if (!e.isControlDown()) {
\r
212 selectActors.clear();
\r
213 fireSelectionChanged();
\r
216 // if (e.getClickCount() > 1)
\r
217 // updatePickRay(e.getX(), e.getY());
\r
221 // private void updatePickRay(double x , double y) {
\r
222 // Ray ray = vtkUtil.createMouseRay(panel.GetRenderer(), x, y);
\r
225 // System.out.println(ray.pos + " " + ray.dir);
\r
226 // vtkPoints linePoints = new vtkPoints();
\r
227 // linePoints.InsertPoint(0,ray.pos.x, ray.pos.y, ray.pos.z);
\r
228 // linePoints.InsertPoint(1, ray.pos.x + ray.dir.x, ray.pos.y + ray.dir.y, ray.pos.z + ray.dir.z);
\r
229 // vtkLine aLine = new vtkLine();
\r
230 // aLine.GetPointIds().SetId(0, 0);
\r
231 // aLine.GetPointIds().SetId(1, 1);
\r
232 // vtkUnstructuredGrid aLineGrid = new vtkUnstructuredGrid();
\r
233 // aLineGrid.Allocate(1, 1);
\r
234 // aLineGrid.InsertNextCell(aLine.GetCellType(), aLine.GetPointIds());
\r
235 // aLineGrid.SetPoints(linePoints);
\r
236 // vtkDataSetMapper aLineMapper = new vtkDataSetMapper();
\r
237 // aLineMapper.SetInput(aLineGrid);
\r
238 // vtkActor aLineActor = new vtkActor();
\r
239 // aLineActor.SetMapper(aLineMapper);
\r
240 // aLineActor.GetProperty().SetDiffuseColor(.2, 1, 1);
\r
242 // if (rayActor != null) {
\r
243 // panel.GetRenderer().RemoveActor(rayActor);
\r
244 // rayActor.Delete();
\r
246 // rayActor = aLineActor;
\r
247 // panel.GetRenderer().AddActor(rayActor);
\r
249 // linePoints.Delete();
\r
251 // aLineGrid.Delete();
\r
252 // aLineMapper.Delete();
\r
253 // panel.repaint();
\r
256 // private vtkActor rayActor;
\r
259 public void mouseMoved(MouseEvent e) {
\r
263 if (!panel.isFocusOwner())
\r
265 List<vtkProp> prevHover = new ArrayList<vtkProp>();
\r
266 prevHover.addAll(hoverActor);
\r
267 hoverActor.clear();
\r
268 vtkProp pick[] = panel.pick(e.getX(),e.getY());
\r
269 if (pick != null) {
\r
270 for (vtkProp p : pick)
\r
274 if (!prevHover.containsAll(hoverActor) || !hoverActor.containsAll(prevHover)) {
\r
275 fireHoverChanged();
\r
279 public List<vtkProp> getSelectActor() {
\r
280 return selectActors;
\r
283 public List<vtkProp> getHoverActor() {
\r
287 private List<ISelectionChangedListener> selectionListeners = new ArrayList<ISelectionChangedListener>();
\r
290 public void addSelectionChangedListener(ISelectionChangedListener listener) {
\r
291 selectionListeners.add(listener);
\r
295 public ISelection getSelection() {
\r
296 return new StructuredSelection(selectActors);
\r
300 public void removeSelectionChangedListener(
\r
301 ISelectionChangedListener listener) {
\r
302 selectionListeners.remove(listener);
\r
306 public void setSelection(ISelection selection) {
\r
307 setSelection(selection, false);
\r
311 public void setSelection(ISelection selection, boolean fire) {
\r
312 Collection<vtkProp> selectedProps = AdaptationUtils.adaptToCollection(selection, vtkProp.class);
\r
314 selectActors.clear();
\r
315 selectActors.addAll(selectedProps);
\r
317 fireSelectionChanged();
\r
320 private void fireSelectionChanged() {
\r
321 Display.getDefault().asyncExec(new Runnable() {
\r
323 public void run() {
\r
325 SelectionChangedEvent evt = new SelectionChangedEvent(vtkCameraAndSelectorAction.this, new StructuredSelection(selectActors));
\r
326 for (ISelectionChangedListener l :selectionListeners) {
\r
327 l.selectionChanged(evt);
\r
335 private List<ISelectionChangedListener> hoverListeners = new ArrayList<ISelectionChangedListener>();
\r
338 public void addHoverChangedListener(ISelectionChangedListener listener) {
\r
339 hoverListeners.add(listener);
\r
343 public ISelection getHoverSelection() {
\r
344 return new StructuredSelection(hoverActor);
\r
347 public void removeHoverChangedListener(
\r
348 ISelectionChangedListener listener) {
\r
349 hoverListeners.remove(listener);
\r
352 private void fireHoverChanged() {
\r
353 Display.getDefault().asyncExec(new Runnable() {
\r
355 public void run() {
\r
356 StructuredSelection sel = null;
\r
357 if (hoverActor == null)
\r
358 sel = new StructuredSelection();
\r
360 sel = new StructuredSelection(hoverActor);
\r
361 SelectionChangedEvent evt = new SelectionChangedEvent(vtkCameraAndSelectorAction.this, sel);
\r
362 for (ISelectionChangedListener l :hoverListeners) {
\r
363 l.selectionChanged(evt);
\r