From 3a24eb80f328ec55cb4587e712a6f0c02dfa5c89 Mon Sep 17 00:00:00 2001 From: nea Date: Thu, 1 Jun 2023 22:38:09 +0200 Subject: Add WBar --- src/main/kotlin/moe/nea/firmament/Firmament.kt | 3 + src/main/kotlin/moe/nea/firmament/gui/WBar.kt | 69 ++++++++++++++++++++++ .../moe/nea/firmament/util/colorconversion.kt | 6 ++ 3 files changed, 78 insertions(+) create mode 100644 src/main/kotlin/moe/nea/firmament/gui/WBar.kt create mode 100644 src/main/kotlin/moe/nea/firmament/util/colorconversion.kt (limited to 'src/main/kotlin/moe/nea/firmament') diff --git a/src/main/kotlin/moe/nea/firmament/Firmament.kt b/src/main/kotlin/moe/nea/firmament/Firmament.kt index b3e2115..6132d3b 100644 --- a/src/main/kotlin/moe/nea/firmament/Firmament.kt +++ b/src/main/kotlin/moe/nea/firmament/Firmament.kt @@ -49,6 +49,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json import kotlin.coroutines.EmptyCoroutineContext import net.minecraft.command.CommandRegistryAccess +import net.minecraft.util.Identifier import moe.nea.firmament.commands.registerFirmamentCommand import moe.nea.firmament.dbus.FirmamentDbusObject import moe.nea.firmament.features.FeatureManager @@ -129,4 +130,6 @@ object Firmament : ModInitializer, ClientModInitializer { }) } + + fun identifier(path: String) = Identifier(MOD_ID, path) } diff --git a/src/main/kotlin/moe/nea/firmament/gui/WBar.kt b/src/main/kotlin/moe/nea/firmament/gui/WBar.kt new file mode 100644 index 0000000..879805d --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/gui/WBar.kt @@ -0,0 +1,69 @@ +package moe.nea.firmament.gui + +import io.github.cottonmc.cotton.gui.client.ScreenDrawing +import io.github.cottonmc.cotton.gui.widget.WWidget +import io.github.cottonmc.cotton.gui.widget.data.Texture +import me.shedaniel.math.Color +import net.minecraft.client.util.math.MatrixStack +import moe.nea.firmament.Firmament + +data class WBar( + var progress: Double, + val total: Double, + val fillColor: Color, + val emptyColor: Color, +) : WWidget() { + val resource = Firmament.identifier("textures/gui/bar.png") + val left = Texture(resource, 0 / 64F, 0 / 64F, 4 / 64F, 8 / 64F) + val middle = Texture(resource, 4 / 64F, 0 / 64F, 4 / 64F, 8 / 64F) + val right = Texture(resource, 8 / 64F, 0 / 64F, 4 / 64F, 8 / 64F) + val segmentOverlay = Texture(resource, 12 / 64F, 0 / 64F, 15 / 64F, 8 / 64F) + + override fun canResize(): Boolean { + return true + } + + private fun drawSection( + matrices: MatrixStack, + texture: Texture, + x: Int, + y: Int, + width: Int, + sectionStart: Double, + sectionEnd: Double + ) { + if (sectionEnd < progress && width == 4) { + ScreenDrawing.texturedRect(matrices, x, y, 4, 8, texture, fillColor.color) + return + } + if (sectionStart > progress && width == 4) { + ScreenDrawing.texturedRect(matrices, x, y, 4, 8, texture, emptyColor.color) + return + } + val increasePerPixel = (sectionEnd - sectionStart / 4) + var valueAtPixel = sectionStart + for (i in (0 until width)) { + ScreenDrawing.texturedRect( + matrices, x + i, y, 1, 8, + texture.image, texture.u1 + i / 64F, texture.v1, texture.u1 + (i + 1) / 64F, texture.v2, + if (valueAtPixel < progress) fillColor.color else emptyColor.color + ) + valueAtPixel += increasePerPixel + } + } + + override fun paint(matrices: MatrixStack, x: Int, y: Int, mouseX: Int, mouseY: Int) { + var i = 0 + while (i < width - 4) { + drawSection( + matrices, + if (i == 0) left else middle, + x + i, y, + (width - (i + 4)).coerceAtMost(4), + i * total / width, (i + 4) * total / width + ) + i += 4 + } + drawSection(matrices, right, x + width - 4, y, 4, (width - 4) * total / width, total) + } +} diff --git a/src/main/kotlin/moe/nea/firmament/util/colorconversion.kt b/src/main/kotlin/moe/nea/firmament/util/colorconversion.kt new file mode 100644 index 0000000..c19eefa --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/util/colorconversion.kt @@ -0,0 +1,6 @@ +package moe.nea.firmament.util + +import net.minecraft.util.DyeColor + +fun DyeColor.toShedaniel(): me.shedaniel.math.Color = + me.shedaniel.math.Color.ofOpaque(this.signColor) -- cgit