From f844feba1b874a946f020574fee06c5926d042f8 Mon Sep 17 00:00:00 2001 From: nea Date: Wed, 3 May 2023 01:39:27 +0200 Subject: Make proper use of matrixstack for block highlights --- .../moe/nea/notenoughupdates/util/render/block.kt | 96 +++++++++++----------- 1 file changed, 50 insertions(+), 46 deletions(-) (limited to 'src/main/kotlin/moe/nea/notenoughupdates/util') diff --git a/src/main/kotlin/moe/nea/notenoughupdates/util/render/block.kt b/src/main/kotlin/moe/nea/notenoughupdates/util/render/block.kt index 9a02996..487a264 100644 --- a/src/main/kotlin/moe/nea/notenoughupdates/util/render/block.kt +++ b/src/main/kotlin/moe/nea/notenoughupdates/util/render/block.kt @@ -1,6 +1,7 @@ package moe.nea.notenoughupdates.util.render import com.mojang.blaze3d.systems.RenderSystem +import org.joml.Matrix4f import net.minecraft.client.gl.VertexBuffer import net.minecraft.client.render.BufferBuilder import net.minecraft.client.render.Camera @@ -8,77 +9,80 @@ import net.minecraft.client.render.GameRenderer import net.minecraft.client.render.Tessellator import net.minecraft.client.render.VertexFormat import net.minecraft.client.render.VertexFormats +import net.minecraft.client.util.math.MatrixStack import net.minecraft.util.math.BlockPos -import net.minecraft.util.math.Vec3d -class RenderBlockContext(val tesselator: Tessellator, val camPos: Vec3d) { - val buffer = tesselator.buffer +class RenderBlockContext(private val tesselator: Tessellator, private val matrixStack: MatrixStack) { + private val buffer = tesselator.buffer fun color(red: Float, green: Float, blue: Float, alpha: Float) { RenderSystem.setShaderColor(red, green, blue, alpha) } fun block(blockPos: BlockPos) { - val matrixStack = RenderSystem.getModelViewStack() matrixStack.push() - matrixStack.translate(blockPos.x - camPos.x, blockPos.y - camPos.y, blockPos.z - camPos.z) - RenderSystem.applyModelViewMatrix() + matrixStack.translate(blockPos.x.toFloat(), blockPos.y.toFloat(), blockPos.z.toFloat()) RenderSystem.setShader(GameRenderer::getPositionColorProgram) - buildCube(buffer) + buildCube(matrixStack.peek().positionMatrix, buffer) tesselator.draw() matrixStack.pop() } companion object { - fun buildCube(buf: BufferBuilder) { + private fun buildCube(matrix: Matrix4f, buf: BufferBuilder) { buf.begin(VertexFormat.DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR) buf.fixedColor(255, 255, 255, 255) - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(0.0, 0.0, 1.0).next() - buf.vertex(0.0, 1.0, 1.0).next() - buf.vertex(1.0, 1.0, 0.0).next() - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(0.0, 1.0, 0.0).next() - buf.vertex(1.0, 0.0, 1.0).next() - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(1.0, 0.0, 0.0).next() - buf.vertex(1.0, 1.0, 0.0).next() - buf.vertex(1.0, 0.0, 0.0).next() - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(0.0, 1.0, 1.0).next() - buf.vertex(0.0, 1.0, 0.0).next() - buf.vertex(1.0, 0.0, 1.0).next() - buf.vertex(0.0, 0.0, 1.0).next() - buf.vertex(0.0, 0.0, 0.0).next() - buf.vertex(0.0, 1.0, 1.0).next() - buf.vertex(0.0, 0.0, 1.0).next() - buf.vertex(1.0, 0.0, 1.0).next() - buf.vertex(1.0, 1.0, 1.0).next() - buf.vertex(1.0, 0.0, 0.0).next() - buf.vertex(1.0, 1.0, 0.0).next() - buf.vertex(1.0, 0.0, 0.0).next() - buf.vertex(1.0, 1.0, 1.0).next() - buf.vertex(1.0, 0.0, 1.0).next() - buf.vertex(1.0, 1.0, 1.0).next() - buf.vertex(1.0, 1.0, 0.0).next() - buf.vertex(0.0, 1.0, 0.0).next() - buf.vertex(1.0, 1.0, 1.0).next() - buf.vertex(0.0, 1.0, 0.0).next() - buf.vertex(0.0, 1.0, 1.0).next() - buf.vertex(1.0, 1.0, 1.0).next() - buf.vertex(0.0, 1.0, 1.0).next() - buf.vertex(1.0, 0.0, 1.0).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 0.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 0.0F, 1.0F, 1.0F).next() + buf.vertex(matrix, 1.0F, 0.0F, 1.0F).next() buf.unfixColor() } - fun renderBlocks(camera: Camera, block: RenderBlockContext. () -> Unit) { + fun renderBlocks(matrices: MatrixStack, camera: Camera, block: RenderBlockContext. () -> Unit) { RenderSystem.disableDepthTest() RenderSystem.enableBlend() RenderSystem.defaultBlendFunc() - val ctx = RenderBlockContext(Tessellator.getInstance(), camera.pos) + matrices.push() + matrices.translate(-camera.pos.x, -camera.pos.y, -camera.pos.z) + + val ctx = RenderBlockContext(Tessellator.getInstance(), matrices) block(ctx) + matrices.pop() + VertexBuffer.unbind() RenderSystem.enableDepthTest() RenderSystem.disableBlend() -- cgit