package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.mapping.JoystickMapping; import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMapping; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; import net.minecraft.resources.ResourceLocation; import java.util.Objects; public class JoystickAxisBind implements IBind { public static final String BIND_ID = "joystick_axis"; private final JoystickController joystick; private final int axisIndex; private final AxisDirection direction; public JoystickAxisBind(JoystickController joystick, int axisIndex, AxisDirection direction) { this.joystick = joystick; this.axisIndex = axisIndex; this.direction = direction; } @Override public float state(JoystickState state) { var rawState = state.axes().get(axisIndex); return switch (direction) { case POSITIVE -> Math.max(0, rawState); case NEGATIVE -> -Math.min(0, rawState); }; } @Override public void draw(PoseStack matrices, int x, int centerY) { JoystickMapping mapping = joystick.mapping(); String type = joystick.type().identifier(); String axis = mapping.axes()[axisIndex].identifier(); String direction = mapping.axes()[axisIndex].getDirectionIdentifier(axisIndex, this.direction); var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/axis_" + axis + "_" + direction + ".png"); RenderSystem.setShaderTexture(0, texture); RenderSystem.setShaderColor(1, 1, 1, 1); GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22); if (mapping instanceof UnmappedJoystickMapping) { var text = Integer.toString(axisIndex + 1); var font = Minecraft.getInstance().font; GuiComponent.drawCenteredString(matrices, font, text, x + 11, centerY - font.lineHeight / 2, 0xFFFFFF); } } @Override public DrawSize drawSize() { int width = 22; if (joystick.mapping() instanceof UnmappedJoystickMapping) width = Math.max(width, Minecraft.getInstance().font.width(Integer.toString(axisIndex + 1))); return new DrawSize(width, 22); } @Override public JsonObject toJson() { JsonObject object = new JsonObject(); object.addProperty("type", BIND_ID); object.addProperty("axis", axisIndex); object.addProperty("direction", direction.name()); return object; } @Override public Controller controller() { return joystick; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; JoystickAxisBind that = (JoystickAxisBind) o; return axisIndex == that.axisIndex && direction == that.direction; } @Override public int hashCode() { return Objects.hash(axisIndex, direction); } public static JoystickAxisBind fromJson(JsonObject object, JoystickController joystick) { var axisIndex = object.get("axis").getAsInt(); var direction = AxisDirection.valueOf(object.get("direction").getAsString()); return new JoystickAxisBind(joystick, axisIndex, direction); } public enum AxisDirection { POSITIVE, NEGATIVE } }