1
0
forked from Clones/Controlify

Update to Minecraft 1.20

This commit is contained in:
isXander
2023-05-16 20:30:56 +01:00
parent d81b1f59cc
commit 0adbccc498
41 changed files with 259 additions and 491 deletions

View File

@ -62,7 +62,7 @@ val minecraftVersion = libs.versions.minecraft.get()
dependencies { dependencies {
minecraft(libs.minecraft) minecraft(libs.minecraft)
mappings(loom.layered { mappings(loom.layered {
mappings("org.quiltmc:quilt-mappings:$minecraftVersion+build.${libs.versions.quilt.mappings.get()}:intermediary-v2") //mappings("org.quiltmc:quilt-mappings:$minecraftVersion+build.${libs.versions.quilt.mappings.get()}:intermediary-v2")
officialMojangMappings() officialMojangMappings()
}) })
modImplementation(libs.fabric.loader) modImplementation(libs.fabric.loader)
@ -107,12 +107,12 @@ dependencies {
// sodium compat // sodium compat
modImplementation(libs.sodium) modImplementation(libs.sodium)
// iris compat // iris compat
modImplementation(libs.iris) // modImplementation(libs.iris)
modRuntimeOnly("org.anarres:jcpp:1.4.14") // modRuntimeOnly("org.anarres:jcpp:1.4.14")
modRuntimeOnly("io.github.douira:glsl-transformer:2.0.0-pre9") // modRuntimeOnly("io.github.douira:glsl-transformer:2.0.0-pre9")
// immediately-fast compat // immediately-fast compat
modImplementation(libs.immediately.fast) // modImplementation(libs.immediately.fast)
modRuntimeOnly("net.lenni0451:Reflect:1.1.0") // modRuntimeOnly("net.lenni0451:Reflect:1.1.0")
// testmod // testmod
"testmodImplementation"(sourceSets.main.get().output) "testmodImplementation"(sourceSets.main.get().output)

View File

@ -8,16 +8,16 @@ machete = "2.+"
grgit = "5.0.+" grgit = "5.0.+"
blossom = "1.3.+" blossom = "1.3.+"
minecraft = "1.19.4" minecraft = "1.20-pre2"
quilt_mappings = "10" #quilt_mappings = "10"
fabric_loader = "0.14.19" fabric_loader = "0.14.19"
fabric_api = "0.81.0+1.19.4" fabric_api = "0.81.2+1.20"
mixin_extras = "0.2.0-beta.7" mixin_extras = "0.2.0-beta.7"
yet_another_config_lib = "2.5.1+1.19.4" yet_another_config_lib = "2.5.1+1.19.4+1.20.x.dev-SNAPSHOT+1.20.x.dev-SNAPSHOT"
mod_menu = "6.2.1" mod_menu = "7.0.0-beta.2"
hid4java = "0.7.0" hid4java = "0.7.0"
quilt_json5 = "1.0.3" quilt_json5 = "1.0.3"
sodium = "mc1.19.4-0.4.10" sodium = "f041f7ccba"
iris = "1.6.3+1.19.4" iris = "1.6.3+1.19.4"
immediately_fast = "1.1.12+1.19.4" immediately_fast = "1.1.12+1.19.4"
sdl2_jni = "2.26.5-18" sdl2_jni = "2.26.5-18"
@ -32,7 +32,7 @@ yet_another_config_lib = { module = "dev.isxander.yacl:yet-another-config-lib-fa
mod_menu = { module = "com.terraformersmc:modmenu", version.ref = "mod_menu" } mod_menu = { module = "com.terraformersmc:modmenu", version.ref = "mod_menu" }
hid4java = { module = "org.hid4java:hid4java", version.ref = "hid4java" } hid4java = { module = "org.hid4java:hid4java", version.ref = "hid4java" }
quilt_json5 = { module = "org.quiltmc:quilt-json5", version.ref = "quilt_json5" } quilt_json5 = { module = "org.quiltmc:quilt-json5", version.ref = "quilt_json5" }
sodium = { module = "maven.modrinth:sodium", version.ref = "sodium" } sodium = { module = "com.github.CaffeineMC:sodium-fabric", version.ref = "sodium" }
iris = { module = "maven.modrinth:iris", version.ref = "iris" } iris = { module = "maven.modrinth:iris", version.ref = "iris" }
immediately_fast = { module = "maven.modrinth:immediatelyfast", version.ref = "immediately_fast" } immediately_fast = { module = "maven.modrinth:immediatelyfast", version.ref = "immediately_fast" }
sdl2_jni = { module = "dev.isxander:sdl2-jni", version.ref = "sdl2_jni" } sdl2_jni = { module = "dev.isxander:sdl2-jni", version.ref = "sdl2_jni" }

View File

@ -1,10 +1,10 @@
package dev.isxander.controlify.api.bind; package dev.isxander.controlify.api.bind;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiGraphics;
public interface BindRenderer { public interface BindRenderer {
DrawSize size(); DrawSize size();
void render(PoseStack poseStack, int x, int centerY); void render(GuiGraphics graphics, int x, int centerY);
} }

View File

@ -2,7 +2,6 @@ package dev.isxander.controlify.bindings;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.BindRenderer;
import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.api.bind.ControllerBinding;
@ -18,6 +17,7 @@ import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import dev.isxander.yacl.api.Option; import dev.isxander.yacl.api.Option;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.locale.Language; import net.minecraft.locale.Language;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -302,8 +302,8 @@ public class ControllerBindingImpl<T extends ControllerState> implements Control
private record BindRendererImpl(IBind<?> bind) implements BindRenderer { private record BindRendererImpl(IBind<?> bind) implements BindRenderer {
@Override @Override
public void render(PoseStack poseStack, int x, int centerY) { public void render(GuiGraphics graphics, int x, int centerY) {
bind.draw(poseStack, x, centerY); bind.draw(graphics, x, centerY);
} }
@Override @Override

View File

@ -514,7 +514,7 @@ public class ControllerBindings<T extends ControllerState> {
if (Controlify.instance().currentInputMode() != InputMode.CONTROLLER) if (Controlify.instance().currentInputMode() != InputMode.CONTROLLER)
return; return;
if (Minecraft.getInstance().screen != null && !Minecraft.getInstance().screen.passEvents) if (Minecraft.getInstance().screen != null)
return; return;
for (var binding : registry().values()) { for (var binding : registry().values()) {

View File

@ -1,10 +1,10 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.controller.ControllerState; import dev.isxander.controlify.controller.ControllerState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiGraphics;
public class EmptyBind<T extends ControllerState> implements IBind<T> { public class EmptyBind<T extends ControllerState> implements IBind<T> {
public static final String BIND_ID = "empty"; public static final String BIND_ID = "empty";
@ -20,7 +20,7 @@ public class EmptyBind<T extends ControllerState> implements IBind<T> {
} }
@Override @Override
public void draw(PoseStack matrices, int x, int centerY) { public void draw(GuiGraphics graphics, int x, int centerY) {
} }

View File

@ -1,14 +1,12 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; 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.Controller;
import dev.isxander.controlify.controller.gamepad.BuiltinGamepadTheme; import dev.isxander.controlify.controller.gamepad.BuiltinGamepadTheme;
import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.gamepad.GamepadController;
import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.GamepadState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import java.util.Objects; import java.util.Objects;
@ -31,13 +29,9 @@ public class GamepadBind implements IBind<GamepadState> {
} }
@Override @Override
public void draw(PoseStack matrices, int x, int centerY) { public void draw(GuiGraphics graphics, int x, int centerY) {
ResourceLocation texture = getTexture(gamepad.config().theme); ResourceLocation texture = getTexture(gamepad.config().theme);
graphics.blit(texture, x, centerY - 22 / 2, 0, 0, 22, 22, 22, 22);
RenderSystem.setShaderTexture(0, texture);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
GuiComponent.blit(matrices, x, centerY - 22 / 2, 0, 0, 22, 22, 22, 22);
} }
@Override @Override

View File

@ -1,11 +1,11 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.controller.*; import dev.isxander.controlify.controller.*;
import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.gamepad.GamepadController;
import dev.isxander.controlify.controller.joystick.SingleJoystickController; import dev.isxander.controlify.controller.joystick.SingleJoystickController;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiGraphics;
public interface IBind<S extends ControllerState> { public interface IBind<S extends ControllerState> {
float state(S state); float state(S state);
@ -13,7 +13,7 @@ public interface IBind<S extends ControllerState> {
return state(state) > controller().config().buttonActivationThreshold; return state(state) > controller().config().buttonActivationThreshold;
} }
void draw(PoseStack matrices, int x, int centerY); void draw(GuiGraphics graphics, int x, int centerY);
DrawSize drawSize(); DrawSize drawSize();
JsonObject toJson(); JsonObject toJson();

View File

@ -1,8 +1,6 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; 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.Controller;
import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickController;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
@ -10,7 +8,7 @@ import dev.isxander.controlify.controller.joystick.mapping.JoystickMapping;
import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMapping; import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMapping;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import java.util.Objects; import java.util.Objects;
@ -38,7 +36,7 @@ public class JoystickAxisBind implements IBind<JoystickState> {
} }
@Override @Override
public void draw(PoseStack matrices, int x, int centerY) { public void draw(GuiGraphics graphics, int x, int centerY) {
JoystickMapping mapping = joystick.mapping(); JoystickMapping mapping = joystick.mapping();
String type = joystick.type().themeId(); String type = joystick.type().themeId();
@ -46,14 +44,12 @@ public class JoystickAxisBind implements IBind<JoystickState> {
String direction = mapping.axes()[axisIndex].getDirectionIdentifier(axisIndex, this.direction); String direction = mapping.axes()[axisIndex].getDirectionIdentifier(axisIndex, this.direction);
var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/axis_" + axis + "_" + direction + ".png"); var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/axis_" + axis + "_" + direction + ".png");
RenderSystem.setShaderTexture(0, texture); graphics.blit(texture, x, centerY - 11, 0, 0, 22, 22, 22, 22);
RenderSystem.setShaderColor(1, 1, 1, 1);
GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22);
if (mapping instanceof UnmappedJoystickMapping) { if (mapping instanceof UnmappedJoystickMapping) {
var text = Integer.toString(axisIndex + 1); var text = Integer.toString(axisIndex + 1);
var font = Minecraft.getInstance().font; var font = Minecraft.getInstance().font;
GuiComponent.drawCenteredString(matrices, font, text, x + 11, centerY - font.lineHeight / 2, 0xFFFFFF); graphics.drawCenteredString(font, text, x + 11, centerY - font.lineHeight / 2, 0xFFFFFF);
} }
} }

View File

@ -1,13 +1,11 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; 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.Controller;
import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickController;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import java.util.Objects; import java.util.Objects;
@ -29,14 +27,12 @@ public class JoystickButtonBind implements IBind<JoystickState> {
} }
@Override @Override
public void draw(PoseStack matrices, int x, int centerY) { public void draw(GuiGraphics graphics, int x, int centerY) {
String type = joystick.type().themeId(); String type = joystick.type().themeId();
String button = joystick.mapping().buttons()[buttonIndex].identifier(); String button = joystick.mapping().buttons()[buttonIndex].identifier();
var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/button_" + button + ".png"); var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/button_" + button + ".png");
RenderSystem.setShaderTexture(0, texture); graphics.blit(texture, x, centerY - 11, 0, 0, 22, 22, 22, 22);
RenderSystem.setShaderColor(1, 1, 1, 1);
GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22);
} }
@Override @Override

View File

@ -1,13 +1,11 @@
package dev.isxander.controlify.bindings; package dev.isxander.controlify.bindings;
import com.google.gson.JsonObject; 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.Controller;
import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickController;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import java.util.Objects; import java.util.Objects;
@ -31,7 +29,7 @@ public class JoystickHatBind implements IBind<JoystickState> {
} }
@Override @Override
public void draw(PoseStack matrices, int x, int centerY) { public void draw(GuiGraphics graphics, int x, int centerY) {
String type = joystick.type().themeId(); String type = joystick.type().themeId();
String hat = joystick.mapping().hats()[hatIndex].identifier(); String hat = joystick.mapping().hats()[hatIndex].identifier();
String direction = "centered"; String direction = "centered";
@ -45,10 +43,7 @@ public class JoystickHatBind implements IBind<JoystickState> {
direction = "right"; direction = "right";
var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/hat" + hat + "_" + direction + ".png"); var texture = new ResourceLocation("controlify", "textures/gui/joystick/" + type + "/hat" + hat + "_" + direction + ".png");
graphics.blit(texture, x, centerY - 11, 0, 0, 22, 22, 22, 22);
RenderSystem.setShaderTexture(0, texture);
RenderSystem.setShaderColor(1, 1, 1, 1);
GuiComponent.blit(matrices, x, centerY - 11, 0, 0, 22, 22, 22, 22);
} }
@Override @Override

View File

@ -1,13 +1,13 @@
package dev.isxander.controlify.compatibility.immediatelyfast; package dev.isxander.controlify.compatibility.immediatelyfast;
import net.raphimc.immediatelyfast.feature.batching.BatchingBuffers; //import net.raphimc.immediatelyfast.feature.batching.BatchingBuffers;
public class ImmediatelyFastCompat { public class ImmediatelyFastCompat {
public static void beginHudBatching() { public static void beginHudBatching() {
BatchingBuffers.beginHudBatching(); // BatchingBuffers.beginHudBatching();
} }
public static void endHudBatching() { public static void endHudBatching() {
BatchingBuffers.endHudBatching(); // BatchingBuffers.endHudBatching();
} }
} }

View File

@ -12,8 +12,8 @@ import dev.isxander.yacl.api.Option;
import dev.isxander.yacl.api.utils.Dimension; import dev.isxander.yacl.api.utils.Dimension;
import dev.isxander.yacl.gui.YACLScreen; import dev.isxander.yacl.gui.YACLScreen;
import dev.isxander.yacl.gui.controllers.ControllerWidget; import dev.isxander.yacl.gui.controllers.ControllerWidget;
import dev.isxander.yacl.gui.utils.GuiUtils;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@ -60,12 +60,12 @@ public abstract class AbstractBindController<T extends ControllerState> implemen
} }
@Override @Override
protected void drawValueText(PoseStack matrices, int mouseX, int mouseY, float delta) { protected void drawValueText(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
if (awaitingControllerInput) { if (awaitingControllerInput) {
textRenderer.drawShadow(matrices, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), getDimension().centerY() - textRenderer.lineHeight / 2f, 0xFFFFFF); graphics.drawString(textRenderer, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), (int)(getDimension().centerY() - textRenderer.lineHeight / 2f), 0xFFFFFF, true);
} else { } else {
var bind = control.option().pendingValue(); var bind = control.option().pendingValue();
bind.draw(matrices, getDimension().xLimit() - bind.drawSize().width(), getDimension().centerY()); bind.draw(graphics, getDimension().xLimit() - bind.drawSize().width(), getDimension().centerY());
} }
} }

View File

@ -6,7 +6,7 @@ import dev.isxander.controlify.bindings.JoystickAxisBind;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -19,14 +19,15 @@ public abstract class GenericRenderer implements JoystickRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size) {
if (annotation != null) { if (annotation != null) {
minecraft.font.draw( graphics.drawString(
poseStack, minecraft.font,
annotation, annotation,
x + size + 2 - minecraft.font.width(annotation), x + size + 2 - minecraft.font.width(annotation),
centerY + size/2f - minecraft.font.lineHeight * 0.75f, (int)(centerY + size/2f - minecraft.font.lineHeight * 0.75f),
-1 -1,
false
); );
} }
@ -41,34 +42,31 @@ public abstract class GenericRenderer implements JoystickRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size) {
RenderSystem.setShaderTexture(0, BUTTON_TEXTURE); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit(poseStack, 0, 0, 0, 0, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE); graphics.blit(BUTTON_TEXTURE, 0, 0, 0, 0, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE);
poseStack.popPose(); graphics.pose().popPose();
super.render(poseStack, x, centerY, size); super.render(graphics, x, centerY, size);
return new DrawSize(size, size); return new DrawSize(size, size);
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, boolean down) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, boolean down) {
return this.render(poseStack, x, centerY, size); return this.render(graphics, x, centerY, size);
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, boolean down) { public DrawSize render(GuiGraphics graphics, int x, int centerY, boolean down) {
return this.render(poseStack, x, centerY, DEFAULT_SIZE); return this.render(graphics, x, centerY, DEFAULT_SIZE);
} }
} }
@ -80,28 +78,25 @@ public abstract class GenericRenderer implements JoystickRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction) {
RenderSystem.setShaderTexture(0, AXIS_TEXTURE); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit( graphics.blit(
poseStack, AXIS_TEXTURE,
0, 0, 0, 0,
direction.ordinal() * DEFAULT_SIZE, 0, direction.ordinal() * DEFAULT_SIZE, 0,
DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE,
DEFAULT_SIZE * JoystickAxisBind.AxisDirection.values().length, DEFAULT_SIZE DEFAULT_SIZE * JoystickAxisBind.AxisDirection.values().length, DEFAULT_SIZE
); );
poseStack.popPose(); graphics.pose().popPose();
super.render(poseStack, x, centerY, size); super.render(graphics, x, centerY, size);
return new DrawSize(size, size); return new DrawSize(size, size);
} }
@ -115,28 +110,25 @@ public abstract class GenericRenderer implements JoystickRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickState.HatState hatState) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickState.HatState hatState) {
RenderSystem.setShaderTexture(0, HAT_TEXTURE); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit( graphics.blit(
poseStack, HAT_TEXTURE,
0, 0, 0, 0,
hatState.ordinal() * DEFAULT_SIZE, 0, hatState.ordinal() * DEFAULT_SIZE, 0,
DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE,
DEFAULT_SIZE * JoystickState.HatState.values().length, DEFAULT_SIZE DEFAULT_SIZE * JoystickState.HatState.values().length, DEFAULT_SIZE
); );
poseStack.popPose(); graphics.pose().popPose();
super.render(poseStack, x, centerY, size); super.render(graphics, x, centerY, size);
return new DrawSize(size, size); return new DrawSize(size, size);
} }

