159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.input.lwjgl; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.InputManager; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.JoyInput; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.Joystick; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.RawInputListener; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.event.JoyAxisEvent; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.event.JoyButtonEvent; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier.Axis; 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier.Button; 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.POV; 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.*; 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class JInputJoyInput implements JoyInput { 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean inited = false; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Joystick[] joysticks; 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private RawInputListener listener; 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private HashMap<Button, Integer>[] buttonIdsToIndices; 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private HashMap<Axis, Integer>[] axisIdsToIndices; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private HashMap<Controller, Integer> controllerToIndices; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private IntMap<Controller> indicesToController; 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int xAxis, yAxis; 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void loadIdentifiers(int controllerIdx, Controller c){ 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Component[] ces = c.getComponents(); 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int numButtons = 0; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int numAxes = 0; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta xAxis = -1; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta yAxis = -1; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Component comp : ces){ 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Identifier id = comp.getIdentifier(); 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (id instanceof Button){ 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonIdsToIndices[controllerIdx].put((Button)id, numButtons); 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numButtons ++; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (id instanceof Axis){ 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Axis axis = (Axis) id; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (axis == Axis.X){ 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta xAxis = numAxes; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (axis == Axis.Y){ 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta yAxis = numAxes; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta axisIdsToIndices[controllerIdx].put((Axis)id, numAxes); 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numAxes ++; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setJoyRumble(int joyId, float amount){ 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller c = indicesToController.get(joyId); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (c == null) 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalArgumentException(); 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Rumbler r : c.getRumblers()){ 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta r.rumble(amount); 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Joystick[] loadJoysticks(InputManager inputManager){ 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ControllerEnvironment ce = 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ControllerEnvironment.getDefaultEnvironment(); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int joyIndex = 0; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta controllerToIndices = new HashMap<Controller, Integer>(); 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indicesToController = new IntMap<Controller>(); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller[] cs = ce.getControllers(); 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cs.length; i++){ 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller c = cs[i]; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (c.getType() == Controller.Type.KEYBOARD 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || c.getType() == Controller.Type.MOUSE) 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta controllerToIndices.put(c, joyIndex); 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta indicesToController.put(joyIndex, c); 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joyIndex ++; 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonIdsToIndices = new HashMap[joyIndex]; 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta axisIdsToIndices = new HashMap[joyIndex]; 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joysticks = new Joystick[joyIndex]; 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joyIndex = 0; 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cs.length; i++){ 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller c = cs[i]; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (c.getType() == Controller.Type.KEYBOARD 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || c.getType() == Controller.Type.MOUSE) 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonIdsToIndices[joyIndex] = new HashMap<Button, Integer>(); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta axisIdsToIndices[joyIndex] = new HashMap<Axis, Integer>(); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadIdentifiers(joyIndex, c); 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Joystick joy = new Joystick(inputManager, 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this, 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joyIndex, c.getName(), 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonIdsToIndices[joyIndex].size(), 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta axisIdsToIndices[joyIndex].size(), 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta xAxis, yAxis); 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joysticks[joyIndex] = joy; 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joyIndex++; 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return joysticks; 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void initialize() { 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inited = true; 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void update() { 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ControllerEnvironment ce = 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ControllerEnvironment.getDefaultEnvironment(); 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller[] cs = ce.getControllers(); 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Event e = new Event(); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < cs.length; i++){ 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Controller c = cs[i]; 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (c.getType() == Controller.Type.UNKNOWN 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || c.getType() == Controller.Type.KEYBOARD 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta || c.getType() == Controller.Type.MOUSE) 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!c.poll()) 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int joyId = controllerToIndices.get(c); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta EventQueue q = c.getEventQueue(); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta while (q.getNextEvent(e)){ 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Identifier id = e.getComponent().getIdentifier(); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (id == Identifier.Axis.POV){ 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float x = 0, y = 0; 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float v = e.getValue(); 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (v == POV.CENTER){ 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = 0; y = 0; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.DOWN){ 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = 0; y = -1f; 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.DOWN_LEFT){ 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = -1f; y = -1f; 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.DOWN_RIGHT){ 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = -1f; y = 1f; 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.LEFT){ 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = -1f; y = 0; 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.RIGHT){ 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = 1f; y = 0; 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.UP){ 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = 0; y = 1f; 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.UP_LEFT){ 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = -1f; y = 1f; 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (v == POV.UP_RIGHT){ 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta x = 1f; y = 1f; 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JoyAxisEvent evt1 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_X, x); 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JoyAxisEvent evt2 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_Y, y); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.onJoyAxisEvent(evt1); 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.onJoyAxisEvent(evt2); 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (id instanceof Axis){ 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta float value = e.getValue(); 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Axis axis = (Axis) id; 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JoyAxisEvent evt = new JoyAxisEvent(joyId, axisIdsToIndices[joyId].get(axis), value); 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.onJoyAxisEvent(evt); 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (id instanceof Button){ 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Button button = (Button) id; 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JoyButtonEvent evt = new JoyButtonEvent(joyId, buttonIdsToIndices[joyId].get(button), e.getValue() == 1f); 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta listener.onJoyButtonEvent(evt); 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void destroy() { 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inited = false; 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public boolean isInitialized() { 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return inited; 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setInputListener(RawInputListener listener) { 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.listener = listener; 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public long getInputTimeNanos() { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return 0; 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 195