/******************************************************************************* * Copyright (c) 2012, 2013 Association for Decentralized Information Management in * Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.g3d.vtk.handlers; import javax.vecmath.Vector3d; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.Command; 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 { @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() { @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()); 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); cam.SetPosition(dir.x, dir.y, dir.z); cam.SetParallelProjection(1); ren.ResetCameraClippingRange(); } else { 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.refresh(); } }); return null; } }