diff --git a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java index 1c5f43b..50f320c 100644 --- a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java +++ b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java @@ -22,4 +22,5 @@ public class GlobalSettings { public boolean uiSounds = false; public boolean notifyLowBattery = true; public boolean delegateSetup = false; + public float ingameButtonGuideScale = 1f; } diff --git a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java index 558d3af..c4faa8b 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java @@ -1,5 +1,8 @@ package dev.isxander.controlify.gui.guide; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexSorting; +import dev.isxander.controlify.Controlify; import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.api.guide.ActionPriority; import dev.isxander.controlify.api.guide.GuideActionNameSupplier; @@ -20,6 +23,7 @@ import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.item.ElytraItem; import net.minecraft.world.item.Items; import net.minecraft.world.phys.*; +import org.joml.Matrix4f; import java.util.*; @@ -46,8 +50,8 @@ public class InGameButtonGuide implements IngameGuideRegistry { leftLayout = new PositionedComponent<>( ColumnLayoutComponent.>builder() - .spacing(2) - .colPadding(4, 4) + .spacing(1) + .colPadding(2, 2) .elementPosition(ColumnLayoutComponent.ElementPosition.LEFT) .elements(leftGuides.stream().map(guide -> new GuideActionRenderer<>(guide, false, true)).toList()) .build(), @@ -58,8 +62,8 @@ public class InGameButtonGuide implements IngameGuideRegistry { rightLayout = new PositionedComponent<>( ColumnLayoutComponent.>builder() - .spacing(2) - .colPadding(4, 4) + .spacing(1) + .colPadding(2, 2) .elementPosition(ColumnLayoutComponent.ElementPosition.RIGHT) .elements(rightGuides.stream().map(guide -> new GuideActionRenderer<>(guide, true, true)).toList()) .build(), @@ -73,12 +77,30 @@ public class InGameButtonGuide implements IngameGuideRegistry { if (!controller.config().showIngameGuide || minecraft.screen != null || minecraft.options.renderDebug) return; + float scale = Controlify.instance().config().globalSettings().ingameButtonGuideScale; + boolean customScale = scale != 1f; + + Matrix4f prevProjection = null; + if (customScale) { + prevProjection = RenderSystem.getProjectionMatrix(); + double guiScale = minecraft.getWindow().getGuiScale() * scale; + Matrix4f matrix4f = new Matrix4f() + .setOrtho( + 0.0F, (float)((double)minecraft.getWindow().getWidth() / guiScale), (float)((double)minecraft.getWindow().getHeight() / guiScale), 0.0F, 1000.0F, 21000.0F + ); + RenderSystem.setProjectionMatrix(matrix4f, VertexSorting.ORTHOGRAPHIC_Z); + } + ControlifyCompat.ifBeginHudBatching(); leftLayout.renderComponent(graphics, tickDelta); rightLayout.renderComponent(graphics, tickDelta); ControlifyCompat.ifEndHudBatching(); + + if (customScale) { + RenderSystem.setProjectionMatrix(prevProjection, VertexSorting.ORTHOGRAPHIC_Z); + } } public void tick() { @@ -87,8 +109,12 @@ public class InGameButtonGuide implements IngameGuideRegistry { leftLayout.getComponent().getChildComponents().forEach(renderer -> renderer.updateName(context)); rightLayout.getComponent().getChildComponents().forEach(renderer -> renderer.updateName(context)); - leftLayout.updatePosition(); - rightLayout.updatePosition(); + double guiScale = minecraft.getWindow().getGuiScale() * Controlify.instance().config().globalSettings().ingameButtonGuideScale; + int width = (int) (minecraft.getWindow().getWidth() / guiScale); + int height = (int) (minecraft.getWindow().getHeight() / guiScale); + + leftLayout.updatePosition(width, height); + rightLayout.updatePosition(width, height); } @Override diff --git a/src/main/java/dev/isxander/controlify/gui/layout/PositionedComponent.java b/src/main/java/dev/isxander/controlify/gui/layout/PositionedComponent.java index 47b51ce..b612e34 100644 --- a/src/main/java/dev/isxander/controlify/gui/layout/PositionedComponent.java +++ b/src/main/java/dev/isxander/controlify/gui/layout/PositionedComponent.java @@ -22,10 +22,10 @@ public class PositionedComponent implements Renderabl this.origin = origin; } - public void updatePosition() { + public void updatePosition(int windowWidth, int windowHeight) { Vector2ic componentSize = component.size(); - Vector2ic windowPosition = windowAnchor.getAnchorPosition(Minecraft.getInstance().getWindow().getGuiScaledWidth(), Minecraft.getInstance().getWindow().getGuiScaledHeight()); + Vector2ic windowPosition = windowAnchor.getAnchorPosition(windowWidth, windowHeight); Vector2ic anchoredPosition = origin.getAnchorPosition(componentSize.x(), componentSize.y()); this.x = windowPosition.x() + offsetX - anchoredPosition.x(); diff --git a/src/main/java/dev/isxander/controlify/gui/screen/GlobalSettingsScreenFactory.java b/src/main/java/dev/isxander/controlify/gui/screen/GlobalSettingsScreenFactory.java index b8c1bd3..43011e8 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/GlobalSettingsScreenFactory.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/GlobalSettingsScreenFactory.java @@ -8,6 +8,7 @@ import dev.isxander.controlify.reacharound.ReachAroundMode; import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.BooleanControllerBuilder; import dev.isxander.yacl3.api.controller.EnumControllerBuilder; +import dev.isxander.yacl3.api.controller.FloatSliderControllerBuilder; import dev.isxander.yacl3.api.controller.TickBoxControllerBuilder; import net.minecraft.ChatFormatting; import net.minecraft.Util; @@ -88,6 +89,18 @@ public class GlobalSettingsScreenFactory { .binding(GlobalSettings.DEFAULT.keyboardMovement, () -> globalSettings.keyboardMovement, v -> globalSettings.keyboardMovement = v) .controller(TickBoxControllerBuilder::create) .build()) + .option(Option.createBuilder() + .name(Component.translatable("controlify.gui.ingame_button_guide_scale")) + .description(val -> OptionDescription.createBuilder() + .text(Component.translatable("controlify.gui.ingame_button_guide_scale.tooltip")) + .text(val != 1f ? Component.translatable("controlify.gui.ingame_button_guide_scale.tooltip.warning").withStyle(ChatFormatting.RED) : Component.empty()) + .build()) + .binding(GlobalSettings.DEFAULT.ingameButtonGuideScale, () -> globalSettings.ingameButtonGuideScale, v -> globalSettings.ingameButtonGuideScale = v) + .controller(opt -> FloatSliderControllerBuilder.create(opt) + .range(0.5f, 1.5f) + .step(0.05f) + .valueFormatter(v -> Component.literal(String.format("%.0f%%", v*100)))) + .build()) .option(ButtonOption.createBuilder() .name(Component.translatable("controlify.gui.open_issue_tracker")) .action((screen, button) -> Util.getPlatform().openUri("https://github.com/isxander/controlify/issues")) diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java index f5a11c3..883fef7 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractContainerScreenProcessor.java @@ -81,8 +81,8 @@ public class AbstractContainerScreenProcessor