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=9077bfb55726c21bbaa09b5d2b6e11310b677c67;hp=70eb3a63d25a3afe94fac46ec31e77b8c91817a8;hpb=53d55c24c779745f188bdb18d32f71d20acb61b2;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 70eb3a63..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,15 +19,17 @@ 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(); @@ -44,30 +43,41 @@ public class ParallelPerspectiveHandler extends AbstractHandler { @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); - + cam.SetPosition(dir.x, dir.y, dir.z); - panel.getRenderer().GetActiveCamera().SetParallelProjection(1); - panel.getRenderer().ResetCameraClippingRange(); + 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(); }