View File

@ -4,45 +4,46 @@ import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.bindings.JoystickAxisBind; import dev.isxander.controlify.bindings.JoystickAxisBind;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiGraphics;
public interface JoystickRenderer { public interface JoystickRenderer {
int DEFAULT_SIZE = 22; int DEFAULT_SIZE = 22;
DrawSize render(PoseStack poseStack, int x, int centerY, int size); DrawSize render(GuiGraphics graphics, int x, int centerY, int size);
interface Button extends JoystickRenderer { interface Button extends JoystickRenderer {
DrawSize render(PoseStack poseStack, int x, int centerY, int size, boolean down); DrawSize render(GuiGraphics graphics, int x, int centerY, int size, boolean down);
default DrawSize render(PoseStack poseStack, int x, int centerY, boolean down) { default DrawSize render(GuiGraphics graphics, int x, int centerY, boolean down) {
return render(poseStack, x, centerY, DEFAULT_SIZE, down); return render(graphics, x, centerY, DEFAULT_SIZE, down);
} }
default DrawSize render(PoseStack poseStack, int x, int centerY, int size) { default DrawSize render(GuiGraphics graphics, int x, int centerY, int size) {
return render(poseStack, x, centerY, size, false); return render(graphics, x, centerY, size, false);
} }
} }
interface Axis extends JoystickRenderer { interface Axis extends JoystickRenderer {
DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction); DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction);
default DrawSize render(PoseStack poseStack, int x, int centerY, JoystickAxisBind.AxisDirection direction) { default DrawSize render(GuiGraphics graphics, int x, int centerY, JoystickAxisBind.AxisDirection direction) {
return render(poseStack, x, centerY, DEFAULT_SIZE, direction); return render(graphics, x, centerY, DEFAULT_SIZE, direction);
} }
default DrawSize render(PoseStack poseStack, int x, int centerY, int size) { default DrawSize render(GuiGraphics graphics, int x, int centerY, int size) {
return render(poseStack, x, centerY, size, JoystickAxisBind.AxisDirection.POSITIVE); return render(graphics, x, centerY, size, JoystickAxisBind.AxisDirection.POSITIVE);
} }
} }
interface Hat extends JoystickRenderer { interface Hat extends JoystickRenderer {
DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickState.HatState state); DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickState.HatState state);
default DrawSize render(PoseStack poseStack, int x, int centerY, JoystickState.HatState state) { default DrawSize render(GuiGraphics graphics, int x, int centerY, JoystickState.HatState state) {
return render(poseStack, x, centerY, DEFAULT_SIZE, state); return render(graphics, x, centerY, DEFAULT_SIZE, state);
} }
default DrawSize render(PoseStack poseStack, int x, int centerY, int size) { default DrawSize render(GuiGraphics graphics, int x, int centerY, int size) {
return render(poseStack, x, centerY, size, JoystickState.HatState.CENTERED); return render(graphics, x, centerY, size, JoystickState.HatState.CENTERED);
} }
} }
} }

