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[] buttonIdsToIndices; private HashMap[] axisIdsToIndices; private HashMap controllerToIndices; private IntMap 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(); indicesToController = new IntMap(); 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(); axisIdsToIndices[joyIndex] = new HashMap(); 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; } }