X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Fhandlers%2FParallelPerspectiveHandler.java;h=43ec97a090dda0c78c4c2b6d6bf205d7b569373b;hb=99366a416fcd1e18e0cf54c8efd255abfc8a01f4;hp=855a0d145286696194ac03b0511878b7b7d8ab04;hpb=84132a1d750c45f9161afbd58b78572964e50d26;p=simantics%2F3d.git diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java index 855a0d14..43ec97a0 100644 --- a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/handlers/ParallelPerspectiveHandler.java @@ -11,9 +11,6 @@ *******************************************************************************/ package org.simantics.g3d.vtk.handlers; -import java.util.HashMap; -import java.util.Map; - import javax.vecmath.Vector3d; import org.eclipse.core.commands.AbstractHandler; @@ -22,59 +19,72 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; +import org.simantics.g3d.math.MathTools; import org.simantics.g3d.vtk.common.VtkView; 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 cameraPos = new HashMap(); - @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); + double dist = MathTools.distance(pos, focal); + cam.SetParallelScale(dist/4.0); + // camera must be moved backwards, or graphics get clipped when parallel view is zoomed out + // TODO : is there a better way to do this? 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(); + cam.SetPosition(dir.x, dir.y, dir.z); + + 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(); + + double scale = cam.GetParallelScale(); + cam.SetParallelProjection(0); + Vector3d focal = new Vector3d(panel.getRenderer().GetActiveCamera().GetFocalPoint()); + Vector3d pos = new Vector3d(panel.getRenderer().GetActiveCamera().GetPosition()); + Vector3d dir = new Vector3d(pos); + dir.sub(focal); + dir.normalize(); + dir.scale(scale*4.0); + dir.add(focal); + cam.SetPosition(dir.x, dir.y, dir.z); + ren.ResetCameraClippingRange(); + } -// panel.UpdateLight(); panel.refresh(); } - }); - - return null; - + }); + + return null; + }