Add lines to world renderer

This commit is contained in:
nea
2023-06-12 00:19:32 +02:00
parent 74e79759bf
commit a74a2fb1d5
2 changed files with 67 additions and 6 deletions

View File

@@ -21,15 +21,16 @@ package moe.nea.firmament.features.world
import io.github.moulberry.repo.data.Coordinate import io.github.moulberry.repo.data.Coordinate
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.serializer import kotlinx.serialization.serializer
import net.minecraft.util.math.Direction
import moe.nea.firmament.events.ServerChatLineReceivedEvent import moe.nea.firmament.events.ServerChatLineReceivedEvent
import moe.nea.firmament.events.SkyblockServerUpdateEvent import moe.nea.firmament.events.SkyblockServerUpdateEvent
import moe.nea.firmament.events.WorldRenderLastEvent import moe.nea.firmament.events.WorldRenderLastEvent
import moe.nea.firmament.features.FirmamentFeature import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC import moe.nea.firmament.util.MC
import moe.nea.firmament.util.SBData import moe.nea.firmament.util.SBData
import moe.nea.firmament.util.blockPos import moe.nea.firmament.util.blockPos
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.util.data.ProfileSpecificDataHolder import moe.nea.firmament.util.data.ProfileSpecificDataHolder
import moe.nea.firmament.util.render.RenderInWorldContext.Companion.renderInWorld import moe.nea.firmament.util.render.RenderInWorldContext.Companion.renderInWorld
import moe.nea.firmament.util.unformattedString import moe.nea.firmament.util.unformattedString
@@ -132,6 +133,10 @@ object FairySouls : FirmamentFeature {
currentMissingSouls.forEach { currentMissingSouls.forEach {
block(it.blockPos) block(it.blockPos)
} }
color(1f, 0f, 1f, 1f)
currentLocationSouls.forEach {
wireframeCube(it.blockPos)
}
} }
} }
} }

View File

