package com.badlogic.gdx.controllers.lwjgl3;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import org.lwjgl.glfw.GLFW;
import com.badlogic.gdx.controllers.Controller;
import com.badlogic.gdx.controllers.ControllerListener;
import com.badlogic.gdx.controllers.PovDirection;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
public class Lwjgl3Controller implements Controller {
final Lwjgl3ControllerManager manager;
final Array<ControllerListener> listeners = new Array<ControllerListener>();
final int index;
final float[] axisState;
final boolean[] buttonState;
final Vector3 zero = new Vector3(0, 0, 0);
final String name;
public Lwjgl3Controller(Lwjgl3ControllerManager manager, int index) {
this.manager = manager;
this.index = index;
this.axisState = new float[GLFW.glfwGetJoystickAxes(index).limit()];
this.buttonState = new boolean[GLFW.glfwGetJoystickButtons(index).limit()];
this.name = GLFW.glfwGetJoystickName(index);
}
void pollState() {
if(!GLFW.glfwJoystickPresent(index)) {
manager.disconnected(this);
return;
}
FloatBuffer axes = GLFW.glfwGetJoystickAxes(index);
if(axes == null) {
manager.disconnected(this);
return;
}
ByteBuffer buttons = GLFW.glfwGetJoystickButtons(index);
if(buttons == null) {
manager.disconnected(this);
return;
}
for(int i = 0; i < axes.limit(); i++) {
if(axisState[i] != axes.get(i)) {
for(ControllerListener listener: listeners) {
listener.axisMoved(this, i, axes.get(i));
}
manager.axisChanged(this, i, axes.get(i));
}
axisState[i] = axes.get(i);
}
for(int i = 0; i < buttons.limit(); i++) {
if(buttonState[i] != (buttons.get(i) == GLFW.GLFW_PRESS)) {
for(ControllerListener listener: listeners) {
if(buttons.get(i) == GLFW.GLFW_PRESS) {
listener.buttonDown(this, i);
} else {
listener.buttonUp(this, i);
}
}
manager.buttonChanged(this, i, buttons.get(i) == GLFW.GLFW_PRESS);
}
buttonState[i] = buttons.get(i) == GLFW.GLFW_PRESS;
}
}
@Override
public void addListener (ControllerListener listener) {
listeners.add(listener);
}
@Override
public void removeListener (ControllerListener listener) {
listeners.removeValue(listener, true);
}
@Override
public boolean getButton (int buttonCode) {
if(buttonCode < 0 || buttonCode >= buttonState.length) {
return false;
}
return buttonState[buttonCode];
}
@Override
public float getAxis (int axisCode) {
if(axisCode < 0 || axisCode >= axisState.length) {
return 0;
}
return axisState[axisCode];
}
@Override
public PovDirection getPov (int povCode) {
return PovDirection.center;
}
@Override
public boolean getSliderX (int sliderCode) {
return false;
}
@Override
public boolean getSliderY (int sliderCode) {
return false;
}
@Override
public Vector3 getAccelerometer (int accelerometerCode) {
return zero;
}
@Override
public void setAccelerometerSensitivity (float sensitivity) {
}
@Override
public String getName () {
return name;
}
}