diff --git a/src/java/com/threerings/jme/JmeApp.java b/src/java/com/threerings/jme/JmeApp.java index 79ad9aead..94d938a11 100644 --- a/src/java/com/threerings/jme/JmeApp.java +++ b/src/java/com/threerings/jme/JmeApp.java @@ -43,6 +43,7 @@ import com.jme.system.lwjgl.LWJGLPropertiesDialog; import com.jme.bui.event.InputDispatcher; import com.jme.input.InputHandler; import com.jme.input.InputSystem; +import com.jme.input.Mouse; import com.jme.light.PointLight; import com.jme.math.Vector3f; @@ -242,11 +243,28 @@ public class JmeApp */ protected void initInput () { - _input = new GodViewHandler(null, _camera, _properties.getRenderer()); + _input = createInputHandler(_camera, _properties.getRenderer()); + _input.setMouse(createMouse()); + } + /** + * Creates the input handler used to control our camera and manage + * non-UI keyboard input. + */ + protected InputHandler createInputHandler (Camera camera, String api) + { + return new GodViewHandler(camera, api); + } + + /** + * Creates the type of mouse handler we'll use to manage the mouse + * position. + */ + protected Mouse createMouse () + { HardwareMouse mouse = new HardwareMouse("Mouse"); mouse.setMouseInput(InputSystem.getMouseInput()); - _input.setMouse(mouse); + return mouse; } /** diff --git a/src/java/com/threerings/jme/input/GodViewHandler.java b/src/java/com/threerings/jme/input/GodViewHandler.java index ef1c9336f..28db35c7e 100644 --- a/src/java/com/threerings/jme/input/GodViewHandler.java +++ b/src/java/com/threerings/jme/input/GodViewHandler.java @@ -29,17 +29,14 @@ public class GodViewHandler extends InputHandler /** * Creates the handler. * - * @param app The application to be terminated on an "exit" action or - * null if this functionality is not desired. * @param cam The camera to move with this handler. * @param api The API from which to create a KeyBindingManager. */ - public GodViewHandler (JmeApp app, Camera cam, String api) + public GodViewHandler (Camera cam, String api) { _camera = cam; setKeyBindings(api); - setMouse(cam); - setActions(cam, app); + addActions(cam); } /** @@ -52,6 +49,26 @@ public class GodViewHandler extends InputHandler _maxZ = maxZ; } + /** + * Configures limits on the camera roll. + */ + public void setRollLimits (float minAngle, float maxAngle) + { + _minRoll = minAngle; + _maxRoll = maxAngle; + } + + /** + * Configures limits on the distance the camera can be panned. + */ + public void setPanLimits (float minX, float minY, float maxX, float maxY) + { + _minX = minX; + _minY = minY; + _maxX = maxX; + _maxY = maxY; + } + /** * Sets the camera zoom level to a value between zero (zoomed in * maximally) and 1 (zoomed out maximally). Zoom limits must have @@ -90,44 +107,32 @@ public class GodViewHandler extends InputHandler keyboard.set("rollForward", KeyInput.KEY_HOME); keyboard.set("rollBack", KeyInput.KEY_END); keyboard.set("screenshot", KeyInput.KEY_F12); - keyboard.set("exit", KeyInput.KEY_ESCAPE); setKeyBindingManager(keyboard); } - protected void setMouse (Camera cam) + protected void addActions (Camera cam) { -// RelativeMouse mouse = new RelativeMouse("Mouse Input"); -// mouse.setMouseInput(InputSystem.getMouseInput()); -// setMouse(mouse); - -// MouseLook mouseLook = new MouseLook(mouse, cam, 1.0f); -// mouseLook.setKey("mouselook"); -// mouseLook.setLockAxis( -// new Vector3f(cam.getUp().x, cam.getUp().y, cam.getUp().z)); -// addAction(mouseLook); - } - - protected void setActions (Camera cam, final JmeApp app) - { - if (app != null) { - KeyInputAction exit = new KeyInputAction() { - public void performAction (InputActionEvent evt) { - app.stop(); - } - }; - exit.setKey("exit"); - addAction(exit); - } - KeyScreenShotAction screen = new KeyScreenShotAction(); screen.setKey("screenshot"); addAction(screen); + addPanActions(cam); + addZoomActions(cam); + addOrbitActions(cam); + addRollActions(cam); + } + + /** + * Adds actions for panning the camera around the scene. + */ + protected void addPanActions (Camera cam) + { CameraAction forward = new CameraAction(cam, 0.5f) { public void performAction (InputActionEvent evt) { Vector3f loc = _camera.getLocation(); loc.addLocal(_rydir.mult(speed * evt.getTime(), _temp)); + boundPan(loc); _camera.setLocation(loc); _camera.update(); } @@ -139,6 +144,7 @@ public class GodViewHandler extends InputHandler public void performAction (InputActionEvent evt) { Vector3f loc = _camera.getLocation(); loc.subtractLocal(_rydir.mult(speed * evt.getTime(), _temp)); + boundPan(loc); _camera.setLocation(loc); _camera.update(); } @@ -150,6 +156,7 @@ public class GodViewHandler extends InputHandler public void performAction (InputActionEvent evt) { Vector3f loc = _camera.getLocation(); loc.subtractLocal(_rxdir.mult(speed * evt.getTime(), _temp)); + boundPan(loc); _camera.setLocation(loc); _camera.update(); } @@ -161,13 +168,20 @@ public class GodViewHandler extends InputHandler public void performAction (InputActionEvent evt) { Vector3f loc = _camera.getLocation(); loc.addLocal(_rxdir.mult(speed * evt.getTime(), _temp)); + boundPan(loc); _camera.setLocation(loc); _camera.update(); } }; right.setKey("right"); addAction(right); + } + /** + * Adds actions for zooming the camaera in and out. + */ + protected void addZoomActions (Camera cam) + { CameraAction zoomIn = new CameraAction(cam, 0.5f) { public void performAction (InputActionEvent evt) { Vector3f loc = _camera.getLocation(); @@ -195,7 +209,13 @@ public class GodViewHandler extends InputHandler }; zoomOut.setKey("zoomOut"); addAction(zoomOut); + } + /** + * Adds actions for orbiting the camera around the viewpoint. + */ + protected void addOrbitActions (Camera cam) + { OrbitAction orbitRight = new OrbitAction(-FastMath.PI / 2); orbitRight.setKey("turnRight"); addAction(orbitRight); @@ -203,7 +223,13 @@ public class GodViewHandler extends InputHandler OrbitAction orbitLeft = new OrbitAction(FastMath.PI / 2); orbitLeft.setKey("turnLeft"); addAction(orbitLeft); + } + /** + * Adds actions for rolling the camera around the yaw axis. + */ + protected void addRollActions (Camera cam) + { RollAction rollForward = new RollAction(-FastMath.PI / 2); rollForward.setKey("rollForward"); addAction(rollForward); @@ -255,6 +281,12 @@ public class GodViewHandler extends InputHandler return camera.getLocation().add(camera.getDirection().mult(dist)); } + protected void boundPan (Vector3f loc) + { + loc.x = Math.max(Math.min(loc.x, _maxX), _minX); + loc.y = Math.max(Math.min(loc.y, _maxY), _minY); + } + protected abstract class CameraAction extends KeyInputAction { public CameraAction (Camera camera, float speed) @@ -303,7 +335,11 @@ public class GodViewHandler extends InputHandler protected Camera _camera; protected Matrix3f _rotm = new Matrix3f(); + protected float _minX = Float.MIN_VALUE, _maxX = Float.MAX_VALUE; + protected float _minY = Float.MIN_VALUE, _maxY = Float.MAX_VALUE; protected float _minZ = Float.MIN_VALUE, _maxZ = Float.MAX_VALUE; + protected float _minRoll = Float.MIN_VALUE, _maxRoll = Float.MAX_VALUE; + protected static final Vector3f _xdir = new Vector3f(1, 0, 0); protected static final Vector3f _ydir = new Vector3f(0, 1, 0);