1
0
forked from Clones/Controlify
Files
Controlify/src/main/java/dev/isxander/controlify/controller/Controller.java
2023-04-05 16:36:41 +01:00

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;
}
};
}