@@ -19,7 +19,9 @@
package moe.nea.firmament.util.render package moe.nea.firmament.util.render
import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.systems.RenderSystem
import java.lang.Math.pow
import org.joml.Matrix4f import org.joml.Matrix4f
import org.joml.Vector3f
import net.minecraft.client.gl.VertexBuffer import net.minecraft.client.gl.VertexBuffer
import net.minecraft.client.render.BufferBuilder import net.minecraft.client.render.BufferBuilder
import net.minecraft.client.render.Camera import net.minecraft.client.render.Camera
@@ -28,10 +30,15 @@ import net.minecraft.client.render.Tessellator
import net.minecraft.client.render.VertexFormat import net.minecraft.client.render.VertexFormat
import net.minecraft.client.render.VertexFormats import net.minecraft.client.render.VertexFormats
import net.minecraft.client.util.math.MatrixStack import net.minecraft.client.util.math.MatrixStack
import net.minecraft.client.util.math.MatrixStack.Entry
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d import net.minecraft.util.math.Vec3d
class RenderInWorldContext private constructor(private val tesselator: Tessellator, private val matrixStack: MatrixStack) { class RenderInWorldContext private constructor(
private val tesselator: Tessellator,
private val matrixStack: MatrixStack,
private val camera: Camera
) {
private val buffer = tesselator.buffer private val buffer = tesselator.buffer
fun color(red: Float, green: Float, blue: Float, alpha: Float) { fun color(red: Float, green: Float, blue: Float, alpha: Float) {
@@ -39,6 +46,7 @@ class RenderInWorldContext private constructor(private val tesselator: Tessellat
} }
fun block(blockPos: BlockPos) { fun block(blockPos: BlockPos) {
RenderSystem.setShader(GameRenderer::getPositionColorProgram)
matrixStack.push() matrixStack.push()
matrixStack.translate(blockPos.x.toFloat(), blockPos.y.toFloat(), blockPos.z.toFloat()) matrixStack.translate(blockPos.x.toFloat(), blockPos.y.toFloat(), blockPos.z.toFloat())
buildCube(matrixStack.peek().positionMatrix, buffer) buildCube(matrixStack.peek().positionMatrix, buffer)
@@ -47,6 +55,7 @@ class RenderInWorldContext private constructor(private val tesselator: Tessellat
} }
fun tinyBlock(vec3d: Vec3d, size: Float) { fun tinyBlock(vec3d: Vec3d, size: Float) {
RenderSystem.setShader(GameRenderer::getPositionColorProgram)
matrixStack.push() matrixStack.push()
matrixStack.translate(vec3d.x, vec3d.y, vec3d.z) matrixStack.translate(vec3d.x, vec3d.y, vec3d.z)
matrixStack.scale(size, size, size) matrixStack.scale(size, size, size)
@@ -56,11 +65,56 @@ class RenderInWorldContext private constructor(private val tesselator: Tessellat
matrixStack.pop() matrixStack.pop()
} }
fun line(vararg points: Vec3d, size: Double = 2.0) { fun wireframeCube(blockPos: BlockPos, lineWidth: Float = 10F) {
RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram)
matrixStack.push()
RenderSystem.lineWidth(lineWidth / pow(camera.pos.squaredDistanceTo(blockPos.toCenterPos()), 0.25).toFloat())
matrixStack.translate(blockPos.x.toFloat(), blockPos.y.toFloat(), blockPos.z.toFloat())
buildWireFrameCube(matrixStack.peek(), buffer)
tesselator.draw()
matrixStack.pop()
}
fun line(vararg points: Vec3d, lineWidth: Float = 10F) {
RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram)
RenderSystem.lineWidth(lineWidth / pow(camera.pos.squaredDistanceTo(points.first()), 0.25).toFloat())
buffer.begin(VertexFormat.DrawMode.LINES, VertexFormats.LINES)
buffer.fixedColor(255, 255, 255, 255)
points.toList().zipWithNext().forEach { (a, b) ->
doLine(matrixStack.peek(), buffer, a.x, a.y, a.z, b.x, b.y, b.z)
}
buffer.unfixColor()
tesselator.draw()
} }
companion object { companion object {
private fun doLine(matrix: Entry, buf: BufferBuilder, i: Number, j: Number, k: Number, x: Number, y: Number, z: Number) {
val normal = Vector3f(x.toFloat(), y.toFloat(), z.toFloat())
.sub(i.toFloat(), j.toFloat(), k.toFloat())
.mul(-1F)
buf.vertex(matrix.positionMatrix, i.toFloat(), j.toFloat(), k.toFloat())
.normal(matrix.normalMatrix, normal.x, normal.y, normal.z).next()
buf.vertex(matrix.positionMatrix, x.toFloat(), y.toFloat(), z.toFloat())
.normal(matrix.normalMatrix, normal.x, normal.y, normal.z).next()
}
private fun buildWireFrameCube(matrix: MatrixStack.Entry, buf: BufferBuilder) {
buf.begin(VertexFormat.DrawMode.LINES, VertexFormats.LINES)
buf.fixedColor(255, 255, 255, 255)
for (i in 0..1) {
for (j in 0..1) {
doLine(matrix, buf, 0, i, j, 1, i, j)
doLine(matrix, buf, i, 0, j, i, 1, j)
doLine(matrix, buf, i, j, 0, i, j, 1)
}
}
buf.unfixColor()
}
private fun buildCube(matrix: Matrix4f, buf: BufferBuilder) { private fun buildCube(matrix: Matrix4f, buf: BufferBuilder) {
buf.begin(VertexFormat.DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR) buf.begin(VertexFormat.DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR)
buf.fixedColor(255, 255, 255, 255) buf.fixedColor(255, 255, 255, 255)
@@ -107,19 +161,21 @@ class RenderInWorldContext private constructor(private val tesselator: Tessellat
RenderSystem.disableDepthTest() RenderSystem.disableDepthTest()
RenderSystem.enableBlend() RenderSystem.enableBlend()
RenderSystem.defaultBlendFunc() RenderSystem.defaultBlendFunc()
RenderSystem.setShader(GameRenderer::getPositionColorProgram) RenderSystem.disableCull()
matrices.push() matrices.push()
matrices.translate(-camera.pos.x, -camera.pos.y, -camera.pos.z) matrices.translate(-camera.pos.x, -camera.pos.y, -camera.pos.z)
val ctx = RenderInWorldContext(Tessellator.getInstance(), matrices) val ctx = RenderInWorldContext(RenderSystem.renderThreadTesselator(), matrices, camera)
block(ctx) block(ctx)
matrices.pop() matrices.pop()
RenderSystem.setShaderColor(1F,1F,1F,1F) RenderSystem.setShaderColor(1F, 1F, 1F, 1F)
VertexBuffer.unbind() VertexBuffer.unbind()
RenderSystem.enableDepthTest() RenderSystem.enableDepthTest()
RenderSystem.enableCull()
RenderSystem.disableBlend() RenderSystem.disableBlend()
} }
} }