Add in world texture renderer

[no changelog]
This commit is contained in:
Linnea Gräf
2024-01-27 17:17:26 +01:00
parent bcf568d721
commit 9b0e966d66
2 changed files with 78 additions and 32 deletions

View File

@@ -9,12 +9,14 @@ package moe.nea.firmament.features.world
import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.util.Identifier
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import moe.nea.firmament.events.ProcessChatEvent import moe.nea.firmament.events.ProcessChatEvent
import moe.nea.firmament.events.WorldReadyEvent import moe.nea.firmament.events.WorldReadyEvent
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.gui.config.ManagedConfig
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.TimeMark
import moe.nea.firmament.util.render.RenderInWorldContext import moe.nea.firmament.util.render.RenderInWorldContext

View File

@@ -15,6 +15,7 @@ import kotlin.math.tan
import net.minecraft.client.font.TextRenderer import net.minecraft.client.font.TextRenderer
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.BufferRenderer
import net.minecraft.client.render.Camera import net.minecraft.client.render.Camera
import net.minecraft.client.render.GameRenderer import net.minecraft.client.render.GameRenderer
import net.minecraft.client.render.LightmapTextureManager import net.minecraft.client.render.LightmapTextureManager
@@ -24,9 +25,11 @@ import net.minecraft.client.render.VertexConsumer
import net.minecraft.client.render.VertexConsumerProvider import net.minecraft.client.render.VertexConsumerProvider
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.texture.Sprite
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.client.util.math.MatrixStack.Entry
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.util.Identifier
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d import net.minecraft.util.math.Vec3d
import moe.nea.firmament.events.WorldRenderLastEvent import moe.nea.firmament.events.WorldRenderLastEvent
@@ -79,8 +82,7 @@ class RenderInWorldContext private constructor(
) )
} }
fun text(position: Vec3d, vararg texts: Text, verticalAlign: VerticalAlign = VerticalAlign.CENTER) { fun withFacingThePlayer(position: Vec3d, block: () -> Unit) {
assertTrueOr(texts.isNotEmpty()) { return@text }
matrixStack.push() matrixStack.push()
matrixStack.translate(position.x, position.y, position.z) matrixStack.translate(position.x, position.y, position.z)
val actualCameraDistance = position.distanceTo(camera.pos) val actualCameraDistance = position.distanceTo(camera.pos)
@@ -90,11 +92,54 @@ class RenderInWorldContext private constructor(
matrixStack.multiply(camera.rotation) matrixStack.multiply(camera.rotation)
matrixStack.scale(-0.025F, -0.025F, -1F) matrixStack.scale(-0.025F, -0.025F, -1F)
block()
matrixStack.pop()
vertexConsumers.drawCurrentLayer()
}
fun sprite(position: Vec3d, sprite: Sprite, width: Int, height: Int) {
texture(
position, sprite.atlasId, width, height, sprite.minU, sprite.minV, sprite.maxU, sprite.maxV
)
}
fun texture(
position: Vec3d, texture: Identifier, width: Int, height: Int,
u1: Float, v1: Float,
u2: Float, v2: Float,
) {
withFacingThePlayer(position) {
RenderSystem.setShaderTexture(0, texture)
RenderSystem.setShader(GameRenderer::getPositionColorTexProgram)
val hw = width / 2F
val hh = height / 2F
val matrix4f: Matrix4f = matrixStack.peek().positionMatrix
val buf = Tessellator.getInstance().buffer
buf.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR_TEXTURE)
buf.fixedColor(255, 255, 255, 255)
buf.vertex(matrix4f, -hw, -hh, 0F)
.texture(u1, v1).next()
buf.vertex(matrix4f, -hw, +hh, 0F)
.texture(u1, v2).next()
buf.vertex(matrix4f, +hw, +hh, 0F)
.texture(u2, v2).next()
buf.vertex(matrix4f, +hw, -hh, 0F)
.texture(u2, v1).next()
buf.unfixColor()
BufferRenderer.drawWithGlobalProgram(buf.end())
}
}
fun text(position: Vec3d, vararg texts: Text, verticalAlign: VerticalAlign = VerticalAlign.CENTER) {
assertTrueOr(texts.isNotEmpty()) { return@text }
withFacingThePlayer(position) {
for ((index, text) in texts.withIndex()) { for ((index, text) in texts.withIndex()) {
matrixStack.push() matrixStack.push()
val width = MC.font.getWidth(text) val width = MC.font.getWidth(text)
matrixStack.translate(-width / 2F, verticalAlign.align(index, texts.size), 0F) matrixStack.translate(-width / 2F, verticalAlign.align(index, texts.size), 0F)
val vertexConsumer: VertexConsumer = vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough()) val vertexConsumer: VertexConsumer =
vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough())
val matrix4f = matrixStack.peek().positionMatrix val matrix4f = matrixStack.peek().positionMatrix
vertexConsumer.vertex(matrix4f, -1.0f, -1.0f, 0.0f).color(0x70808080) vertexConsumer.vertex(matrix4f, -1.0f, -1.0f, 0.0f).color(0x70808080)
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next() .light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
@@ -121,8 +166,7 @@ class RenderInWorldContext private constructor(
) )
matrixStack.pop() matrixStack.pop()
} }
matrixStack.pop() }
vertexConsumers.drawCurrentLayer()
} }
fun tinyBlock(vec3d: Vec3d, size: Float) { fun tinyBlock(vec3d: Vec3d, size: Float) {