package edu.stanford.rsl.conrad.opencl.GLCLDemo; import java.awt.Component; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.media.opengl.GL2; /** * Utility class for interacting with a scene. Supports rotation and zoom around origin. * @author Michael Bien */ public class UserSceneInteraction { private float z = -20; private float rotx = 45; private float roty = 30; private Point dragstart; private enum MOUSE_MODE { DRAG_ROTATE, DRAG_ZOOM } private MOUSE_MODE dragmode = MOUSE_MODE.DRAG_ROTATE; public void init(Component component) { initMouseListeners(component); } private void initMouseListeners(Component component) { component.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { if (dragstart != null) { switch (dragmode) { case DRAG_ROTATE: rotx += e.getY() - dragstart.getY(); roty += e.getX() - dragstart.getX(); break; case DRAG_ZOOM: z += (e.getY() - dragstart.getY()) / 5.0f; break; } } dragstart = e.getPoint(); } }); component.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { z += e.getWheelRotation()*5; } }); component.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { switch (e.getButton()) { case (MouseEvent.BUTTON1): dragmode = MOUSE_MODE.DRAG_ROTATE; break; case (MouseEvent.BUTTON2): dragmode = MOUSE_MODE.DRAG_ZOOM; break; case (MouseEvent.BUTTON3): dragmode = MOUSE_MODE.DRAG_ZOOM; break; } } @Override public void mouseReleased(MouseEvent e) { switch (e.getButton()) { case (MouseEvent.BUTTON1): dragmode = MOUSE_MODE.DRAG_ZOOM; break; case (MouseEvent.BUTTON2): dragmode = MOUSE_MODE.DRAG_ROTATE; break; case (MouseEvent.BUTTON3): dragmode = MOUSE_MODE.DRAG_ROTATE; break; } dragstart = null; } }); } public void interact(GL2 gl) { gl.glTranslatef(0, 0, z); gl.glRotatef(rotx, 1f, 0f, 0f); gl.glRotatef(roty, 0f, 1.0f, 0f); } }