parent
e83075b5f1
commit
97457ab027
@ -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.TranslatableComponent
|
||||||
import ru.dbotthepony.mc.otm.core.formatMatterLevel
|
import ru.dbotthepony.mc.otm.core.formatMatterLevel
|
||||||
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
|
import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget
|
||||||
|
import kotlin.math.absoluteValue
|
||||||
import kotlin.math.cos
|
import kotlin.math.cos
|
||||||
|
import kotlin.math.pow
|
||||||
import kotlin.math.sin
|
import kotlin.math.sin
|
||||||
|
|
||||||
open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
|
open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
|
||||||
@ -30,6 +32,12 @@ open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
|
|||||||
scissor = true
|
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<Component> {
|
protected open fun makeTooltip(): MutableList<Component> {
|
||||||
return mutableListOf(
|
return mutableListOf(
|
||||||
TranslatableComponent(
|
TranslatableComponent(
|
||||||
@ -41,43 +49,61 @@ open class MatterGaugePanel<S : Screen> @JvmOverloads constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) {
|
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)
|
GAUGE_BACKGROUND.render(stack)
|
||||||
val height = this.height * (1f - widget.percentage())
|
val height = this.height * (1f - widget.percentage())
|
||||||
|
|
||||||
RenderSystem.setShader(GameRenderer::getPositionTexShader)
|
if (widget.percentage() > 0.01f) {
|
||||||
RenderSystem.enableTexture()
|
RenderSystem.setShader(GameRenderer::getPositionTexShader)
|
||||||
RenderSystem.enableBlend()
|
RenderSystem.enableTexture()
|
||||||
RenderSystem.defaultBlendFunc()
|
RenderSystem.enableBlend()
|
||||||
RenderSystem.depthFunc(GL11.GL_ALWAYS)
|
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 u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth
|
||||||
val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.width) / 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 v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.height) / GAUGE_FOREGROUND.imageHeight
|
||||||
|
|
||||||
val matrix = stack.last().pose()
|
val matrix = stack.last().pose()
|
||||||
val builder = tesselator.builder
|
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, 0f, this.height, 0f).uv(u0, v1).endVertex()
|
||||||
builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex()
|
builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex()
|
||||||
|
|
||||||
for (i in 4 downTo 0) {
|
for (i in 4 downTo 0) {
|
||||||
val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat()
|
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()
|
val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() * wavesStrength.coerceAtMost(4f)
|
||||||
|
|
||||||
val thisX = (width * (i / 4f))
|
val thisX = (width * (i / 4f))
|
||||||
val thisY = (height + sin + cos).coerceAtLeast(0f)
|
val thisY = (height + sin + cos).coerceAtLeast(0f)
|
||||||
|
|
||||||
builder.vertex(matrix, thisX, thisY, 0f).uv(
|
builder.vertex(matrix, thisX, thisY, 0f).uv(
|
||||||
(GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth,
|
(GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.width) / GAUGE_FOREGROUND.imageWidth,
|
||||||
(GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight,
|
(GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight,
|
||||||
).endVertex()
|
).endVertex()
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferUploader.drawWithShader(builder.end())
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferUploader.drawWithShader(builder.end())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun innerRenderTooltips(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float): Boolean {
|
override fun innerRenderTooltips(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float): Boolean {
|
||||||
|
Loading…
Reference in New Issue
Block a user