1 /*******************************************************************************
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g3d.vtk.awt;
14 import java.awt.event.InputEvent;
15 import java.awt.event.MouseEvent;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.List;
20 import javax.vecmath.Point2d;
21 import javax.vecmath.Point2i;
22 import javax.vecmath.Point3d;
24 import org.eclipse.jface.viewers.ISelection;
25 import org.eclipse.jface.viewers.ISelectionChangedListener;
26 import org.eclipse.jface.viewers.ISelectionProvider;
27 import org.eclipse.jface.viewers.SelectionChangedEvent;
28 import org.eclipse.jface.viewers.StructuredSelection;
29 import org.eclipse.swt.widgets.Display;
30 import org.simantics.g3d.tools.AdaptationUtils;
34 import vtk.vtkRenderWindow;
35 import vtk.vtkRenderer;
37 public class vtkCameraAndSelectorAction extends vtkAwtAction implements ISelectionProvider {
39 protected vtkRenderer ren;
42 protected vtkRenderWindow rw;
43 protected vtkCamera cam;
44 protected int InteractionMode = 1;
46 protected double activeRate = 5.0;
47 protected double passiveRate = 0.01;
48 protected boolean doNotRotate = true;
50 public vtkCameraAndSelectorAction(InteractiveVtkPanel panel) {
52 this.ren = panel.GetRenderer();
53 this.rw = panel.GetRenderWindow();
54 this.cam = ren.GetActiveCamera();
61 public void UnLock() {
65 public void InteractionModeRotate()
67 this.InteractionMode = 1;
70 public void InteractionModeTranslate()
72 this.InteractionMode = 2;
75 public void InteractionModeZoom()
77 this.InteractionMode = 3;
80 public void resetCameraClippingRange() {
82 ren.ResetCameraClippingRange();
86 public void resetCamera() {
92 public void mousePressed(MouseEvent e)
95 if (ren.VisibleActorCount() == 0) return;
96 rw.SetDesiredUpdateRate(activeRate);
99 if ((e.getModifiers()==InputEvent.BUTTON2_MASK) ||
100 (e.getModifiers()==(InputEvent.BUTTON1_MASK | InputEvent.SHIFT_MASK)))
102 InteractionModeTranslate();
104 else if (e.getModifiers()==InputEvent.BUTTON3_MASK)
106 InteractionModeZoom();
110 InteractionModeRotate();
114 public void mouseReleased(MouseEvent e)
116 rw.SetDesiredUpdateRate(passiveRate);
121 public void mouseDragged(MouseEvent e)
123 if (ren.VisibleActorCount() == 0) return;
127 if (this.InteractionMode == 1)
129 cam.Azimuth(lastX - x);
130 cam.Elevation(y - lastY);
133 cam.OrthogonalizeViewUp();
134 resetCameraClippingRange();
138 if (this.InteractionMode == 2)
142 double APoint[] = new double[3];
146 // get the current focal point and position
147 FPoint = cam.GetFocalPoint();
148 PPoint = cam.GetPosition();
150 // calculate the focal depth since we'll be using it a lot
151 ren.SetWorldPoint(FPoint[0],FPoint[1],FPoint[2],1.0);
152 ren.WorldToDisplay();
153 focalDepth = ren.GetDisplayPoint()[2];
155 APoint[0] = rw.GetSize()[0]/2.0 + (x - lastX);
156 APoint[1] = rw.GetSize()[1]/2.0 - (y - lastY);
157 APoint[2] = focalDepth;
158 ren.SetDisplayPoint(APoint);
159 ren.DisplayToWorld();
160 RPoint = ren.GetWorldPoint();
161 if (RPoint[3] != 0.0)
163 RPoint[0] = RPoint[0]/RPoint[3];
164 RPoint[1] = RPoint[1]/RPoint[3];
165 RPoint[2] = RPoint[2]/RPoint[3];
169 * Compute a translation vector, moving everything 1/2
170 * the distance to the cursor. (Arbitrary scale factor)
173 (FPoint[0]-RPoint[0])/2.0 + FPoint[0],
174 (FPoint[1]-RPoint[1])/2.0 + FPoint[1],
175 (FPoint[2]-RPoint[2])/2.0 + FPoint[2]);
177 (FPoint[0]-RPoint[0])/2.0 + PPoint[0],
178 (FPoint[1]-RPoint[1])/2.0 + PPoint[1],
179 (FPoint[2]-RPoint[2])/2.0 + PPoint[2]);
180 resetCameraClippingRange();
183 if (this.InteractionMode == 3)
186 //double clippingRange[];
188 zoomFactor = Math.pow(1.02,(y - lastY));
189 if (cam.GetParallelProjection() == 1)
191 cam.SetParallelScale(cam.GetParallelScale()/zoomFactor);
195 cam.Dolly(zoomFactor);
196 resetCameraClippingRange();
199 if (hoverActor.size() > 0) {
209 private List<vtkProp> selectActors = new ArrayList<vtkProp>();
210 private List<vtkProp> hoverActor = new ArrayList<vtkProp>();
213 public void mouseClicked(MouseEvent e) {
214 if (!panel.isFocusOwner())
216 if (e.getButton() != MouseEvent.BUTTON1)
220 vtkProp spick[] = panel.pick(e.getX(), e.getY());
221 if (spick != null && spick.length > 0) {
222 for (vtkProp selectActor : spick) {
223 if (!e.isControlDown()) {
224 selectActors.clear();
225 selectActors.add(selectActor);
227 if (selectActors.contains(selectActor))
228 selectActors.remove(selectActor);
230 selectActors.add(selectActor);
233 fireSelectionChanged();
234 } else if (!e.isControlDown()) {
235 selectActors.clear();
236 fireSelectionChanged();
239 // if (e.getClickCount() > 1)
240 // updatePickRay(e.getX(), e.getY());
244 // private void updatePickRay(double x , double y) {
245 // Ray ray = vtkUtil.createMouseRay(panel.GetRenderer(), x, y);
248 // System.out.println(ray.pos + " " + ray.dir);
249 // vtkPoints linePoints = new vtkPoints();
250 // linePoints.InsertPoint(0,ray.pos.x, ray.pos.y, ray.pos.z);
251 // linePoints.InsertPoint(1, ray.pos.x + ray.dir.x, ray.pos.y + ray.dir.y, ray.pos.z + ray.dir.z);
252 // vtkLine aLine = new vtkLine();
253 // aLine.GetPointIds().SetId(0, 0);
254 // aLine.GetPointIds().SetId(1, 1);
255 // vtkUnstructuredGrid aLineGrid = new vtkUnstructuredGrid();
256 // aLineGrid.Allocate(1, 1);
257 // aLineGrid.InsertNextCell(aLine.GetCellType(), aLine.GetPointIds());
258 // aLineGrid.SetPoints(linePoints);
259 // vtkDataSetMapper aLineMapper = new vtkDataSetMapper();
260 // aLineMapper.SetInput(aLineGrid);
261 // vtkActor aLineActor = new vtkActor();
262 // aLineActor.SetMapper(aLineMapper);
263 // aLineActor.GetProperty().SetDiffuseColor(.2, 1, 1);
265 // if (rayActor != null) {
266 // panel.GetRenderer().RemoveActor(rayActor);
267 // rayActor.Delete();
269 // rayActor = aLineActor;
270 // panel.GetRenderer().AddActor(rayActor);
272 // linePoints.Delete();
274 // aLineGrid.Delete();
275 // aLineMapper.Delete();
279 // private vtkActor rayActor;
282 public void mouseMoved(MouseEvent e) {
286 if (!panel.isFocusOwner())
288 List<vtkProp> prevHover = new ArrayList<vtkProp>();
289 prevHover.addAll(hoverActor);
291 vtkProp pick[] = panel.pick(e.getX(),e.getY());
293 for (vtkProp p : pick)
297 if (!prevHover.containsAll(hoverActor) || !hoverActor.containsAll(prevHover)) {
303 public void mouseExited(MouseEvent e) {
304 if (hoverActor.size() > 0) {
311 * Returns mouse position in AWT screen coordinates.
314 public Point2i getMousePositionAWT() {
315 return new Point2i(lastX, lastY);
319 * Returns mouse position in VTK screen coordinates.
322 public Point2d getMousePosition() {
323 return new Point2d(lastX, rw.GetSize()[1]-lastY);
326 public List<vtkProp> getSelectActor() {
330 public List<vtkProp> getHoverActor() {
334 private List<ISelectionChangedListener> selectionListeners = new ArrayList<ISelectionChangedListener>();
337 public void addSelectionChangedListener(ISelectionChangedListener listener) {
338 selectionListeners.add(listener);
342 public ISelection getSelection() {
343 return new StructuredSelection(selectActors);
347 public void removeSelectionChangedListener(
348 ISelectionChangedListener listener) {
349 selectionListeners.remove(listener);
353 public void setSelection(ISelection selection) {
354 setSelection(selection, false);
358 public void setSelection(ISelection selection, boolean fire) {
359 Collection<vtkProp> selectedProps = AdaptationUtils.adaptToCollection(selection, vtkProp.class);
361 selectActors.clear();
362 selectActors.addAll(selectedProps);
364 fireSelectionChanged();
367 private void fireSelectionChanged() {
368 Display.getDefault().asyncExec(new Runnable() {
372 SelectionChangedEvent evt = new SelectionChangedEvent(vtkCameraAndSelectorAction.this, new StructuredSelection(selectActors));
373 for (ISelectionChangedListener l :selectionListeners) {
374 l.selectionChanged(evt);
382 private List<ISelectionChangedListener> hoverListeners = new ArrayList<ISelectionChangedListener>();
385 public void addHoverChangedListener(ISelectionChangedListener listener) {
386 hoverListeners.add(listener);
390 public ISelection getHoverSelection() {
391 return new StructuredSelection(hoverActor);
394 public void removeHoverChangedListener(
395 ISelectionChangedListener listener) {
396 hoverListeners.remove(listener);
399 private void fireHoverChanged() {
400 Display.getDefault().asyncExec(new Runnable() {
403 StructuredSelection sel = null;
404 if (hoverActor == null)
405 sel = new StructuredSelection();
407 sel = new StructuredSelection(hoverActor);
408 SelectionChangedEvent evt = new SelectionChangedEvent(vtkCameraAndSelectorAction.this, sel);
409 for (ISelectionChangedListener l :hoverListeners) {
410 l.selectionChanged(evt);
417 public vtkCamera getCamera() {
421 public Point3d getPosition() {
422 double pos[] = cam.GetPosition();
423 return new Point3d(pos);
426 public Point3d getFocus() {
427 double pos[] = cam.GetFocalPoint();
428 return new Point3d(pos);
431 public void setFocus(Point3d focus) {
432 setFocus(focus.x,focus.y,focus.z);
435 public void setFocus(double x, double y, double z) {
437 cam.SetFocalPoint(x, y, z);
440 cam.OrthogonalizeViewUp();
441 ren.ResetCameraClippingRange();
446 public void setPosition(Point3d position) {
447 setPosition(position.x,position.y,position.z);
450 public void setPosition(double x, double y, double z) {
452 cam.SetPosition(x, y, z);
455 cam.OrthogonalizeViewUp();
456 ren.ResetCameraClippingRange();