aboutsummaryrefslogtreecommitdiff
path: root/engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java')
-rw-r--r--engine/src/lwjgl/com/jme3/input/lwjgl/JInputJoyInput.java194
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;
+ }
+
+}