From 2e6b2f8434ffd4997cacaccfc83b9909616b6c2a Mon Sep 17 00:00:00 2001 From: LambdAurora Date: Sun, 15 Dec 2019 19:47:49 +0100 Subject: [PATCH] :sparkles: Add icons in controls menu. --- .gitignore | 3 +- .../lambdacontrols/LambdaControls.java | 126 +++++++++++++----- .../gui/AbstractIconButtonWidget.java | 55 ++++++++ .../gui/ControllerButtonWidget.java | 40 ++++++ .../gui/ControlsListWidget.java | 18 +-- .../mixin/SettingsScreenMixin.java | 16 +-- .../textures/gui/controller_axis.png | Bin 0 -> 5987 bytes .../lambdacontrols/textures/gui/widgets.png | Bin 13320 -> 13435 bytes 8 files changed, 207 insertions(+), 51 deletions(-) create mode 100644 src/main/java/me/lambdaurora/lambdacontrols/gui/AbstractIconButtonWidget.java create mode 100644 src/main/java/me/lambdaurora/lambdacontrols/gui/ControllerButtonWidget.java create mode 100644 src/main/resources/assets/lambdacontrols/textures/gui/controller_axis.png diff --git a/.gitignore b/.gitignore index cfe83db..1d48d5b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # # LambdAurora's ignore file # -# v0.11 +# v0.12 # JetBrains .idea/ @@ -58,6 +58,7 @@ desktop.ini *.dylib *.lib lib*.a +*.png~ # Common bin/ diff --git a/src/main/java/me/lambdaurora/lambdacontrols/LambdaControls.java b/src/main/java/me/lambdaurora/lambdacontrols/LambdaControls.java index 4edf4a9..e8e9609 100644 --- a/src/main/java/me/lambdaurora/lambdacontrols/LambdaControls.java +++ b/src/main/java/me/lambdaurora/lambdacontrols/LambdaControls.java @@ -32,8 +32,8 @@ import org.lwjgl.glfw.GLFW; */ public class LambdaControls implements ClientModInitializer { - private static LambdaControls INSTANCE; - public static final FabricKeyBinding BINDING_LOOK_UP = FabricKeyBinding.Builder.create(new Identifier("lambdacontrols", "look_up"), + private static LambdaControls INSTANCE; + public static final FabricKeyBinding BINDING_LOOK_UP = FabricKeyBinding.Builder.create(new Identifier("lambdacontrols", "look_up"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_8, "key.categories.movement").build(); public static final FabricKeyBinding BINDING_LOOK_RIGHT = FabricKeyBinding.Builder.create(new Identifier("lambdacontrols", "look_right"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_6, "key.categories.movement").build(); @@ -42,10 +42,11 @@ public class LambdaControls implements ClientModInitializer public static final FabricKeyBinding BINDING_LOOK_LEFT = FabricKeyBinding.Builder.create(new Identifier("lambdacontrols", "look_left"), InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_KP_4, "key.categories.movement").build(); public static final Identifier CONTROLLER_BUTTONS = new Identifier("lambdacontrols", "textures/gui/controller_buttons.png"); + public static final Identifier CONTROLLER_AXIS = new Identifier("lambdacontrols", "textures/gui/controller_axis.png"); public final Logger logger = LogManager.getLogger("LambdaControls"); - public final LambdaControlsConfig config = new LambdaControlsConfig(this); - public final LambdaInput input = new LambdaInput(this); - private ControlsMode previous_controls_mode; + public final LambdaControlsConfig config = new LambdaControlsConfig(this); + public final LambdaInput input = new LambdaInput(this); + private ControlsMode previous_controls_mode; @Override public void onInitializeClient() @@ -137,6 +138,93 @@ public class LambdaControls implements ClientModInitializer return INSTANCE; } + public static int draw_button(int x, int y, @NotNull ButtonBinding button, @NotNull MinecraftClient client) + { + return draw_button(x, y, button.get_button(), client); + } + + public static int draw_button(int x, int y, int button, @NotNull MinecraftClient client) + { + if (button == -1) + return 0; + + int controller_type = get().config.get_controller_type().get_id(); + boolean axis = false; + int button_offset = button * 15; + switch (button) { + case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER: + button_offset = 7 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER: + button_offset = 8 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_BACK: + button_offset = 4 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_START: + button_offset = 6 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_GUIDE: + button_offset = 5 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB: + button_offset = 15 * 15; + break; + case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: + button_offset = 16 * 15; + break; + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X + 100: + button_offset = 0; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y + 100: + button_offset = 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X + 100: + button_offset = 2 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y + 100: + button_offset = 3 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X + 200: + button_offset = 4 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y + 200: + button_offset = 5 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X + 200: + button_offset = 6 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y + 200: + button_offset = 7 * 18; + axis = true; + break; + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER + 100: + case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER + 200: + button_offset = 9 * 15; + break; + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 100: + case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 200: + button_offset = 10 * 15; + break; + } + + client.getTextureManager().bindTexture(axis ? LambdaControls.CONTROLLER_AXIS : LambdaControls.CONTROLLER_BUTTONS); + GlStateManager.disableDepthTest(); + + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + DrawableHelper.blit(x, y, (float) button_offset, (float) (controller_type * (axis ? 18 : 15)), axis ? 18 : 15, axis ? 18 : 15, 256, 256); + GlStateManager.enableDepthTest(); + + return axis ? 18 : 15; + } + public static int draw_button_tip(int x, int y, @NotNull ButtonBinding button, boolean display, @NotNull MinecraftClient client) { return draw_button_tip(x, y, button.get_button(), button.get_translation_key(), display, client); @@ -144,37 +232,13 @@ public class LambdaControls implements ClientModInitializer public static int draw_button_tip(int x, int y, int button, @NotNull String action, boolean display, @NotNull MinecraftClient client) { - int controller_type = get().config.get_controller_type().get_id(); String translated_action = I18n.translate(action); if (display) { - int button_offset = button * 15; - switch (button) { - case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB: - button_offset = 15 * 15; - break; - case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB: - button_offset = 16 * 15; - break; - case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER + 100: - case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER + 200: - button_offset = 9 * 15; - break; - case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 100: - case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER + 200: - button_offset = 10 * 15; - break; - } - - client.getTextureManager().bindTexture(LambdaControls.CONTROLLER_BUTTONS); - GlStateManager.disableDepthTest(); - - GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - DrawableHelper.blit(x, y, (float) button_offset, (float) (controller_type * 15), 15, 15, 256, 256); - GlStateManager.enableDepthTest(); + int button_width = draw_button(x, y, button, client); int text_y = (15 - client.textRenderer.fontHeight) / 2; - client.textRenderer.drawWithShadow(translated_action, (float) (x + 15 + 5), (float) (y + text_y), 14737632); + client.textRenderer.drawWithShadow(translated_action, (float) (x + button_width + 5), (float) (y + text_y), 14737632); } return display ? get_button_tip_width(translated_action, client.textRenderer) : -10; diff --git a/src/main/java/me/lambdaurora/lambdacontrols/gui/AbstractIconButtonWidget.java b/src/main/java/me/lambdaurora/lambdacontrols/gui/AbstractIconButtonWidget.java new file mode 100644 index 0000000..65c35cb --- /dev/null +++ b/src/main/java/me/lambdaurora/lambdacontrols/gui/AbstractIconButtonWidget.java @@ -0,0 +1,55 @@ +/* + * Copyright © 2019 LambdAurora + * + * This file is part of LambdaControls. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package me.lambdaurora.lambdacontrols.gui; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.util.math.MathHelper; +import org.jetbrains.annotations.NotNull; + +/** + * Represents a button with an icon instead of text. + */ +public abstract class AbstractIconButtonWidget extends ButtonWidget +{ + private int icon_size = 0; + + public AbstractIconButtonWidget(int x, int y, int width, int height, @NotNull String message, @NotNull PressAction on_press) + { + super(x, y, width, height, message, on_press); + } + + protected abstract int render_icon(int mouse_x, int mouse_y, float delta, int x, int y); + + @Override + public void renderButton(int mouse_x, int mouse_y, float delta) + { + MinecraftClient client = MinecraftClient.getInstance(); + client.getTextureManager().bindTexture(WIDGETS_LOCATION); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); + int i = this.getYImage(this.isHovered()); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); + this.blit(this.x, this.y, 0, 46 + i * 20, this.width / 2, this.height); + this.blit(this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + i * 20, this.width / 2, this.height); + this.renderBg(client, mouse_x, mouse_y); + + this.icon_size = this.render_icon(mouse_x, mouse_y, delta, this.x + 4, this.y + (this.height / 2 - this.icon_size / 2)); + + if (!this.getMessage().isEmpty()) { + int j = this.active ? 16777215 : 10526880; + this.drawCenteredString(client.textRenderer, this.getMessage(), this.x + 8 + this.icon_size + (this.width - 8 - this.icon_size - 6) / 2, + this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); + } + } +} diff --git a/src/main/java/me/lambdaurora/lambdacontrols/gui/ControllerButtonWidget.java b/src/main/java/me/lambdaurora/lambdacontrols/gui/ControllerButtonWidget.java new file mode 100644 index 0000000..206c5d2 --- /dev/null +++ b/src/main/java/me/lambdaurora/lambdacontrols/gui/ControllerButtonWidget.java @@ -0,0 +1,40 @@ +/* + * Copyright © 2019 LambdAurora + * + * This file is part of LambdaControls. + * + * Licensed under the MIT license. For more information, + * see the LICENSE file. + */ + +package me.lambdaurora.lambdacontrols.gui; + +import me.lambdaurora.lambdacontrols.ButtonBinding; +import me.lambdaurora.lambdacontrols.LambdaControls; +import net.minecraft.client.MinecraftClient; +import org.jetbrains.annotations.NotNull; + +/** + * Represents a controller button widget. + */ +public class ControllerButtonWidget extends AbstractIconButtonWidget +{ + private ButtonBinding binding; + + public ControllerButtonWidget(int x, int y, int width, @NotNull ButtonBinding button_binding, @NotNull PressAction on_press) + { + super(x, y, width, 20, ButtonBinding.get_localized_button_name(button_binding.get_button()), on_press); + this.binding = button_binding; + } + + public void update() + { + this.setMessage(ButtonBinding.get_localized_button_name(binding.get_button())); + } + + @Override + protected int render_icon(int mouse_x, int mouse_y, float delta, int x, int y) + { + return LambdaControls.draw_button(x, y, this.binding, MinecraftClient.getInstance()); + } +} diff --git a/src/main/java/me/lambdaurora/lambdacontrols/gui/ControlsListWidget.java b/src/main/java/me/lambdaurora/lambdacontrols/gui/ControlsListWidget.java index 309e28e..2ba5dc5 100644 --- a/src/main/java/me/lambdaurora/lambdacontrols/gui/ControlsListWidget.java +++ b/src/main/java/me/lambdaurora/lambdacontrols/gui/ControlsListWidget.java @@ -36,7 +36,7 @@ public class ControlsListWidget extends ElementListWidget gui.focused_binding = binding) + this.edit_button = new ControllerButtonWidget(0, 0, 90, this.binding, btn -> gui.focused_binding = binding) { protected String getNarrationMessage() { @@ -107,16 +107,16 @@ public class ControlsListWidget extends ElementListWidget " + Formatting.YELLOW + this.edit_button.getMessage() + Formatting.WHITE + " <"); diff --git a/src/main/java/me/lambdaurora/lambdacontrols/mixin/SettingsScreenMixin.java b/src/main/java/me/lambdaurora/lambdacontrols/mixin/SettingsScreenMixin.java index c614eb5..1a7020e 100644 --- a/src/main/java/me/lambdaurora/lambdacontrols/mixin/SettingsScreenMixin.java +++ b/src/main/java/me/lambdaurora/lambdacontrols/mixin/SettingsScreenMixin.java @@ -12,6 +12,7 @@ package me.lambdaurora.lambdacontrols.mixin; import me.lambdaurora.lambdacontrols.gui.LambdaControlsSettingsScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.SettingsScreen; +import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.options.GameOptions; import net.minecraft.client.resource.language.I18n; @@ -21,6 +22,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** @@ -38,16 +40,10 @@ public class SettingsScreenMixin extends Screen super(title); } - @Inject(method = "init", at = @At("RETURN")) - private void on_init(CallbackInfo ci) + @Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SettingsScreen;addButton(Lnet/minecraft/client/gui/widget/AbstractButtonWidget;)Lnet/minecraft/client/gui/widget/AbstractButtonWidget;", ordinal = 7)) + private AbstractButtonWidget on_init(SettingsScreen screen, AbstractButtonWidget btn) { - this.buttons.stream().filter(button -> button.getMessage().equals(I18n.translate("options.controls"))) - .findFirst() - .ifPresent(btn -> { - this.buttons.remove(btn); - this.children.remove(btn); - this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).get_height(), btn.getMessage(), - b -> this.minecraft.openScreen(new LambdaControlsSettingsScreen(this, this.settings)))); - }); + return this.addButton(new ButtonWidget(btn.x, btn.y, btn.getWidth(), ((AbstractButtonWidgetAccessor) btn).get_height(), btn.getMessage(), + b -> this.minecraft.openScreen(new LambdaControlsSettingsScreen(this, this.settings)))); } } diff --git a/src/main/resources/assets/lambdacontrols/textures/gui/controller_axis.png b/src/main/resources/assets/lambdacontrols/textures/gui/controller_axis.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc6a5985484ff06e8f5437f743808b06a01f52b GIT binary patch literal 5987 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 PEx=IM6jpxo-qZg9>ojC| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/lambdacontrols/textures/gui/widgets.png b/src/main/resources/assets/lambdacontrols/textures/gui/widgets.png index f684d6ade1e8ac4f6da334cb0fbec91385b63172..b4e48addc7925e3220d4f155579c7d1e957c51ca 100644 GIT binary patch literal 13435 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