1 package com.badlogic.gdx.controllers.lwjgl3; 2 3 import java.nio.ByteBuffer; 4 import java.nio.FloatBuffer; 5 6 import org.lwjgl.glfw.GLFW; 7 8 import com.badlogic.gdx.controllers.Controller; 9 import com.badlogic.gdx.controllers.ControllerListener; 10 import com.badlogic.gdx.controllers.PovDirection; 11 import com.badlogic.gdx.math.Vector3; 12 import com.badlogic.gdx.utils.Array; 13 14 public class Lwjgl3Controller implements Controller { 15 final Lwjgl3ControllerManager manager; 16 final Array<ControllerListener> listeners = new Array<ControllerListener>(); 17 final int index; 18 final float[] axisState; 19 final boolean[] buttonState; 20 final Vector3 zero = new Vector3(0, 0, 0); 21 final String name; 22 23 public Lwjgl3Controller(Lwjgl3ControllerManager manager, int index) { 24 this.manager = manager; 25 this.index = index; 26 this.axisState = new float[GLFW.glfwGetJoystickAxes(index).limit()]; 27 this.buttonState = new boolean[GLFW.glfwGetJoystickButtons(index).limit()]; 28 this.name = GLFW.glfwGetJoystickName(index); 29 } 30 31 void pollState() { 32 if(GLFW.glfwJoystickPresent(index) == GLFW.GLFW_FALSE) { 33 manager.disconnected(this); 34 return; 35 } 36 37 FloatBuffer axes = GLFW.glfwGetJoystickAxes(index); 38 if(axes == null) { 39 manager.disconnected(this); 40 return; 41 } 42 ByteBuffer buttons = GLFW.glfwGetJoystickButtons(index); 43 if(buttons == null) { 44 manager.disconnected(this); 45 return; 46 } 47 48 for(int i = 0; i < axes.limit(); i++) { 49 if(axisState[i] != axes.get(i)) { 50 for(ControllerListener listener: listeners) { 51 listener.axisMoved(this, i, axes.get(i)); 52 } 53 manager.axisChanged(this, i, axes.get(i)); 54 } 55 axisState[i] = axes.get(i); 56 } 57 58 for(int i = 0; i < buttons.limit(); i++) { 59 if(buttonState[i] != (buttons.get(i) == GLFW.GLFW_PRESS)) { 60 for(ControllerListener listener: listeners) { 61 if(buttons.get(i) == GLFW.GLFW_PRESS) { 62 listener.buttonDown(this, i); 63 } else { 64 listener.buttonUp(this, i); 65 } 66 } 67 manager.buttonChanged(this, i, buttons.get(i) == GLFW.GLFW_PRESS); 68 } 69 buttonState[i] = buttons.get(i) == GLFW.GLFW_PRESS; 70 } 71 } 72 73 @Override 74 public void addListener (ControllerListener listener) { 75 listeners.add(listener); 76 } 77 78 @Override 79 public void removeListener (ControllerListener listener) { 80 listeners.removeValue(listener, true); 81 } 82 83 @Override 84 public boolean getButton (int buttonCode) { 85 if(buttonCode < 0 || buttonCode >= buttonState.length) { 86 return false; 87 } 88 return buttonState[buttonCode]; 89 } 90 91 @Override 92 public float getAxis (int axisCode) { 93 if(axisCode < 0 || axisCode >= axisState.length) { 94 return 0; 95 } 96 return axisState[axisCode]; 97 } 98 99 @Override 100 public PovDirection getPov (int povCode) { 101 return PovDirection.center; 102 } 103 104 @Override 105 public boolean getSliderX (int sliderCode) { 106 return false; 107 } 108 109 @Override 110 public boolean getSliderY (int sliderCode) { 111 return false; 112 } 113 114 @Override 115 public Vector3 getAccelerometer (int accelerometerCode) { 116 return zero; 117 } 118 119 @Override 120 public void setAccelerometerSensitivity (float sensitivity) { 121 } 122 123 @Override 124 public String getName () { 125 return name; 126 } 127 } 128