]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java
7400308df8e3ee1ab4d53581c4ad6d4f1d87108a
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / handlers / ParallelPerspectiveHandler.java
1 package org.simantics.g3d.vtk.handlers;\r
2 \r
3 import java.util.HashMap;\r
4 import java.util.Map;\r
5 \r
6 import javax.vecmath.Vector3d;\r
7 \r
8 import org.eclipse.core.commands.AbstractHandler;\r
9 import org.eclipse.core.commands.Command;\r
10 import org.eclipse.core.commands.ExecutionEvent;\r
11 import org.eclipse.core.commands.ExecutionException;\r
12 import org.eclipse.ui.IWorkbenchPart;\r
13 import org.eclipse.ui.handlers.HandlerUtil;\r
14 import org.simantics.g3d.vtk.common.InteractiveVtkPanel;\r
15 import org.simantics.utils.threads.AWTThread;\r
16 import org.simantics.utils.threads.ThreadUtils;\r
17 \r
18 public class ParallelPerspectiveHandler extends AbstractHandler {\r
19 \r
20         \r
21         private Map<InteractiveVtkPanel,Vector3d> cameraPos = new HashMap<InteractiveVtkPanel, Vector3d>();\r
22         \r
23         @Override\r
24         public Object execute(ExecutionEvent event) throws ExecutionException {\r
25                  Command command = event.getCommand();\r
26              boolean oldValue = HandlerUtil.toggleCommandState(command);\r
27              final boolean activate = !oldValue;\r
28              \r
29              final IWorkbenchPart ap = HandlerUtil.getActiveEditor(event);\r
30              final InteractiveVtkPanel panel = (InteractiveVtkPanel)ap.getAdapter(InteractiveVtkPanel.class);\r
31              \r
32              ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
33                         \r
34                         @Override\r
35                         public void run() {\r
36                                 if (activate){\r
37                                         Vector3d focal = new Vector3d(panel.GetRenderer().GetActiveCamera().GetFocalPoint());\r
38                                         Vector3d pos = new Vector3d(panel.GetRenderer().GetActiveCamera().GetPosition());\r
39                                         cameraPos.put(panel, pos);\r
40                                         Vector3d dir = new Vector3d(pos);\r
41                                         dir.sub(focal);\r
42                                         dir.normalize();\r
43                                         dir.scale(100);\r
44                                         dir.add(focal);\r
45                                         panel.GetRenderer().GetActiveCamera().SetPosition(dir.x, dir.y, dir.z);\r
46                                         \r
47                                         \r
48                                         panel.GetRenderer().GetActiveCamera().SetParallelProjection(1);\r
49                                         panel.GetRenderer().ResetCameraClippingRange();\r
50                                 } else {\r
51                                         panel.GetRenderer().GetActiveCamera().SetParallelProjection(0);\r
52                                         Vector3d pos = cameraPos.get(panel);\r
53                                         if (pos != null) {\r
54                                                 panel.GetRenderer().GetActiveCamera().SetPosition(pos.x, pos.y, pos.z);\r
55                                         }\r
56                                         panel.GetRenderer().ResetCameraClippingRange();\r
57                                         \r
58                                 }\r
59                                 panel.UpdateLight();\r
60                                 panel.repaint();\r
61 \r
62                         }\r
63                  });\r
64             \r
65              return null;\r
66              \r
67         }\r
68         \r
69         \r
70         \r
71 }\r