1package com.jme3.input.lwjgl;
2
3import com.jme3.input.InputManager;
4import com.jme3.input.JoyInput;
5import com.jme3.input.Joystick;
6import com.jme3.input.RawInputListener;
7import com.jme3.input.event.JoyAxisEvent;
8import com.jme3.input.event.JoyButtonEvent;
9import com.jme3.util.IntMap;
10import java.util.HashMap;
11import net.java.games.input.Component.Identifier;
12import net.java.games.input.Component.Identifier.Axis;
13import net.java.games.input.Component.Identifier.Button;
14import net.java.games.input.Component.POV;
15import net.java.games.input.*;
16
17public 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