From ab49f89977c19cc8eba7911c073a9d74ede1eadf Mon Sep 17 00:00:00 2001 From: J10a1n15 <45315647+j10a1n15@users.noreply.github.com> Date: Tue, 30 Apr 2024 19:12:23 +0200 Subject: Improvement: Better Alignment + Outline Improvement in Custom Scoreboard (#1566) Co-authored-by: CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> --- .../skyhanni/config/ConfigUpdaterMigrator.kt | 2 +- .../gui/customscoreboard/AlignmentConfig.java | 20 ++-- .../gui/customscoreboard/CustomScoreboard.kt | 31 ++++++- .../gui/customscoreboard/RenderBackground.kt | 103 ++++++++++++++------- .../at/hannibal2/skyhanni/utils/RenderUtils.kt | 18 ++-- .../skyhanni/utils/renderables/RenderableUtils.kt | 2 + 6 files changed, 121 insertions(+), 55 deletions(-) (limited to 'src/main/java/at') diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt index 9a08a2385..faeab5a00 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt @@ -12,7 +12,7 @@ import com.google.gson.JsonPrimitive object ConfigUpdaterMigrator { val logger = LorenzLogger("ConfigMigration") - const val CONFIG_VERSION = 42 + const val CONFIG_VERSION = 43 fun JsonElement.at(chain: List, init: Boolean): JsonElement? { if (chain.isEmpty()) return this if (this !is JsonObject) return null diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/AlignmentConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/AlignmentConfig.java index b63db9b51..0b62bfcbc 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/AlignmentConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/gui/customscoreboard/AlignmentConfig.java @@ -1,20 +1,20 @@ package at.hannibal2.skyhanni.config.features.gui.customscoreboard; +import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment; +import at.hannibal2.skyhanni.utils.RenderUtils.VerticalAlignment; import com.google.gson.annotations.Expose; -import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; public class AlignmentConfig { - // TODO: Switch to Dropdowns with multiple different alignment ways in the future - // Horizontal: Left, Center, Right - // Vertical: Top, Center, Bottom + @Expose - @ConfigOption(name = "Align to the right", desc = "Align the scoreboard to the right side of the screen.") - @ConfigEditorBoolean - public boolean alignRight = true; + @ConfigOption(name = "Horizontal Alignment", desc = "Alignment for the scoreboard on the horizontal axis.") + @ConfigEditorDropdown + public HorizontalAlignment horizontalAlignment = HorizontalAlignment.RIGHT; @Expose - @ConfigOption(name = "Align to the center vertically", desc = "Align the scoreboard to the center of the screen vertically.") - @ConfigEditorBoolean - public boolean alignCenterVertically = true; + @ConfigOption(name = "Vertical Alignment", desc = "Alignment for the scoreboard on the vertical axis.") + @ConfigEditorDropdown + public VerticalAlignment verticalAlignment = VerticalAlignment.CENTER; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/CustomScoreboard.kt b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/CustomScoreboard.kt index 4182b37bb..7dca6c1b4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/CustomScoreboard.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/CustomScoreboard.kt @@ -30,6 +30,7 @@ import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.ConditionalUtils.onToggle import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.HorizontalAlignment +import at.hannibal2.skyhanni.utils.RenderUtils.VerticalAlignment import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAlignedWidth import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase import at.hannibal2.skyhanni.utils.TabListData @@ -70,10 +71,14 @@ class CustomScoreboard { @SubscribeEvent fun onGuiPositionMoved(event: GuiPositionMovedEvent) { if (event.guiName == guiName) { - if (alignmentConfig.alignRight || alignmentConfig.alignCenterVertically) { - alignmentConfig.alignRight = false - alignmentConfig.alignCenterVertically = false - ChatUtils.chat("Disabled Custom Scoreboard auto-alignment.") + with(alignmentConfig) { + if (horizontalAlignment != HorizontalAlignment.DONT_ALIGN + || verticalAlignment != VerticalAlignment.DONT_ALIGN + ) { + horizontalAlignment = HorizontalAlignment.DONT_ALIGN + verticalAlignment = VerticalAlignment.DONT_ALIGN + ChatUtils.chat("Disabled Custom Scoreboard auto-alignment.") + } } } } @@ -248,5 +253,23 @@ class CustomScoreboard { newArray } + event.move(43, "$displayPrefix.alignment.alignRight", "$displayPrefix.alignment.horizontalAlignment") { + JsonPrimitive( + if (it.asBoolean) { + HorizontalAlignment.RIGHT.name + } else { + HorizontalAlignment.DONT_ALIGN.name + } + ) + } + event.move(43, "$displayPrefix.alignment.alignCenterVertically", "$displayPrefix.alignment.verticalAlignment") { + JsonPrimitive( + if (it.asBoolean) { + VerticalAlignment.CENTER.name + } else { + VerticalAlignment.DONT_ALIGN.name + } + ) + } } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/RenderBackground.kt b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/RenderBackground.kt index 2454946f5..c2de6152c 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/RenderBackground.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/RenderBackground.kt @@ -15,6 +15,7 @@ import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 class RenderBackground { + fun renderBackground() { val alignmentConfig = CustomScoreboard.alignmentConfig val backgroundConfig = CustomScoreboard.backgroundConfig @@ -28,29 +29,12 @@ class RenderBackground { val elementWidth = position.getDummySize().x val elementHeight = position.getDummySize().y - val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth - val scaledHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight - // Update the position to the alignment options if ( - alignmentConfig.alignRight - || alignmentConfig.alignCenterVertically + alignmentConfig.horizontalAlignment != RenderUtils.HorizontalAlignment.DONT_ALIGN + || alignmentConfig.verticalAlignment != RenderUtils.VerticalAlignment.DONT_ALIGN ) { - var newX = if (alignmentConfig.alignRight) scaledWidth - elementWidth - (border * 2) else x - val newY = if (alignmentConfig.alignCenterVertically) scaledHeight / 2 - elementHeight / 2 else y - - if (outlineConfig.enabled) { - newX -= outlineConfig.thickness / 2 - } - - position.set( - Position( - newX, - newY, - position.getScale(), - position.isCenter - ) - ) + position.set(updatePosition(position)) } if (GuiEditManager.isInGui()) return @@ -82,23 +66,76 @@ class RenderBackground { backgroundConfig.color.toChromaColor().rgb, backgroundConfig.roundedCornerSmoothness ) - if (outlineConfig.enabled) { - RenderUtils.drawRoundRectOutline( - x - border, - y - border, - elementWidth + border * 3, - elementHeight + border * 2, - outlineConfig.colorTop.toChromaColor().rgb, - outlineConfig.colorBottom.toChromaColor().rgb, - outlineConfig.thickness, - backgroundConfig.roundedCornerSmoothness, - outlineConfig.blur - ) - } + } + if (outlineConfig.enabled) { + RenderUtils.drawRoundRectOutline( + x - border, + y - border, + elementWidth + border * 3, + elementHeight + border * 2, + outlineConfig.colorTop.toChromaColor().rgb, + outlineConfig.colorBottom.toChromaColor().rgb, + outlineConfig.thickness, + backgroundConfig.roundedCornerSmoothness, + outlineConfig.blur + ) } } GL11.glDepthMask(true) GlStateManager.popMatrix() GlStateManager.popAttrib() } + + private fun updatePosition(position: Position): Position { + val alignmentConfig = CustomScoreboard.alignmentConfig + val backgroundConfig = CustomScoreboard.backgroundConfig + val outlineConfig = backgroundConfig.outline + val border = backgroundConfig.borderSize + + val x = position.getAbsX() + val y = position.getAbsY() + + val elementWidth = position.getDummySize().x + val elementHeight = position.getDummySize().y + + val scaledWidth = ScaledResolution(Minecraft.getMinecraft()).scaledWidth + val scaledHeight = ScaledResolution(Minecraft.getMinecraft()).scaledHeight + + + var newX = when (alignmentConfig.horizontalAlignment) { + RenderUtils.HorizontalAlignment.LEFT -> border + RenderUtils.HorizontalAlignment.CENTER -> scaledWidth / 2 - (elementWidth + border * 3) / 2 + RenderUtils.HorizontalAlignment.RIGHT -> scaledWidth - (elementWidth + border * 2) + else -> x + } + + var newY = when (alignmentConfig.verticalAlignment) { + RenderUtils.VerticalAlignment.TOP -> border + RenderUtils.VerticalAlignment.CENTER -> scaledHeight / 2 - (elementHeight + border * 2) / 2 + RenderUtils.VerticalAlignment.BOTTOM -> scaledHeight - elementHeight - border + else -> y + } + + if (outlineConfig.enabled) { + val thickness = outlineConfig.thickness + if (alignmentConfig.horizontalAlignment == RenderUtils.HorizontalAlignment.RIGHT) { + newX -= thickness / 2 + } else if (alignmentConfig.horizontalAlignment == RenderUtils.HorizontalAlignment.LEFT) { + newX += thickness / 2 + } + + if (alignmentConfig.verticalAlignment == RenderUtils.VerticalAlignment.TOP) { + newY += thickness / 2 + } else if (alignmentConfig.verticalAlignment == RenderUtils.VerticalAlignment.BOTTOM) { + newY -= thickness / 2 + } + } + + return Position( + newX, + newY, + position.getScale(), + position.isCenter + ) + } } diff --git a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt index b89850608..3de627f50 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/RenderUtils.kt @@ -47,17 +47,20 @@ object RenderUtils { LEFT("Left"), CENTER("Center"), RIGHT("Right"), + DONT_ALIGN("Don't Align"), ; - override fun toString(): String { - return value - } + override fun toString() = value } - enum class VerticalAlignment { - TOP, - CENTER, - BOTTOM, + enum class VerticalAlignment(private val value: String) { + TOP("Top"), + CENTER("Center"), + BOTTOM("Bottom"), + DONT_ALIGN("Don't Align"), + ; + + override fun toString() = value } private val beaconBeam = ResourceLocation("textures/entity/beacon_beam.png") @@ -497,6 +500,7 @@ object RenderUtils { HorizontalAlignment.LEFT -> offsetX.toFloat() HorizontalAlignment.CENTER -> offsetX + width / 2f - strLen / 2f HorizontalAlignment.RIGHT -> offsetX + width - strLen.toFloat() + else -> offsetX.toFloat() } GL11.glTranslatef(x2, 0f, 0f) renderer.drawStringWithShadow(display, 0f, 0f, 0) diff --git a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt index 4af54b09f..e1f93574e 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/renderables/RenderableUtils.kt @@ -35,12 +35,14 @@ internal object RenderableUtils { HorizontalAlignment.LEFT -> 0 HorizontalAlignment.CENTER -> (xSpace - renderable.width) / 2 HorizontalAlignment.RIGHT -> xSpace - renderable.width + else -> 0 } private fun calculateAlignmentYOffset(renderable: Renderable, ySpace: Int) = when (renderable.verticalAlign) { VerticalAlignment.TOP -> 0 VerticalAlignment.CENTER -> (ySpace - renderable.height) / 2 VerticalAlignment.BOTTOM -> ySpace - renderable.height + else -> 0 } fun Renderable.renderXYAligned(posX: Int, posY: Int, xSpace: Int, ySpace: Int) { -- cgit