*******************************************************************************/
package org.simantics.g3d.vtk.handlers;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.vecmath.Vector3d;
-
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.simantics.utils.threads.AWTThread;
import org.simantics.utils.threads.ThreadUtils;
+import vtk.vtkCamera;
+import vtk.vtkRenderer;
+
public class ParallelPerspectiveHandler extends AbstractHandler {
- private Map<VtkView,Vector3d> cameraPos = new HashMap<VtkView, Vector3d>();
-
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
- Command command = event.getCommand();
- boolean oldValue = HandlerUtil.toggleCommandState(command);
- final boolean activate = !oldValue;
-
- final IWorkbenchPart ap = HandlerUtil.getActiveEditor(event);
- final VtkView panel = (VtkView)ap.getAdapter(VtkView.class);
-
- ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
-
+ Command command = event.getCommand();
+ boolean oldValue = HandlerUtil.toggleCommandState(command);
+ final boolean activate = !oldValue;
+
+ final IWorkbenchPart ap = HandlerUtil.getActiveEditor(event);
+ final VtkView panel = (VtkView)ap.getAdapter(VtkView.class);
+
+ ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
+
@Override
public void run() {
+ vtkRenderer ren = panel.getRenderer();
+ vtkCamera cam = ren.GetActiveCamera();
if (activate){
- Vector3d focal = new Vector3d(panel.getRenderer().GetActiveCamera().GetFocalPoint());
- Vector3d pos = new Vector3d(panel.getRenderer().GetActiveCamera().GetPosition());
- cameraPos.put(panel, pos);
- Vector3d dir = new Vector3d(pos);
- dir.sub(focal);
- dir.normalize();
- dir.scale(100);
- dir.add(focal);
- panel.getRenderer().GetActiveCamera().SetPosition(dir.x, dir.y, dir.z);
-
-
- panel.getRenderer().GetActiveCamera().SetParallelProjection(1);
- panel.getRenderer().ResetCameraClippingRange();
+ double distance = cam.GetDistance();
+ double angle = cam.GetViewAngle();
+ double scale = Math.tan(Math.toRadians(angle / 2)) * distance;
+ cam.SetParallelScale(scale);
+ cam.SetParallelProjection(1);
+ ren.ResetCameraClippingRange();
} else {
- panel.getRenderer().GetActiveCamera().SetParallelProjection(0);
- Vector3d pos = cameraPos.get(panel);
- if (pos != null) {
- panel.getRenderer().GetActiveCamera().SetPosition(pos.x, pos.y, pos.z);
- }
- panel.getRenderer().ResetCameraClippingRange();
-
+ cam.SetParallelProjection(0);
+ ren.ResetCameraClippingRange();
}
-// panel.UpdateLight();
panel.refresh();
}
- });
-
- return null;
-
+ });
+
+ return null;
+
}