View File

@ -1,13 +1,10 @@
package dev.isxander.controlify.controller.joystick.render; package dev.isxander.controlify.controller.joystick.render;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.bindings.JoystickAxisBind; import dev.isxander.controlify.bindings.JoystickAxisBind;
import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
public abstract class ThemedRenderer { public abstract class ThemedRenderer {
@ -27,20 +24,17 @@ public abstract class ThemedRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, boolean down) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, boolean down) {
RenderSystem.setShaderTexture(0, texture); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit(poseStack, 0, 0, 0, 0, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE); graphics.blit(texture, 0, 0, 0, 0, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE);
poseStack.popPose(); graphics.pose().popPose();
return new DrawSize(size, size); return new DrawSize(size, size);
} }
@ -55,26 +49,23 @@ public abstract class ThemedRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickAxisBind.AxisDirection direction) {
RenderSystem.setShaderTexture(0, texture); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit( graphics.blit(
poseStack, texture,
0, 0, 0, 0,
direction.ordinal() * DEFAULT_SIZE, 0, direction.ordinal() * DEFAULT_SIZE, 0,
DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE,
DEFAULT_SIZE * JoystickAxisBind.AxisDirection.values().length, DEFAULT_SIZE DEFAULT_SIZE * JoystickAxisBind.AxisDirection.values().length, DEFAULT_SIZE
); );
poseStack.popPose(); graphics.pose().popPose();
return new DrawSize(size, size); return new DrawSize(size, size);
} }
@ -89,26 +80,23 @@ public abstract class ThemedRenderer {
} }
@Override @Override
public DrawSize render(PoseStack poseStack, int x, int centerY, int size, JoystickState.HatState hatState) { public DrawSize render(GuiGraphics graphics, int x, int centerY, int size, JoystickState.HatState hatState) {
RenderSystem.setShaderTexture(0, texture); graphics.pose().pushPose();
RenderSystem.setShaderColor(1, 1, 1, 1); graphics.pose().translate(x, centerY, 0);
poseStack.pushPose();
poseStack.translate(x, centerY, 0);
float scale = (float) size / 22f; float scale = (float) size / 22f;
poseStack.scale(scale, scale, 1); graphics.pose().scale(scale, scale, 1);
poseStack.translate(0f, -DEFAULT_SIZE / scale / 2f, 0); graphics.pose().translate(0f, -DEFAULT_SIZE / scale / 2f, 0);
GuiComponent.blit( graphics.blit(
poseStack, texture,
0, 0, 0, 0,
hatState.ordinal() * DEFAULT_SIZE, 0, hatState.ordinal() * DEFAULT_SIZE, 0,
DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE, DEFAULT_SIZE,
DEFAULT_SIZE * JoystickState.HatState.values().length, DEFAULT_SIZE DEFAULT_SIZE * JoystickState.HatState.values().length, DEFAULT_SIZE
); );
poseStack.popPose(); graphics.pose().popPose();
return new DrawSize(size, size); return new DrawSize(size, size);
} }

View File

