forked from Clones/Controlify
170 lines
4.3 KiB
Java
170 lines
4.3 KiB
Java
package dev.isxander.controlify.controller;
|
|
|
|
import com.google.gson.Gson;
|
|
import com.google.gson.JsonElement;
|
|
import dev.isxander.controlify.bindings.ControllerBindings;
|
|
import dev.isxander.controlify.controller.gamepad.GamepadController;
|
|
import dev.isxander.controlify.controller.hid.ControllerHIDService;
|
|
import dev.isxander.controlify.controller.joystick.SingleJoystickController;
|
|
import dev.isxander.controlify.debug.DebugProperties;
|
|
import dev.isxander.controlify.rumble.RumbleCapable;
|
|
import dev.isxander.controlify.rumble.RumbleManager;
|
|
import dev.isxander.controlify.rumble.RumbleSource;
|
|
import org.lwjgl.glfw.GLFW;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
|
|
public interface Controller<S extends ControllerState, C extends ControllerConfig> {
|
|
String uid();
|
|
int joystickId();
|
|
|
|
ControllerBindings<S> bindings();
|
|
|
|
S state();
|
|
S prevState();
|
|
|
|
C config();
|
|
C defaultConfig();
|
|
void resetConfig();
|
|
void setConfig(Gson gson, JsonElement json);
|
|
|
|
ControllerType type();
|
|
|
|
String name();
|
|
|
|
void updateState();
|
|
void clearState();
|
|
|
|
RumbleManager rumbleManager();
|
|
|
|
default boolean canBeUsed() {
|
|
return true;
|
|
}
|
|
|
|
default void close() {
|
|
|
|
}
|
|
|
|
Map<String, Controller<?, ?>> CONTROLLERS = new HashMap<>();
|
|
|
|
static Controller<?, ?> createOrGet(int joystickId, ControllerHIDService.ControllerHIDInfo hidInfo) {
|
|
Optional<String> uid = hidInfo.createControllerUID();
|
|
if (uid.isPresent() && CONTROLLERS.containsKey(uid.get())) {
|
|
return CONTROLLERS.get(uid.get());
|
|
}
|
|
|
|
if (GLFW.glfwJoystickIsGamepad(joystickId) && !DebugProperties.FORCE_JOYSTICK) {
|
|
GamepadController controller = new GamepadController(joystickId, hidInfo);
|
|
CONTROLLERS.put(controller.uid(), controller);
|
|
return controller;
|
|
}
|
|
|
|
SingleJoystickController controller = new SingleJoystickController(joystickId, hidInfo);
|
|
CONTROLLERS.put(controller.uid(), controller);
|
|
return controller;
|
|
}
|
|
|
|
static void remove(Controller<?, ?> controller) {
|
|
CONTROLLERS.remove(controller.uid(), controller);
|
|
controller.close();
|
|
}
|
|
|
|
Controller<?, ?> DUMMY = new Controller<>() {
|
|
private final ControllerBindings<ControllerState> bindings = new ControllerBindings<>(this);
|
|
private final RumbleManager rumbleManager = new RumbleManager(new RumbleCapable() {
|
|
@Override
|
|
public boolean setRumble(float strongMagnitude, float weakMagnitude, RumbleSource source) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean canRumble() {
|
|
return false;
|
|
}
|
|
});
|
|
private final ControllerConfig config = new ControllerConfig() {
|
|
@Override
|
|
public void setDeadzone(int axis, float deadzone) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public float getDeadzone(int axis) {
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
@Override
|
|
public String uid() {
|
|
return "NONE";
|
|
}
|
|
|
|
@Override
|
|
public int joystickId() {
|
|
return -1;
|
|
}
|
|
|
|
@Override
|
|
public ControllerBindings<ControllerState> bindings() {
|
|
return bindings;
|
|
}
|
|
|
|
@Override
|
|
public ControllerConfig config() {
|
|
return config;
|
|
}
|
|
|
|
@Override
|
|
public ControllerConfig defaultConfig() {
|
|
return config;
|
|
}
|
|
|
|
@Override
|
|
public void resetConfig() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void setConfig(Gson gson, JsonElement json) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public ControllerType type() {
|
|
return ControllerType.UNKNOWN;
|
|
}
|
|
|
|
@Override
|
|
public String name() {
|
|
return "DUMMY";
|
|
}
|
|
|
|
@Override
|
|
public ControllerState state() {
|
|
return ControllerState.EMPTY;
|
|
}
|
|
|
|
@Override
|
|
public ControllerState prevState() {
|
|
return ControllerState.EMPTY;
|
|
}
|
|
|
|
@Override
|
|
public void updateState() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void clearState() {
|
|
|
|
}
|
|
|
|
@Override
|
|
public RumbleManager rumbleManager() {
|
|
return rumbleManager;
|
|
}
|
|
};
|
|
}
|