159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.input.lwjgl;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.InputManager;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.JoyInput;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.Joystick;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.RawInputListener;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.event.JoyAxisEvent;
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.input.event.JoyButtonEvent;
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.util.IntMap;
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap;
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier;
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier.Axis;
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.Identifier.Button;
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.Component.POV;
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport net.java.games.input.*;
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class JInputJoyInput implements JoyInput {
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private boolean inited = false;
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private Joystick[] joysticks;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private RawInputListener listener;
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private HashMap<Button, Integer>[] buttonIdsToIndices;
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private HashMap<Axis, Integer>[] axisIdsToIndices;
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private HashMap<Controller, Integer> controllerToIndices;
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private IntMap<Controller> indicesToController;
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private int xAxis, yAxis;
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private void loadIdentifiers(int controllerIdx, Controller c){
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Component[] ces = c.getComponents();
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int numButtons = 0;
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int numAxes = 0;
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        xAxis = -1;
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        yAxis = -1;
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Component comp : ces){
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Identifier id = comp.getIdentifier();
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (id instanceof Button){
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                buttonIdsToIndices[controllerIdx].put((Button)id, numButtons);
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                numButtons ++;
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }else if (id instanceof Axis){
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                Axis axis = (Axis) id;
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (axis == Axis.X){
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    xAxis = numAxes;
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }else if (axis == Axis.Y){
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    yAxis = numAxes;
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                axisIdsToIndices[controllerIdx].put((Axis)id, numAxes);
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                numAxes ++;
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setJoyRumble(int joyId, float amount){
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Controller c = indicesToController.get(joyId);
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (c == null)
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException();
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Rumbler r : c.getRumblers()){
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            r.rumble(amount);
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Joystick[] loadJoysticks(InputManager inputManager){
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ControllerEnvironment ce =
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ControllerEnvironment.getDefaultEnvironment();
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int joyIndex = 0;
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        controllerToIndices = new HashMap<Controller, Integer>();
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        indicesToController = new IntMap<Controller>();
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Controller[] cs = ce.getControllers();
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int i = 0; i < cs.length; i++){
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Controller c = cs[i];
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (c.getType() == Controller.Type.KEYBOARD
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta             || c.getType() == Controller.Type.MOUSE)
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                continue;
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            controllerToIndices.put(c, joyIndex);
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            indicesToController.put(joyIndex, c);
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            joyIndex ++;
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        buttonIdsToIndices = new HashMap[joyIndex];
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        axisIdsToIndices = new HashMap[joyIndex];
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        joysticks = new Joystick[joyIndex];
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        joyIndex = 0;
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int i = 0; i < cs.length; i++){
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Controller c = cs[i];
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (c.getType() == Controller.Type.KEYBOARD
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta             || c.getType() == Controller.Type.MOUSE)
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                continue;
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            buttonIdsToIndices[joyIndex] = new HashMap<Button, Integer>();
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            axisIdsToIndices[joyIndex] = new HashMap<Axis, Integer>();
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            loadIdentifiers(joyIndex, c);
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Joystick joy = new Joystick(inputManager,
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                        this,
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                        joyIndex, c.getName(),
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                        buttonIdsToIndices[joyIndex].size(),
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                        axisIdsToIndices[joyIndex].size(),
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                                        xAxis, yAxis);
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            joysticks[joyIndex] = joy;
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            joyIndex++;
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return joysticks;
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void initialize() {
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inited = true;
11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void update() {
11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        ControllerEnvironment ce =
11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            ControllerEnvironment.getDefaultEnvironment();
11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Controller[] cs = ce.getControllers();
12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Event e = new Event();
12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (int i = 0; i < cs.length; i++){
12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            Controller c = cs[i];
12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (c.getType() == Controller.Type.UNKNOWN
12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta             || c.getType() == Controller.Type.KEYBOARD
12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta             || c.getType() == Controller.Type.MOUSE)
12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                continue;
12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (!c.poll())
13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                continue;
13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            int joyId = controllerToIndices.get(c);
13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            EventQueue q = c.getEventQueue();
13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            while (q.getNextEvent(e)){
13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                Identifier id = e.getComponent().getIdentifier();
13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                if (id == Identifier.Axis.POV){
13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    float x = 0, y = 0;
13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    float v = e.getValue();
13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    if (v == POV.CENTER){
14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = 0; y = 0;
14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.DOWN){
14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = 0; y = -1f;
14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.DOWN_LEFT){
14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = -1f; y = -1f;
14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.DOWN_RIGHT){
14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = -1f; y = 1f;
14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.LEFT){
14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = -1f; y = 0;
15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.RIGHT){
15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = 1f; y = 0;
15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.UP){
15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = 0; y = 1f;
15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.UP_LEFT){
15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = -1f; y = 1f;
15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }else if (v == POV.UP_RIGHT){
15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        x = 1f; y = 1f;
15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    }
15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    JoyAxisEvent evt1 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_X, x);
16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    JoyAxisEvent evt2 = new JoyAxisEvent(joyId, JoyInput.AXIS_POV_Y, y);
16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    listener.onJoyAxisEvent(evt1);
16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    listener.onJoyAxisEvent(evt2);
16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }else if (id instanceof Axis){
16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    float value = e.getValue();
16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    Axis axis = (Axis) id;
16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    JoyAxisEvent evt = new JoyAxisEvent(joyId, axisIdsToIndices[joyId].get(axis), value);
16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    listener.onJoyAxisEvent(evt);
16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }else if (id instanceof Button){
17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    Button button = (Button) id;
17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    JoyButtonEvent evt = new JoyButtonEvent(joyId, buttonIdsToIndices[joyId].get(button), e.getValue() == 1f);
17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                    listener.onJoyButtonEvent(evt);
17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                }
17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void destroy() {
17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        inited = false;
18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public boolean isInitialized() {
18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return inited;
18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setInputListener(RawInputListener listener) {
18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.listener = listener;
18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public long getInputTimeNanos() {
19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return 0;
19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
195