@ -1,178 +0,0 @@
package dev.isxander.controlify.gui.guide;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.InputMode;
import dev.isxander.controlify.api.ControlifyApi;
import dev.isxander.controlify.api.event.ControlifyEvents;
import dev.isxander.controlify.bindings.ControllerBindings;
import dev.isxander.controlify.compatibility.ControlifyCompat;
import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.gui.layout.AnchorPoint;
import dev.isxander.controlify.gui.layout.ColumnLayoutComponent;
import dev.isxander.controlify.gui.layout.PositionedComponent;
import dev.isxander.controlify.gui.layout.RowLayoutComponent;
import dev.isxander.controlify.mixins.feature.guide.screen.AbstractContainerScreenAccessor;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.network.chat.Component;
import java.util.Optional;
public final class ContainerButtonGuide {
private static PositionedComponent<ColumnLayoutComponent<RowLayoutComponent<GuideActionRenderer<ContainerGuideCtx>>>> leftLayout;
private static PositionedComponent<ColumnLayoutComponent<RowLayoutComponent<GuideActionRenderer<ContainerGuideCtx>>>> rightLayout;
public static void setup() {
ScreenEvents.BEFORE_INIT.register((minecraft, screen, sw, sh) -> {
removeLayout();
if (isScreenCompatible(screen)) {
setupLayout();
ScreenEvents.afterRender(screen).register((s, stack, mouseX, mouseY, tickDelta) -> {
// Fabric API provides the wrong matrixstack (which is translated -2000), behind
// the ortho near plane, so we need to translate it back to the front.
// https://github.com/FabricMC/fabric/pull/3061
stack.pushPose();
stack.translate(0, 0, 2000);
renderGuide((AbstractContainerScreen<?>) s, stack, tickDelta, mouseX, mouseY, sw, sh);
stack.popPose();
});
}
});
ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> {
if (isScreenCompatible(Minecraft.getInstance().screen)) {
if (mode == InputMode.CONTROLLER) {
setupLayout();
} else {
removeLayout();
}
}
});
}
private static void setupLayout() {
ControllerBindings<?> bindings = ControlifyApi.get().getCurrentController()
.map(Controller::bindings)
.orElseThrow();
leftLayout = new PositionedComponent<>(
ColumnLayoutComponent.<RowLayoutComponent<GuideActionRenderer<ContainerGuideCtx>>>builder()
.spacing(2)
.colPadding(2, 2)
.elementPosition(ColumnLayoutComponent.ElementPosition.LEFT)
.element(RowLayoutComponent.<GuideActionRenderer<ContainerGuideCtx>>builder()
.spacing(5)
.rowPadding(0)
.elementPosition(RowLayoutComponent.ElementPosition.MIDDLE)
.element(new GuideActionRenderer<>(
new GuideAction<>(bindings.VMOUSE_LCLICK, ctx -> {
if (!ctx.holdingItem().isEmpty())
if (ctx.hoveredSlot() != null && ctx.hoveredSlot().hasItem())
if (ctx.hoveredSlot().mayPlace(ctx.holdingItem()))
if (ctx.holdingItem().getCount() > 1)
return Optional.of(Component.translatable("controlify.guide.container.place_all"));
else
return Optional.of(Component.translatable("controlify.guide.container.place_one"));
else
return Optional.of(Component.translatable("controlify.guide.container.swap"));
else if (ctx.cursorOutsideContainer())
return Optional.of(Component.translatable("controlify.guide.container.drop"));
if (ctx.hoveredSlot() != null && ctx.hoveredSlot().hasItem())
return Optional.of(Component.translatable("controlify.guide.container.take"));
return Optional.empty();
}),
false, false
))
.element(new GuideActionRenderer<>(
new GuideAction<>(bindings.GUI_BACK, ctx -> {
return Optional.of(Component.translatable("controlify.guide.container.exit"));
}),
false, false
))
.build())
.build(),
AnchorPoint.BOTTOM_LEFT,
0, 0,
AnchorPoint.BOTTOM_LEFT
);
rightLayout = new PositionedComponent<>(
ColumnLayoutComponent.<RowLayoutComponent<GuideActionRenderer<ContainerGuideCtx>>>builder()
.spacing(2)
.elementPosition(ColumnLayoutComponent.ElementPosition.RIGHT)
.colPadding(2, 2)
.element(RowLayoutComponent.<GuideActionRenderer<ContainerGuideCtx>>builder()
.spacing(5)
.rowPadding(0)
.elementPosition(RowLayoutComponent.ElementPosition.MIDDLE)
.element(new GuideActionRenderer<>(
new GuideAction<>(bindings.VMOUSE_RCLICK, ctx -> {
if (ctx.hoveredSlot() != null && ctx.hoveredSlot().getItem().getCount() > 1 && ctx.holdingItem().isEmpty())
return Optional.of(Component.translatable("controlify.guide.container.take_half"));
if (ctx.hoveredSlot() != null && !ctx.holdingItem().isEmpty() && ctx.hoveredSlot().mayPlace(ctx.holdingItem()))
return Optional.of(Component.translatable("controlify.guide.container.take_one"));
return Optional.empty();
}),
true, false
))
.element(new GuideActionRenderer<>(
new GuideAction<>(bindings.VMOUSE_SHIFT_CLICK, ctx -> {
return Optional.of(Component.translatable("controlify.guide.container.quick_move"));
}),
true, false
))
.build())
.build(),
AnchorPoint.BOTTOM_RIGHT,
0, 0,
AnchorPoint.BOTTOM_RIGHT
);
}
private static void removeLayout() {
leftLayout = null;
rightLayout = null;
}
private static void renderGuide(AbstractContainerScreen<?> screen, PoseStack stack, float tickDelta, int mouseX, int mouseY, int screenWidth, int screenHeight) {
if (leftLayout == null || rightLayout == null)
return;
if (!ControlifyApi.get().getCurrentController().map(controller -> controller.config().showScreenGuide).orElse(false)) {
return;
}
var accessor = (AbstractContainerScreenAccessor) screen;
ContainerGuideCtx ctx = new ContainerGuideCtx(accessor.getHoveredSlot(), screen.getMenu().getCarried(), accessor.invokeHasClickedOutside(mouseX, mouseY, accessor.getLeftPos(), accessor.getTopPos(), 0));
for (var row : leftLayout.getComponent().getChildComponents()) {
for (var element : row.getChildComponents()) {
element.updateName(ctx);
}
}
for (var row : rightLayout.getComponent().getChildComponents()) {
for (var element : row.getChildComponents()) {
element.updateName(ctx);
}
}
leftLayout.updatePosition();
rightLayout.updatePosition();
ControlifyCompat.ifBeginHudBatching();
leftLayout.renderComponent(stack, tickDelta);
rightLayout.renderComponent(stack, tickDelta);
ControlifyCompat.ifEndHudBatching();
}
private static boolean isScreenCompatible(Screen screen) {
return screen instanceof AbstractContainerScreen<?>;
}
}

View File

