From 97457ab0279a2273e382ecd52cc95b7df4bd6a88 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 17 Sep 2022 14:42:39 +0700 Subject: [PATCH] Make matter gauge panel more fun to interact with Fixes #16 Fixes #20 --- .../client/screen/widget/MatterGaugePanel.kt | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt index a2c403ca0..076705614 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt @@ -16,7 +16,9 @@ import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.formatMatterLevel import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget +import kotlin.math.absoluteValue import kotlin.math.cos +import kotlin.math.pow import kotlin.math.sin open class MatterGaugePanel @JvmOverloads constructor( @@ -30,6 +32,12 @@ open class MatterGaugePanel @JvmOverloads constructor( scissor = true } + private var wavesStrength = 0.5f + private var lastAbsoluteX = 0f + private var lastAbsoluteY = 0f + private var lastDraw = System.nanoTime() + private var lastLevel = 0f + protected open fun makeTooltip(): MutableList { return mutableListOf( TranslatableComponent( @@ -41,43 +49,61 @@ open class MatterGaugePanel @JvmOverloads constructor( } override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + if (lastAbsoluteX == 0f && lastAbsoluteY == 0f) { + lastAbsoluteX = absoluteX + lastAbsoluteY = absoluteY + lastDraw = System.nanoTime() + lastLevel = widget.percentage() + } else { + val diff = ((lastAbsoluteX - absoluteX).pow(2f) + (lastAbsoluteY - absoluteY).pow(2f)).pow(0.5f) / 10f + (lastLevel - widget.percentage()).absoluteValue * 1.5f + + lastAbsoluteX = absoluteX + lastAbsoluteY = absoluteY + + wavesStrength = (wavesStrength + diff - (System.nanoTime() - lastDraw) / 400_000_000f).coerceAtLeast(0.5f).coerceAtMost(16f) + lastDraw = System.nanoTime() + lastLevel = widget.percentage() + } + GAUGE_BACKGROUND.render(stack) val height = this.height * (1f - widget.percentage()) - RenderSystem.setShader(GameRenderer::getPositionTexShader) - RenderSystem.enableTexture() - RenderSystem.enableBlend() - RenderSystem.defaultBlendFunc() - RenderSystem.depthFunc(GL11.GL_ALWAYS) + if (widget.percentage() > 0.01f) { + RenderSystem.setShader(GameRenderer::getPositionTexShader) + RenderSystem.enableTexture() + RenderSystem.enableBlend() + RenderSystem.defaultBlendFunc() + RenderSystem.depthFunc(GL11.GL_ALWAYS) - RenderSystem.setShaderColor(1f, 1f, 1f, 1f) + RenderSystem.setShaderColor(1f, 1f, 1f, 1f) - val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth - val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth - val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.height) / GAUGE_FOREGROUND.imageHeight + val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth + val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth + val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.height) / GAUGE_FOREGROUND.imageHeight - val matrix = stack.last().pose() - val builder = tesselator.builder + val matrix = stack.last().pose() + val builder = tesselator.builder - builder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_TEX) + builder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_TEX) - builder.vertex(matrix, 0f, this.height, 0f).uv(u0, v1).endVertex() - builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex() + builder.vertex(matrix, 0f, this.height, 0f).uv(u0, v1).endVertex() + builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex() - for (i in 4 downTo 0) { - val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat() - val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() + for (i in 4 downTo 0) { + val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat() * wavesStrength.coerceAtMost(4f) + val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() * wavesStrength.coerceAtMost(4f) - val thisX = (width * (i / 4f)) - val thisY = (height + sin + cos).coerceAtLeast(0f) + val thisX = (width * (i / 4f)) + val thisY = (height + sin + cos).coerceAtLeast(0f) - builder.vertex(matrix, thisX, thisY, 0f).uv( - (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth, - (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, - ).endVertex() + builder.vertex(matrix, thisX, thisY, 0f).uv( + (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth, + (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, + ).endVertex() + } + + BufferUploader.drawWithShader(builder.end()) } - - BufferUploader.drawWithShader(builder.end()) } override fun innerRenderTooltips(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float): Boolean {