blob: 28e35f049ebcbcd60096f5e245edb494f3df1296 [file] [log] [blame]
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;
}
}