@ -1,12 +1,11 @@
package dev.isxander.controlify.gui.guide; package dev.isxander.controlify.gui.guide;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.BindRenderer;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import dev.isxander.controlify.gui.layout.RenderComponent; import dev.isxander.controlify.gui.layout.RenderComponent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import org.joml.Vector2i; import org.joml.Vector2i;
import org.joml.Vector2ic; import org.joml.Vector2ic;
@ -27,7 +26,7 @@ public class GuideActionRenderer<T> implements RenderComponent {
} }
@Override @Override
public void render(PoseStack stack, int x, int y, float deltaTime) { public void render(GuiGraphics graphics, int x, int y, float deltaTime) {
if (!isVisible()) if (!isVisible())
return; return;
@ -37,14 +36,14 @@ public class GuideActionRenderer<T> implements RenderComponent {
DrawSize drawSize = renderer.size(); DrawSize drawSize = renderer.size();
int textWidth = font.width(name.get()); int textWidth = font.width(name.get());
renderer.render(stack, x + (!rtl ? 0 : textWidth + 2), y + drawSize.height() / 2); renderer.render(graphics, x + (!rtl ? 0 : textWidth + 2), y + drawSize.height() / 2);
int textX = x + (rtl ? 0 : drawSize.width() + 2); int textX = x + (rtl ? 0 : drawSize.width() + 2);
int textY = y + drawSize.height() / 2 - font.lineHeight / 2; int textY = y + drawSize.height() / 2 - font.lineHeight / 2;
if (textContrast) if (textContrast)
GuiComponent.fill(stack, textX - 1, textY - 1, textX + textWidth + 1, textY + font.lineHeight + 1, 0x80000000); graphics.fill(textX - 1, textY - 1, textX + textWidth + 1, textY + font.lineHeight + 1, 0x80000000);
font.draw(stack, name.get(), textX, textY, 0xFFFFFF); graphics.drawString(font, name.get(), textX, textY, 0xFFFFFF, false);
} }
@Override @Override

View File

@ -1,6 +1,5 @@
package dev.isxander.controlify.gui.guide; package dev.isxander.controlify.gui.guide;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.api.bind.ControllerBinding;
import dev.isxander.controlify.api.guide.ActionPriority; import dev.isxander.controlify.api.guide.ActionPriority;
import dev.isxander.controlify.api.guide.GuideActionNameSupplier; import dev.isxander.controlify.api.guide.GuideActionNameSupplier;
@ -12,6 +11,7 @@ import dev.isxander.controlify.gui.layout.AnchorPoint;
import dev.isxander.controlify.gui.layout.ColumnLayoutComponent; import dev.isxander.controlify.gui.layout.ColumnLayoutComponent;
import dev.isxander.controlify.gui.layout.PositionedComponent; import dev.isxander.controlify.gui.layout.PositionedComponent;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
@ -69,14 +69,14 @@ public class InGameButtonGuide implements IngameGuideRegistry {
); );
} }
public void renderHud(PoseStack poseStack, float tickDelta, int width, int height) { public void renderHud(GuiGraphics graphics, float tickDelta, int width, int height) {
if (!controller.config().showIngameGuide || minecraft.screen != null || minecraft.options.renderDebug) if (!controller.config().showIngameGuide || minecraft.screen != null || minecraft.options.renderDebug)
return; return;
ControlifyCompat.ifBeginHudBatching(); ControlifyCompat.ifBeginHudBatching();
leftLayout.renderComponent(poseStack, tickDelta); leftLayout.renderComponent(graphics, tickDelta);
rightLayout.renderComponent(poseStack, tickDelta); rightLayout.renderComponent(graphics, tickDelta);
ControlifyCompat.ifEndHudBatching(); ControlifyCompat.ifEndHudBatching();
} }
@ -111,13 +111,13 @@ public class InGameButtonGuide implements IngameGuideRegistry {
if (player.getAbilities().flying) if (player.getAbilities().flying)
return Optional.of(Component.translatable("controlify.guide.ingame.fly_up")); return Optional.of(Component.translatable("controlify.guide.ingame.fly_up"));
if (player.isOnGround()) if (player.onGround())
return Optional.of(Component.translatable("key.jump")); return Optional.of(Component.translatable("key.jump"));
if (player.isInWater()) if (player.isInWater())
return Optional.of(Component.translatable("controlify.guide.ingame.swim_up")); return Optional.of(Component.translatable("controlify.guide.ingame.swim_up"));
if (!player.isOnGround() && !player.isFallFlying() && !player.isInWater() && !player.hasEffect(MobEffects.LEVITATION)) { if (!player.onGround() && !player.isFallFlying() && !player.isInWater() && !player.hasEffect(MobEffects.LEVITATION)) {
var chestStack = player.getItemBySlot(EquipmentSlot.CHEST); var chestStack = player.getItemBySlot(EquipmentSlot.CHEST);
if (chestStack.is(Items.ELYTRA) && ElytraItem.isFlyEnabled(chestStack)) if (chestStack.is(Items.ELYTRA) && ElytraItem.isFlyEnabled(chestStack))
return Optional.of(Component.translatable("controlify.guide.ingame.start_elytra")); return Optional.of(Component.translatable("controlify.guide.ingame.start_elytra"));
@ -131,7 +131,7 @@ public class InGameButtonGuide implements IngameGuideRegistry {
return Optional.of(Component.translatable("controlify.guide.ingame.dismount")); return Optional.of(Component.translatable("controlify.guide.ingame.dismount"));
if (player.getAbilities().flying) if (player.getAbilities().flying)
return Optional.of(Component.translatable("controlify.guide.ingame.fly_down")); return Optional.of(Component.translatable("controlify.guide.ingame.fly_down"));
if (player.isInWater() && !player.isOnGround()) if (player.isInWater() && !player.onGround())
return Optional.of(Component.translatable("controlify.guide.ingame.swim_down")); return Optional.of(Component.translatable("controlify.guide.ingame.swim_down"));
if (ctx.controller().config().toggleSneak) { if (ctx.controller().config().toggleSneak) {
return Optional.of(Component.translatable(player.input.shiftKeyDown ? "controlify.guide.ingame.stop_sneaking" : "controlify.guide.ingame.start_sneaking")); return Optional.of(Component.translatable(player.input.shiftKeyDown ? "controlify.guide.ingame.stop_sneaking" : "controlify.guide.ingame.start_sneaking"));
@ -182,8 +182,8 @@ public class InGameButtonGuide implements IngameGuideRegistry {
return Optional.empty(); return Optional.empty();
}); });
registerGuideAction(controller.bindings().DROP, ActionLocation.RIGHT, (ctx) -> { registerGuideAction(controller.bindings().DROP, ActionLocation.RIGHT, (ctx) -> {
var player = ctx.player(); var holdingItem = ctx.player().getInventory().getSelected();
if (player.hasItemInSlot(EquipmentSlot.MAINHAND) || player.hasItemInSlot(EquipmentSlot.OFFHAND)) if (!holdingItem.isEmpty())
return Optional.of(Component.translatable("controlify.guide.ingame.drop")); return Optional.of(Component.translatable("controlify.guide.ingame.drop"));
return Optional.empty(); return Optional.empty();
}); });

View File

@ -1,6 +1,6 @@
package dev.isxander.controlify.gui.layout; package dev.isxander.controlify.gui.layout;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.joml.Vector2i; import org.joml.Vector2i;
import org.joml.Vector2ic; import org.joml.Vector2ic;
@ -35,7 +35,7 @@ public class ColumnLayoutComponent<T extends RenderComponent> extends AbstractLa
} }
@Override @Override
public void render(PoseStack stack, int x, int y, float deltaTime) { public void render(GuiGraphics graphics, int x, int y, float deltaTime) {
int width = getMaxChildWidth(); int width = getMaxChildWidth();
if (width == -1) if (width == -1)
@ -47,7 +47,7 @@ public class ColumnLayoutComponent<T extends RenderComponent> extends AbstractLa
continue; continue;
element.render( element.render(
stack, graphics,
x + colPaddingLeft + elementPosition.positionFunction.apply(width, element.size().x()), x + colPaddingLeft + elementPosition.positionFunction.apply(width, element.size().x()),
y + colPaddingTop + yOffset, y + colPaddingTop + yOffset,
deltaTime deltaTime

View File

@ -1,7 +1,7 @@
package dev.isxander.controlify.gui.layout; package dev.isxander.controlify.gui.layout;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.Renderable;
import org.joml.Vector2ic; import org.joml.Vector2ic;
@ -33,12 +33,12 @@ public class PositionedComponent<T extends RenderComponent> implements Renderabl
} }
@Override @Override
public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
this.renderComponent(matrices, delta); this.renderComponent(graphics, delta);
} }
public void renderComponent(PoseStack stack, float deltaTime) { public void renderComponent(GuiGraphics graphics, float deltaTime) {
component.render(stack, x, y, deltaTime); component.render(graphics, x, y, deltaTime);
} }
public int x() { public int x() {

View File

@ -1,9 +1,9 @@
package dev.isxander.controlify.gui.layout; package dev.isxander.controlify.gui.layout;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import org.joml.Vector2ic; import org.joml.Vector2ic;
public interface RenderComponent { public interface RenderComponent {
void render(PoseStack stack, int x, int y, float deltaTime); void render(GuiGraphics graphics, int x, int y, float deltaTime);
Vector2ic size(); Vector2ic size();

View File

@ -1,6 +1,6 @@
package dev.isxander.controlify.gui.layout; package dev.isxander.controlify.gui.layout;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.joml.Vector2i; import org.joml.Vector2i;
import org.joml.Vector2ic; import org.joml.Vector2ic;
@ -32,7 +32,7 @@ public class RowLayoutComponent<T extends RenderComponent> extends AbstractLayou
} }
@Override @Override
public void render(PoseStack stack, int x, int y, float deltaTime) { public void render(GuiGraphics graphics, int x, int y, float deltaTime) {
int height = getMaxChildHeight(); int height = getMaxChildHeight();
if (height == -1) if (height == -1)
@ -44,7 +44,7 @@ public class RowLayoutComponent<T extends RenderComponent> extends AbstractLayou
continue; continue;
element.render( element.render(
stack, graphics,
x + rowPaddingLeft + xOffset, x + rowPaddingLeft + xOffset,
y + rowPaddingTop + elementPosition.positionFunction.apply(height, element.size().y()), y + rowPaddingTop + elementPosition.positionFunction.apply(height, element.size().y()),
deltaTime deltaTime

View File

@ -1,13 +1,11 @@
package dev.isxander.controlify.gui.screen; package dev.isxander.controlify.gui.screen;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.Util; import net.minecraft.Util;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AccessibilityOnboardingTextWidget; import net.minecraft.client.gui.components.AccessibilityOnboardingTextWidget;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.MultiLineTextWidget; import net.minecraft.client.gui.components.MultiLineTextWidget;
import net.minecraft.client.gui.layouts.FrameLayout;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.TitleScreen; import net.minecraft.client.gui.screens.TitleScreen;
import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.CommonComponents;
@ -55,8 +53,8 @@ public class BetaNoticeScreen extends Screen {
} }
@Override @Override
public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
renderBackground(matrices); renderBackground(graphics);
super.render(matrices, mouseX, mouseY, delta); super.render(graphics, mouseX, mouseY, delta);
} }
} }

View File

@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.Controller;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.MultiLineLabel; import net.minecraft.client.gui.components.MultiLineLabel;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
@ -57,36 +58,34 @@ public class ControllerDeadzoneCalibrationScreen extends Screen {
} }
@Override @Override
public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
renderBackground(matrices); renderBackground(graphics);
super.render(matrices, mouseX, mouseY, delta); super.render(graphics, mouseX, mouseY, delta);
drawCenteredString(matrices, font, Component.translatable("controlify.calibration.title", controller.name()).withStyle(ChatFormatting.BOLD), width / 2, 8, -1); graphics.drawCenteredString(font, Component.translatable("controlify.calibration.title", controller.name()).withStyle(ChatFormatting.BOLD), width / 2, 8, -1);
RenderSystem.setShaderTexture(0, GUI_BARS_LOCATION); graphics.pose().pushPose();
RenderSystem.setShaderColor(1f, 1f, 1f, 1f); graphics.pose().scale(2f, 2f, 1f);
matrices.pushPose(); drawBar(graphics, width / 2 / 2, 30 / 2, 1f, 0);
matrices.scale(2f, 2f, 1f);
drawBar(matrices, width / 2 / 2, 30 / 2, 1f, 0);
var progress = (calibrationTicks - 1 + delta) / 100f; var progress = (calibrationTicks - 1 + delta) / 100f;
if (progress > 0) if (progress > 0)
drawBar(matrices, width / 2 / 2, 30 / 2, progress, 5); drawBar(graphics, width / 2 / 2, 30 / 2, progress, 5);
matrices.popPose(); graphics.pose().popPose();
MultiLineLabel label; MultiLineLabel label;
if (calibrating) label = waitLabel; if (calibrating) label = waitLabel;
else if (calibrated) label = completeLabel; else if (calibrated) label = completeLabel;
else label = infoLabel; else label = infoLabel;
label.renderCentered(matrices, width / 2, 55); label.renderCentered(graphics, width / 2, 55);
} }
private void drawBar(PoseStack matrices, int centerX, int y, float progress, int vOffset) { private void drawBar(GuiGraphics graphics, int centerX, int y, float progress, int vOffset) {
progress = 1 - (float)Math.pow(1 - progress, 3); progress = 1 - (float)Math.pow(1 - progress, 3);
int x = centerX - 182 / 2; int x = centerX - 182 / 2;
this.blit(matrices, x, y, 0, 30 + vOffset, (int)(progress * 182), 5); graphics.blit(GUI_BARS_LOCATION, x, y, 0, 30 + vOffset, (int)(progress * 182), 5);
} }
@Override @Override

