Home | History | Annotate | Download | only in lwjgl3
      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