1
0
forked from Clones/Controlify

Custom button guide HUD scaling

This commit is contained in:
isXander
2023-06-21 19:07:02 +01:00
parent b370572dcc
commit 1e6db9d83b
6 changed files with 53 additions and 10 deletions

View File

@ -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.<GuideActionRenderer<IngameGuideContext>>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.<GuideActionRenderer<IngameGuideContext>>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

View File

@ -22,10 +22,10 @@ public class PositionedComponent<T extends RenderComponent> 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();

View File

@ -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.<Float>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"))