View File

@ -56,7 +56,7 @@ public class ControllerPlayerMovement extends Input {
if (!bindings.JUMP.held()) if (!bindings.JUMP.held())
this.jumping = false; this.jumping = false;
if (player.getAbilities().flying || (player.isInWater() && !player.isOnGround()) || !controller.config().toggleSneak) { if (player.getAbilities().flying || (player.isInWater() && !player.onGround()) || !controller.config().toggleSneak) {
if (bindings.SNEAK.justPressed()) if (bindings.SNEAK.justPressed())
this.shiftKeyDown = true; this.shiftKeyDown = true;
if (!bindings.SNEAK.held()) if (!bindings.SNEAK.held())

View File

@ -1,32 +1,32 @@
package dev.isxander.controlify.mixins.compat.iris; package dev.isxander.controlify.mixins.compat.iris;
import dev.isxander.controlify.compatibility.iris.BaseOptionElementComponentProcessor; //import dev.isxander.controlify.compatibility.iris.BaseOptionElementComponentProcessor;
import dev.isxander.controlify.screenop.ComponentProcessor; //import dev.isxander.controlify.screenop.ComponentProcessor;
import dev.isxander.controlify.screenop.ComponentProcessorProvider; //import dev.isxander.controlify.screenop.ComponentProcessorProvider;
import net.coderbot.iris.gui.NavigationController; //import net.coderbot.iris.gui.NavigationController;
import net.coderbot.iris.gui.element.widget.BaseOptionElementWidget; //import net.coderbot.iris.gui.element.widget.BaseOptionElementWidget;
import org.spongepowered.asm.mixin.Mixin; //import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; //import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique; //import org.spongepowered.asm.mixin.Unique;
//
@Mixin(value = BaseOptionElementWidget.class, remap = false) //@Mixin(value = BaseOptionElementWidget.class, remap = false)
public abstract class BaseOptionElementWidgetMixin implements ComponentProcessorProvider { //public abstract class BaseOptionElementWidgetMixin implements ComponentProcessorProvider {
@Shadow public abstract boolean applyPreviousValue(); // @Shadow public abstract boolean applyPreviousValue();
@Shadow public abstract boolean applyNextValue(); // @Shadow public abstract boolean applyNextValue();
//
@Shadow protected NavigationController navigation; // @Shadow protected NavigationController navigation;
@Unique private final BaseOptionElementComponentProcessor processor // @Unique private final BaseOptionElementComponentProcessor processor
= new BaseOptionElementComponentProcessor(this::cycle); // = new BaseOptionElementComponentProcessor(this::cycle);
//
@Override // @Override
public ComponentProcessor componentProcessor() { // public ComponentProcessor componentProcessor() {
return processor; // return processor;
} // }
//
private void cycle(boolean reverse) { // private void cycle(boolean reverse) {
boolean needsUpdate = reverse ? applyPreviousValue() : applyNextValue(); // boolean needsUpdate = reverse ? applyPreviousValue() : applyNextValue();
if (needsUpdate) { // if (needsUpdate) {
navigation.refresh(); // navigation.refresh();
} // }
} // }
} //}

View File

@ -5,6 +5,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.Controller;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.ChatComponent; import net.minecraft.client.gui.components.ChatComponent;
import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.gui.screens.ChatScreen;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@ -18,22 +19,22 @@ public class ChatComponentMixin {
@Shadow @Final private Minecraft minecraft; @Shadow @Final private Minecraft minecraft;
@Inject(method = "render", at = @At("HEAD")) @Inject(method = "render", at = @At("HEAD"))
private void translateRender(PoseStack matrices, int tickDelta, int i, int j, CallbackInfo ci) { private void translateRender(GuiGraphics graphics, int tickDelta, int i, int j, CallbackInfo ci) {
if (!(minecraft.screen instanceof ChatScreen)) if (!(minecraft.screen instanceof ChatScreen))
return; return;
Controller<?, ?> controller = Controlify.instance().currentController(); Controller<?, ?> controller = Controlify.instance().currentController();
matrices.pushPose(); graphics.pose().pushPose();
if (controller.config().chatKeyboardHeight == 0) return; if (controller.config().chatKeyboardHeight == 0) return;
matrices.translate(0, -controller.config().chatKeyboardHeight * minecraft.getWindow().getGuiScaledHeight(), 0); graphics.pose().translate(0, -controller.config().chatKeyboardHeight * minecraft.getWindow().getGuiScaledHeight(), 0);
} }
@Inject(method = "render", at = @At("TAIL")) @Inject(method = "render", at = @At("TAIL"))
private void finishTranslateRender(PoseStack matrices, int tickDelta, int i, int j, CallbackInfo ci) { private void finishTranslateRender(GuiGraphics graphics, int tickDelta, int i, int j, CallbackInfo ci) {
if (!(minecraft.screen instanceof ChatScreen)) if (!(minecraft.screen instanceof ChatScreen))
return; return;
matrices.popPose(); graphics.pose().popPose();
} }
@ModifyConstant(method = "render", constant = @Constant(intValue = 40)) @ModifyConstant(method = "render", constant = @Constant(intValue = 40))

View File

@ -1,8 +1,8 @@
package dev.isxander.controlify.mixins.feature.chatkbheight; package dev.isxander.controlify.mixins.feature.chatkbheight;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.Controller;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.gui.screens.ChatScreen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -19,16 +19,16 @@ public abstract class ChatScreenMixin extends Screen {
} }
@Inject(method = "render", at = @At("HEAD")) @Inject(method = "render", at = @At("HEAD"))
private void translateRender(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void translateRender(GuiGraphics graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) {
matrices.pushPose(); graphics.pose().pushPose();
Controller<?, ?> controller = Controlify.instance().currentController(); Controller<?, ?> controller = Controlify.instance().currentController();
matrices.translate(0, -controller.config().chatKeyboardHeight * this.height, 0); graphics.pose().translate(0, -controller.config().chatKeyboardHeight * this.height, 0);
} }
@Inject(method = "render", at = @At("TAIL")) @Inject(method = "render", at = @At("TAIL"))
private void finishTranslateRender(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void finishTranslateRender(GuiGraphics graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) {
matrices.popPose(); graphics.pose().popPose();
} }
@ModifyVariable(method = "mouseClicked", at = @At("HEAD"), ordinal = 1, argsOnly = true) @ModifyVariable(method = "mouseClicked", at = @At("HEAD"), ordinal = 1, argsOnly = true)

View File

@ -5,6 +5,7 @@ import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.gui.guide.InGameButtonGuide; import dev.isxander.controlify.gui.guide.InGameButtonGuide;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.Gui;
import net.minecraft.client.gui.GuiGraphics;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@ -20,10 +21,10 @@ public class GuiMixin {
@Shadow @Final private Minecraft minecraft; @Shadow @Final private Minecraft minecraft;
@Inject(method = "render", at = @At(value = "CONSTANT", args = "stringValue=chat")) @Inject(method = "render", at = @At(value = "CONSTANT", args = "stringValue=chat"))
private void renderButtonGuide(PoseStack matrices, float tickDelta, CallbackInfo ci) { private void renderButtonGuide(GuiGraphics graphics, float tickDelta, CallbackInfo ci) {
Controlify.instance().inGameButtonGuide().ifPresent(guide -> { Controlify.instance().inGameButtonGuide().ifPresent(guide -> {
minecraft.getProfiler().push("controlify_button_guide"); minecraft.getProfiler().push("controlify_button_guide");
guide.renderHud(matrices, tickDelta, screenWidth, screenHeight); guide.renderHud(graphics, tickDelta, screenWidth, screenHeight);
minecraft.getProfiler().pop(); minecraft.getProfiler().pop();
}); });
} }

View File

@ -1,39 +1,30 @@
package dev.isxander.controlify.mixins.feature.guide.screen; package dev.isxander.controlify.mixins.feature.guide.screen;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.InputMode; import dev.isxander.controlify.InputMode;
import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.BindRenderer;
import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition; import dev.isxander.controlify.api.buttonguide.ButtonRenderPosition;
import dev.isxander.controlify.bindings.IBind;
import dev.isxander.controlify.gui.ButtonGuideRenderer; import dev.isxander.controlify.gui.ButtonGuideRenderer;
import dev.isxander.controlify.screenop.ComponentProcessor;
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
import dev.isxander.controlify.screenop.compat.vanilla.AbstractButtonComponentProcessor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.AbstractButton;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.contents.TranslatableContents;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Set;
@Mixin(AbstractButton.class) @Mixin(AbstractButton.class)
public abstract class AbstractButtonMixin extends AbstractWidgetMixin implements ButtonGuideRenderer<AbstractButton> { public abstract class AbstractButtonMixin extends AbstractWidgetMixin implements ButtonGuideRenderer<AbstractButton> {
@Unique private RenderData<AbstractButton> renderData = null; @Unique private RenderData<AbstractButton> renderData = null;
@Inject(method = "renderString", at = @At("RETURN")) @Inject(method = "renderString", at = @At("RETURN"))
private void renderButtonGuide(PoseStack matrices, Font renderer, int color, CallbackInfo ci) { private void renderButtonGuide(GuiGraphics graphics, Font renderer, int color, CallbackInfo ci) {
if (shouldRender()) { if (shouldRender()) {
switch (renderData.position()) { switch (renderData.position()) {
case LEFT -> getBind().render(matrices, getX() - getBind().size().width() - 1, getY() + getHeight() / 2); case LEFT -> getBind().render(graphics, getX() - getBind().size().width() - 1, getY() + getHeight() / 2);
case RIGHT -> getBind().render(matrices, getX() + getWidth() + 1, getY() + getHeight() / 2); case RIGHT -> getBind().render(graphics, getX() + getWidth() + 1, getY() + getHeight() / 2);
case TEXT -> { case TEXT -> {
Font font = Minecraft.getInstance().font; Font font = Minecraft.getInstance().font;
int x; int x;
@ -43,22 +34,22 @@ public abstract class AbstractButtonMixin extends AbstractWidgetMixin implements
x = getX() + getWidth() / 2 - font.width(getMessage()) / 2 - getBind().size().width(); x = getX() + getWidth() / 2 - font.width(getMessage()) / 2 - getBind().size().width();
} }
getBind().render(matrices, x, getY() + getHeight() / 2); getBind().render(graphics, x, getY() + getHeight() / 2);
} }
} }
} }
} }
@Inject(method = "renderString", at = @At("HEAD")) @Inject(method = "renderString", at = @At("HEAD"))
private void shiftXOffset(PoseStack matrices, Font renderer, int color, CallbackInfo ci) { private void shiftXOffset(GuiGraphics graphics, Font renderer, int color, CallbackInfo ci) {
matrices.pushPose(); graphics.pose().pushPose();
if (!shouldRender() || Minecraft.getInstance().font.width(getMessage()) > getWidth() || renderData.position() != ButtonRenderPosition.TEXT) return; if (!shouldRender() || Minecraft.getInstance().font.width(getMessage()) > getWidth() || renderData.position() != ButtonRenderPosition.TEXT) return;
matrices.translate(getBind().size().width() / 2f, 0, 0); graphics.pose().translate(getBind().size().width() / 2f, 0, 0);
} }
@Inject(method = "renderString", at = @At("RETURN")) @Inject(method = "renderString", at = @At("RETURN"))
private void finishShiftXOffset(PoseStack matrices, Font renderer, int color, CallbackInfo ci) { private void finishShiftXOffset(GuiGraphics graphics, Font renderer, int color, CallbackInfo ci) {
matrices.popPose(); graphics.pose().popPose();
} }
@Override @Override

View File

@ -1,6 +1,5 @@
package dev.isxander.controlify.mixins.feature.guide.screen; package dev.isxander.controlify.mixins.feature.guide.screen;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -9,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyArg;
@Mixin(AbstractWidget.class) @Mixin(AbstractWidget.class)
public abstract class AbstractWidgetMixin extends GuiComponent { public abstract class AbstractWidgetMixin {
@Shadow public abstract int getX(); @Shadow public abstract int getX();
@Shadow public abstract int getY(); @Shadow public abstract int getY();
@ -22,7 +21,7 @@ public abstract class AbstractWidgetMixin extends GuiComponent {
@Shadow public abstract boolean isActive(); @Shadow public abstract boolean isActive();
@ModifyArg(method = "renderScrollingString(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/gui/Font;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/AbstractWidget;renderScrollingString(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/gui/Font;Lnet/minecraft/network/chat/Component;IIIII)V"), index = 3) @ModifyArg(method = "renderScrollingString(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Font;II)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/AbstractWidget;renderScrollingString(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Font;Lnet/minecraft/network/chat/Component;IIIII)V"), index = 3)
protected int shiftDrawSize(int x) { protected int shiftDrawSize(int x) {
return x; return x;
} }

View File

@ -1,14 +1,13 @@
package dev.isxander.controlify.mixins.feature.guide.screen; package dev.isxander.controlify.mixins.feature.guide.screen;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.InputMode; import dev.isxander.controlify.InputMode;
import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.BindRenderer;
import dev.isxander.controlify.bindings.IBind;
import dev.isxander.controlify.compatibility.ControlifyCompat; import dev.isxander.controlify.compatibility.ControlifyCompat;
import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.Controller;
import dev.isxander.controlify.gui.DrawSize; import dev.isxander.controlify.gui.DrawSize;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.TabButton; import net.minecraft.client.gui.components.TabButton;
import net.minecraft.client.gui.components.tabs.TabNavigationBar; import net.minecraft.client.gui.components.tabs.TabNavigationBar;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@ -25,16 +24,16 @@ public class TabNavigationBarMixin {
@Shadow private int width; @Shadow private int width;
@Inject(method = "render", at = @At("RETURN")) @Inject(method = "render", at = @At("RETURN"))
private void renderControllerButtonOverlay(PoseStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void renderControllerButtonOverlay(GuiGraphics graphics, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (Controlify.instance().currentInputMode() == InputMode.CONTROLLER) { if (Controlify.instance().currentInputMode() == InputMode.CONTROLLER) {
var controller = Controlify.instance().currentController(); var controller = Controlify.instance().currentController();
if (controller.config().showScreenGuide) { if (controller.config().showScreenGuide) {
this.renderControllerButtonOverlay(matrices, controller); this.renderControllerButtonOverlay(graphics, controller);
} }
} }
} }
private void renderControllerButtonOverlay(PoseStack matrices, Controller<?, ?> controller) { private void renderControllerButtonOverlay(GuiGraphics graphics, Controller<?, ?> controller) {
ControlifyCompat.ifBeginHudBatching(); ControlifyCompat.ifBeginHudBatching();
TabButton firstTab = tabButtons.get(0); TabButton firstTab = tabButtons.get(0);
@ -44,14 +43,14 @@ public class TabNavigationBarMixin {
DrawSize prevBindDrawSize = prevBind.size(); DrawSize prevBindDrawSize = prevBind.size();
int firstButtonX = Math.max(firstTab.getX() - 2 - prevBindDrawSize.width(), firstTab.getX() / 2 - prevBindDrawSize.width() / 2); int firstButtonX = Math.max(firstTab.getX() - 2 - prevBindDrawSize.width(), firstTab.getX() / 2 - prevBindDrawSize.width() / 2);
int firstButtonY = 12; int firstButtonY = 12;
prevBind.render(matrices, firstButtonX, firstButtonY); prevBind.render(graphics, firstButtonX, firstButtonY);
BindRenderer nextBind = controller.bindings().GUI_NEXT_TAB.renderer(); BindRenderer nextBind = controller.bindings().GUI_NEXT_TAB.renderer();
DrawSize nextBindDrawSize = nextBind.size(); DrawSize nextBindDrawSize = nextBind.size();
int lastButtonEnd = lastTab.getX() + lastTab.getWidth(); int lastButtonEnd = lastTab.getX() + lastTab.getWidth();
int lastButtonX = Math.min(lastTab.getX() + lastTab.getWidth() + 2, lastButtonEnd + (width - lastButtonEnd) / 2 - nextBindDrawSize.width() / 2); int lastButtonX = Math.min(lastTab.getX() + lastTab.getWidth() + 2, lastButtonEnd + (width - lastButtonEnd) / 2 - nextBindDrawSize.width() / 2);
int lastButtonY = 12; int lastButtonY = 12;
nextBind.render(matrices, lastButtonX, lastButtonY); nextBind.render(graphics, lastButtonX, lastButtonY);
ControlifyCompat.ifEndHudBatching(); ControlifyCompat.ifEndHudBatching();
} }

View File

@ -1,10 +1,10 @@
package dev.isxander.controlify.mixins.feature.screenop; package dev.isxander.controlify.mixins.feature.screenop;
import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.api.ControlifyApi; import dev.isxander.controlify.api.ControlifyApi;
import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.ScreenProcessorProvider;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -17,11 +17,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public class GameRendererMixin { public class GameRendererMixin {
@Shadow @Final Minecraft minecraft; @Shadow @Final Minecraft minecraft;
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;renderWithTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V", shift = At.Shift.AFTER)) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;renderWithTooltip(Lnet/minecraft/client/gui/GuiGraphics;IIF)V", shift = At.Shift.AFTER))
private void onPostRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, @Local(ordinal = 1) PoseStack poseStack) { private void onPostRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, @Local GuiGraphics graphics) {
ControlifyApi.get().getCurrentController().ifPresent(controller -> { ControlifyApi.get().getCurrentController().ifPresent(controller -> {
if (minecraft.screen == null) return; if (minecraft.screen == null) return;
ScreenProcessorProvider.provide(minecraft.screen).render(controller, poseStack, tickDelta); ScreenProcessorProvider.provide(minecraft.screen).render(controller, graphics, tickDelta);
}); });
} }
} }

View File

@ -1,8 +1,8 @@
package dev.isxander.controlify.mixins.feature.virtualmouse; package dev.isxander.controlify.mixins.feature.virtualmouse;
import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.vertex.PoseStack;
import dev.isxander.controlify.Controlify; import dev.isxander.controlify.Controlify;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@ -11,8 +11,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GameRenderer.class) @Mixin(GameRenderer.class)
public class GameRendererMixin { public class GameRendererMixin {
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;renderWithTooltip(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V", shift = At.Shift.AFTER)) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;renderWithTooltip(Lnet/minecraft/client/gui/GuiGraphics;IIF)V", shift = At.Shift.AFTER))
private void onPostRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, @Local(ordinal = 1) PoseStack poseStack) { private void onPostRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, @Local GuiGraphics graphics) {
Controlify.instance().virtualMouseHandler().renderVirtualMouse(poseStack); Controlify.instance().virtualMouseHandler().renderVirtualMouse(graphics);
} }
} }

