diff options
Diffstat (limited to 'engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java')
-rw-r--r-- | engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java b/engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java new file mode 100644 index 0000000..28e35f0 --- /dev/null +++ b/engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java @@ -0,0 +1,194 @@ +package com.jme3.input.lwjgl; + +import com.jme3.input.InputManager; +import com.jme3.input.JoyInput; +import com.jme3.input.Joystick; +import com.jme3.input.RawInputListener; +import com.jme3.input.event.JoyAxisEvent; +import com.jme3.input.event.JoyButtonEvent; +import com.jme3.util.IntMap; +import java.util.HashMap; +import net.java.games.input.Component.Identifier; +import net.java.games.input.Component.Identifier.Axis; +import net.java.games.input.Component.Identifier.Button; +import net.java.games.input.Component.POV; +import net.java.games.input.*; + +public class JInputJoyInput implements JoyInput { + + private boolean inited = false; + private Joystick[] joysticks; + private RawInputListener listener; + + private HashMap<Button, Integer>[] buttonIdsToIndices; + private HashMap<Axis, Integer>[] axisIdsToIndices; + private HashMap<Controller, Integer> controllerToIndices; + private IntMap<Controller> indicesToController; + + private int xAxis, yAxis; + + private void loadIdentifiers(int controllerIdx, Controller c){ + Component[] ces = c.getComponents(); + int numButtons = 0; + int numAxes = 0; + xAxis = -1; + yAxis = -1; + for (Component comp : ces){ + Identifier id = comp.getIdentifier(); + if (id instanceof Button){ + buttonIdsToIndices[controllerIdx].put((Button)id, numButtons); + numButtons ++; + }else if (id instanceof Axis){ + Axis axis = (Axis) id; + if (axis == Axis.X){ + xAxis = numAxes; + }else if (axis == Axis.Y){ + yAxis = numAxes; + } + + axisIdsToIndices[controllerIdx].put((Axis)id, numAxes); + numAxes ++; + } + } + } + + public void setJoyRumble(int joyId, float amount){ + Controller c = indicesToController.get(joyId); + if (c == null) + throw new IllegalArgumentException(); + + for (Rumbler r : c.getRumblers()){ + r.rumble(amount); + } + } + + public Joystick[] loadJoysticks(InputManager inputManager){ + ControllerEnvironment ce = + ControllerEnvironment.getDefaultEnvironment(); + + int joyIndex = 0; + controllerToIndices = new HashMap<Controller, Integer>(); + indicesToController = new IntMap<Controller>(); + Controller[] cs = ce.getControllers(); + for (int i = 0; i < cs.length; i++){ + Controller c = cs[i]; + if (c.getType() == Controller.Type.KEYBOARD + || c.getType() == Controller.Type.MOUSE) + continue; + + controllerToIndices.put(c, joyIndex); + indicesToController.put(joyIndex, c); + joyIndex ++; + } + + buttonIdsToIndices = new HashMap[joyIndex]; + axisIdsToIndices = new HashMap[joyIndex]; + joysticks = new Joystick[joyIndex]; + + joyIndex = 0; + + for (int i = 0; i < cs.length; i++){ + Controller c = cs[i]; + if (c.getType() == Controller.Type.KEYBOARD + || c.getType() == Controller.Type.MOUSE) + continue; + + buttonIdsToIndices[joyIndex] = new HashMap<Button, Integer>(); + axisIdsToIndices[joyIndex] = new HashMap<Axis, Integer>(); + loadIdentifiers(joyIndex, c); + Joystick joy = new Joystick(inputManager, + this, + joyIndex, c.getName(), + buttonIdsToIndices[joyIndex].size(), + axisIdsToIndices[joyIndex].size(), + xAxis, yAxis); + joysticks[joyIndex] = joy; + joyIndex++; + } + + return joysticks; + } + + public void initialize() { + inited = true; + } + + public void update() { + ControllerEnvironment ce = + ControllerEnvironment.getDefaultEnvironment(); + + Controller[] cs = ce.getControllers(); + Event e = new Event(); + for (int i = 0; i < cs.length; i++){ + Controller c = cs[i]; + if (c.getType() == Controller.Type.UNKNOWN + || c.getType() == Controller.Type.KEYBOARD + || c.getType() == Controller.Type.MOUSE) + continue; + + if (!c.poll()) + continue; + + int joyId = controllerToIndices.get(c); + EventQueue q = c.getEventQueue(); + while (q.getNextEvent(e)){ + Identifier id = e.getComponent().getIdentifier(); + if (id == Identifier.Axis.POV){ + float x = 0, y = 0; + float v = e.getValue(); + + if (v == POV.CENTER){ + x = 0; y = 0; + }else if (v == POV.DOWN){ + x = 0; y = -1f; + }else if (v == POV.DOWN_LEFT){ + x = -1f; y = -1f; + }else if (v == POV.DOWN_RIGHT){ + x = -1f; y = 1f; + }else if (v == POV.LEFT){ + x = -1f; y = 0; + }else if (v == POV.RIGHT){ + x = 1f; y = 0; + }else if (v == POV.UP){ + x = 0; y = 1f; + }else if (v == POV.UP_LEFT){ + x = -1f; y = 1f; + }else if (v == POV.UP_RIGHT){ + x = 1f; y = 1f; + } + + JoyAxisEvent evt1 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_X, x); + JoyAxisEvent evt2 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_Y, y); + listener.onJoyAxisEvent(evt1); + listener.onJoyAxisEvent(evt2); + }else if (id instanceof Axis){ + float value = e.getValue(); + Axis axis = (Axis) id; + JoyAxisEvent evt = new JoyAxisEvent(joyId, axisIdsToIndices[joyId].get(axis), value); + listener.onJoyAxisEvent(evt); + }else if (id instanceof Button){ + Button button = (Button) id; + JoyButtonEvent evt = new JoyButtonEvent(joyId, buttonIdsToIndices[joyId].get(button), e.getValue() == 1f); + listener.onJoyButtonEvent(evt); + } + } + } + } + + public void destroy() { + inited = false; + } + + public boolean isInitialized() { + return inited; + } + + public void setInputListener(RawInputListener listener) { + this.listener = listener; + } + + public long getInputTimeNanos() { + return 0; + } + +} |