Home | History | Annotate | Download | only in lwjgl
      1 package com.jme3.input.lwjgl;
      2 
      3 import com.jme3.input.InputManager;
      4 import com.jme3.input.JoyInput;
      5 import com.jme3.input.Joystick;
      6 import com.jme3.input.RawInputListener;
      7 import com.jme3.input.event.JoyAxisEvent;
      8 import com.jme3.input.event.JoyButtonEvent;
      9 import com.jme3.util.IntMap;
     10 import java.util.HashMap;
     11 import net.java.games.input.Component.Identifier;
     12 import net.java.games.input.Component.Identifier.Axis;
     13 import net.java.games.input.Component.Identifier.Button;
     14 import net.java.games.input.Component.POV;
     15 import net.java.games.input.*;
     16 
     17 public class JInputJoyInput implements JoyInput {
     18 
     19     private boolean inited = false;
     20     private Joystick[] joysticks;
     21     private RawInputListener listener;
     22 
     23     private HashMap<Button, Integer>[] buttonIdsToIndices;
     24     private HashMap<Axis, Integer>[] axisIdsToIndices;
     25     private HashMap<Controller, Integer> controllerToIndices;
     26     private IntMap<Controller> indicesToController;
     27 
     28     private int xAxis, yAxis;
     29 
     30     private void loadIdentifiers(int controllerIdx, Controller c){
     31         Component[] ces = c.getComponents();
     32         int numButtons = 0;
     33         int numAxes = 0;
     34         xAxis = -1;
     35         yAxis = -1;
     36         for (Component comp : ces){
     37             Identifier id = comp.getIdentifier();
     38             if (id instanceof Button){
     39                 buttonIdsToIndices[controllerIdx].put((Button)id, numButtons);
     40                 numButtons ++;
     41             }else if (id instanceof Axis){
     42                 Axis axis = (Axis) id;
     43                 if (axis == Axis.X){
     44                     xAxis = numAxes;
     45                 }else if (axis == Axis.Y){
     46                     yAxis = numAxes;
     47                 }
     48 
     49                 axisIdsToIndices[controllerIdx].put((Axis)id, numAxes);
     50                 numAxes ++;
     51             }
     52         }
     53     }
     54 
     55     public void setJoyRumble(int joyId, float amount){
     56         Controller c = indicesToController.get(joyId);
     57         if (c == null)
     58             throw new IllegalArgumentException();
     59 
     60         for (Rumbler r : c.getRumblers()){
     61             r.rumble(amount);
     62         }
     63     }
     64 
     65     public Joystick[] loadJoysticks(InputManager inputManager){
     66         ControllerEnvironment ce =
     67             ControllerEnvironment.getDefaultEnvironment();
     68 
     69         int joyIndex = 0;
     70         controllerToIndices = new HashMap<Controller, Integer>();
     71         indicesToController = new IntMap<Controller>();
     72         Controller[] cs = ce.getControllers();
     73         for (int i = 0; i < cs.length; i++){
     74             Controller c = cs[i];
     75             if (c.getType() == Controller.Type.KEYBOARD
     76              || c.getType() == Controller.Type.MOUSE)
     77                 continue;
     78 
     79             controllerToIndices.put(c, joyIndex);
     80             indicesToController.put(joyIndex, c);
     81             joyIndex ++;
     82         }
     83 
     84         buttonIdsToIndices = new HashMap[joyIndex];
     85         axisIdsToIndices = new HashMap[joyIndex];
     86         joysticks = new Joystick[joyIndex];
     87 
     88         joyIndex = 0;
     89 
     90         for (int i = 0; i < cs.length; i++){
     91             Controller c = cs[i];
     92             if (c.getType() == Controller.Type.KEYBOARD
     93              || c.getType() == Controller.Type.MOUSE)
     94                 continue;
     95 
     96             buttonIdsToIndices[joyIndex] = new HashMap<Button, Integer>();
     97             axisIdsToIndices[joyIndex] = new HashMap<Axis, Integer>();
     98             loadIdentifiers(joyIndex, c);
     99             Joystick joy = new Joystick(inputManager,
    100                                         this,
    101                                         joyIndex, c.getName(),
    102                                         buttonIdsToIndices[joyIndex].size(),
    103                                         axisIdsToIndices[joyIndex].size(),
    104                                         xAxis, yAxis);
    105             joysticks[joyIndex] = joy;
    106             joyIndex++;
    107         }
    108 
    109         return joysticks;
    110     }
    111 
    112     public void initialize() {
    113         inited = true;
    114     }
    115 
    116     public void update() {
    117         ControllerEnvironment ce =
    118             ControllerEnvironment.getDefaultEnvironment();
    119 
    120         Controller[] cs = ce.getControllers();
    121         Event e = new Event();
    122         for (int i = 0; i < cs.length; i++){
    123             Controller c = cs[i];
    124             if (c.getType() == Controller.Type.UNKNOWN
    125              || c.getType() == Controller.Type.KEYBOARD
    126              || c.getType() == Controller.Type.MOUSE)
    127                 continue;
    128 
    129             if (!c.poll())
    130                 continue;
    131 
    132             int joyId = controllerToIndices.get(c);
    133             EventQueue q = c.getEventQueue();
    134             while (q.getNextEvent(e)){
    135                 Identifier id = e.getComponent().getIdentifier();
    136                 if (id == Identifier.Axis.POV){
    137                     float x = 0, y = 0;
    138                     float v = e.getValue();
    139 
    140                     if (v == POV.CENTER){
    141                         x = 0; y = 0;
    142                     }else if (v == POV.DOWN){
    143                         x = 0; y = -1f;
    144                     }else if (v == POV.DOWN_LEFT){
    145                         x = -1f; y = -1f;
    146                     }else if (v == POV.DOWN_RIGHT){
    147                         x = -1f; y = 1f;
    148                     }else if (v == POV.LEFT){
    149                         x = -1f; y = 0;
    150                     }else if (v == POV.RIGHT){
    151                         x = 1f; y = 0;
    152                     }else if (v == POV.UP){
    153                         x = 0; y = 1f;
    154                     }else if (v == POV.UP_LEFT){
    155                         x = -1f; y = 1f;
    156                     }else if (v == POV.UP_RIGHT){
    157                         x = 1f; y = 1f;
    158                     }
    159 
    160                     JoyAxisEvent evt1 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_X, x);
    161                     JoyAxisEvent evt2 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_Y, y);
    162                     listener.onJoyAxisEvent(evt1);
    163                     listener.onJoyAxisEvent(evt2);
    164                 }else if (id instanceof Axis){
    165                     float value = e.getValue();
    166                     Axis axis = (Axis) id;
    167                     JoyAxisEvent evt = new JoyAxisEvent(joyId, axisIdsToIndices[joyId].get(axis), value);
    168                     listener.onJoyAxisEvent(evt);
    169                 }else if (id instanceof Button){
    170                     Button button = (Button) id;
    171                     JoyButtonEvent evt = new JoyButtonEvent(joyId, buttonIdsToIndices[joyId].get(button), e.getValue() == 1f);
    172                     listener.onJoyButtonEvent(evt);
    173                 }
    174             }
    175         }
    176     }
    177 
    178     public void destroy() {
    179         inited = false;
    180     }
    181 
    182     public boolean isInitialized() {
    183         return inited;
    184     }
    185 
    186     public void setInputListener(RawInputListener listener) {
    187         this.listener = listener;
    188     }
    189 
    190     public long getInputTimeNanos() {
    191         return 0;
    192     }
    193 
    194 }
    195