View File

@ -36,7 +36,7 @@ public class ReachAroundHandler {
&& cameraEntity.getXRot() >= 45 && cameraEntity.getXRot() >= 45
// if the player is not standing on a block, this is inappropriate // if the player is not standing on a block, this is inappropriate
// this also prevents selecting fluids as a valid position // this also prevents selecting fluids as a valid position
&& cameraEntity.isOnGround() && cameraEntity.onGround()
// must respect config option // must respect config option
&& Controlify.instance().config().globalSettings().reachAround.canReachAround(); && Controlify.instance().config().globalSettings().reachAround.canReachAround();
} }

View File

@ -13,6 +13,7 @@ import dev.isxander.controlify.virtualmouse.VirtualMouseBehaviour;
import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.ComponentPath;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.components.tabs.Tab; import net.minecraft.client.gui.components.tabs.Tab;
@ -51,9 +52,9 @@ public class ScreenProcessor<T extends Screen> {
handleTabNavigation(controller); handleTabNavigation(controller);
} }
public void render(Controller<?, ?> controller, PoseStack poseStack, float tickDelta) { public void render(Controller<?, ?> controller, GuiGraphics graphics, float tickDelta) {
var vmouse = Controlify.instance().virtualMouseHandler(); var vmouse = Controlify.instance().virtualMouseHandler();
this.render(controller, poseStack, tickDelta, vmouse.isVirtualMouseEnabled() ? Optional.of(vmouse) : Optional.empty()); this.render(controller, graphics, tickDelta, vmouse.isVirtualMouseEnabled() ? Optional.of(vmouse) : Optional.empty());
} }
public void onInputModeChanged(InputMode mode) { public void onInputModeChanged(InputMode mode) {
@ -190,7 +191,7 @@ public class ScreenProcessor<T extends Screen> {
} }
} }
protected void render(Controller<?, ?> controller, PoseStack poseStack, float tickDelta, Optional<VirtualMouseHandler> vmouse) { protected void render(Controller<?, ?> controller, GuiGraphics graphics, float tickDelta, Optional<VirtualMouseHandler> vmouse) {
} }

