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.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; import org.simantics.g3d.vtk.common.InteractiveVtkPanel; import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; public class CameraPositionHandler extends AbstractHandler { private Map cameraPos = new HashMap(); @Override public Object execute(ExecutionEvent event) throws ExecutionException { final IWorkbenchPart ap = HandlerUtil.getActiveEditor(event); final InteractiveVtkPanel panel = (InteractiveVtkPanel)ap.getAdapter(InteractiveVtkPanel.class); String param = event.getParameter("org.simantics.g3d.viewDirection"); String vals[] = param.split(","); final Vector3d direction = new Vector3d(Double.parseDouble(vals[0]),Double.parseDouble(vals[1]),Double.parseDouble(vals[2])); ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { @Override public void run() { 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); double distance = dir.length(); dir.set(direction); dir.scale(distance); dir.add(focal); panel.GetRenderer().GetActiveCamera().SetPosition(dir.x, dir.y, dir.z); if (Math.abs(direction.dot(new Vector3d(0,1,0))) < 0.95) panel.GetRenderer().GetActiveCamera().SetViewUp(0, 1, 0); else panel.GetRenderer().GetActiveCamera().SetViewUp(1, 0, 0); panel.GetRenderer().ResetCameraClippingRange(); panel.UpdateLight(); panel.repaint(); } }); return null; } }