View File

@ -1,8 +1,8 @@
package dev.isxander.controlify.utils; package dev.isxander.controlify.utils;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.toasts.SystemToast; import net.minecraft.client.gui.components.toasts.SystemToast;
import net.minecraft.client.gui.components.toasts.ToastComponent; import net.minecraft.client.gui.components.toasts.ToastComponent;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -26,11 +26,11 @@ public class ToastUtils {
} }
@Override @Override
public @NotNull Visibility render(@NotNull PoseStack matrices, @NotNull ToastComponent manager, long startTime) { public @NotNull Visibility render(@NotNull GuiGraphics graphics, @NotNull ToastComponent manager, long startTime) {
if (removed) if (removed)
return Visibility.HIDE; return Visibility.HIDE;
return super.render(matrices, manager, startTime); return super.render(graphics, manager, startTime);
} }
public void remove() { public void remove() {

View File

@ -16,7 +16,7 @@ import dev.isxander.controlify.mixins.feature.virtualmouse.KeyboardHandlerAccess
import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor;
import dev.isxander.controlify.utils.ToastUtils; import dev.isxander.controlify.utils.ToastUtils;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -202,32 +202,28 @@ public class VirtualMouseHandler {
} }
} }
public void renderVirtualMouse(PoseStack matrices) { public void renderVirtualMouse(GuiGraphics graphics) {
if (!virtualMouseEnabled) return; if (!virtualMouseEnabled) return;
if (DebugProperties.DEBUG_SNAPPING) { if (DebugProperties.DEBUG_SNAPPING) {
for (var snapPoint : snapPoints) { for (var snapPoint : snapPoints) {
GuiComponent.fill(matrices, snapPoint.position().x() - snapPoint.range(), snapPoint.position().y() - snapPoint.range(), snapPoint.position().x() + snapPoint.range(), snapPoint.position().y() + snapPoint.range(), 0x33FFFFFF); graphics.fill(snapPoint.position().x() - snapPoint.range(), snapPoint.position().y() - snapPoint.range(), snapPoint.position().x() + snapPoint.range(), snapPoint.position().y() + snapPoint.range(), 0x33FFFFFF);
GuiComponent.fill(matrices, snapPoint.position().x() - 1, snapPoint.position().y() - 1, snapPoint.position().x() + 1, snapPoint.position().y() + 1, snapPoint.equals(lastSnappedPoint) ? 0xFFFFFF00 : 0xFFFF0000); graphics.fill( snapPoint.position().x() - 1, snapPoint.position().y() - 1, snapPoint.position().x() + 1, snapPoint.position().y() + 1, snapPoint.equals(lastSnappedPoint) ? 0xFFFFFF00 : 0xFFFF0000);
} }
} }
RenderSystem.setShaderTexture(0, CURSOR_TEXTURE);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
RenderSystem.enableBlend();
var scaledX = currentX * (double)this.minecraft.getWindow().getGuiScaledWidth() / (double)this.minecraft.getWindow().getScreenWidth(); var scaledX = currentX * (double)this.minecraft.getWindow().getGuiScaledWidth() / (double)this.minecraft.getWindow().getScreenWidth();
var scaledY = currentY * (double)this.minecraft.getWindow().getGuiScaledHeight() / (double)this.minecraft.getWindow().getScreenHeight(); var scaledY = currentY * (double)this.minecraft.getWindow().getGuiScaledHeight() / (double)this.minecraft.getWindow().getScreenHeight();
matrices.pushPose(); graphics.pose().pushPose();
matrices.translate(scaledX, scaledY, 1000f); graphics.pose().translate(scaledX, scaledY, 1000f);
matrices.scale(0.5f, 0.5f, 0.5f); graphics.pose().scale(0.5f, 0.5f, 0.5f);
GuiComponent.blit(matrices, -16, -16, 0, 0, 32, 32, 32, 32);
matrices.popPose();
RenderSystem.enableBlend();
graphics.blit(CURSOR_TEXTURE, -16, -16, 0, 0, 32, 32, 32, 32);
RenderSystem.disableBlend(); RenderSystem.disableBlend();
graphics.pose().popPose();
} }
public void enableVirtualMouse() { public void enableVirtualMouse() {

View File

@ -7,7 +7,7 @@
}, },
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"mixins": [ "mixins": [
"compat.iris.BaseOptionElementWidgetMixin", // "compat.iris.BaseOptionElementWidgetMixin",
"compat.sodium.CycleControlElementMixin", "compat.sodium.CycleControlElementMixin",
"compat.sodium.SliderControlElementMixin", "compat.sodium.SliderControlElementMixin",
"compat.sodium.TickBoxControlElementMixin", "compat.sodium.TickBoxControlElementMixin",

View File

@ -32,9 +32,9 @@
"accessWidener": "controlify.accesswidener", "accessWidener": "controlify.accesswidener",
"depends": { "depends": {
"fabricloader": ">=0.14.0", "fabricloader": ">=0.14.0",
"minecraft": "~1.19.4", "minecraft": ">1.20-",
"java": ">=17", "java": ">=17",
"yet-another-config-lib": "^2.4.0" "yet_another_config_lib": "^2.4.0"
}, },
"breaks": { "breaks": {
"midnightcontrols": "*" "midnightcontrols": "*"