Add in world texture renderer
[no changelog]
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,41 +92,83 @@ 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)
|
||||||
|
|
||||||
for ((index, text) in texts.withIndex()) {
|
block()
|
||||||
matrixStack.push()
|
|
||||||
val width = MC.font.getWidth(text)
|
|
||||||
matrixStack.translate(-width / 2F, verticalAlign.align(index, texts.size), 0F)
|
|
||||||
val vertexConsumer: VertexConsumer = vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough())
|
|
||||||
val matrix4f = matrixStack.peek().positionMatrix
|
|
||||||
vertexConsumer.vertex(matrix4f, -1.0f, -1.0f, 0.0f).color(0x70808080)
|
|
||||||
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
|
||||||
vertexConsumer.vertex(matrix4f, -1.0f, MC.font.fontHeight.toFloat(), 0.0f).color(0x70808080)
|
|
||||||
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
|
||||||
vertexConsumer.vertex(matrix4f, width.toFloat(), MC.font.fontHeight.toFloat(), 0.0f)
|
|
||||||
.color(0x70808080)
|
|
||||||
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
|
||||||
vertexConsumer.vertex(matrix4f, width.toFloat(), -1.0f, 0.0f).color(0x70808080)
|
|
||||||
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
|
||||||
matrixStack.translate(0F, 0F, 0.01F)
|
|
||||||
|
|
||||||
MC.font.draw(
|
|
||||||
text,
|
|
||||||
0F,
|
|
||||||
0F,
|
|
||||||
-1,
|
|
||||||
false,
|
|
||||||
matrixStack.peek().positionMatrix,
|
|
||||||
vertexConsumers,
|
|
||||||
TextRenderer.TextLayerType.SEE_THROUGH,
|
|
||||||
0,
|
|
||||||
LightmapTextureManager.MAX_LIGHT_COORDINATE
|
|
||||||
)
|
|
||||||
matrixStack.pop()
|
|
||||||
}
|
|
||||||
matrixStack.pop()
|
matrixStack.pop()
|
||||||
vertexConsumers.drawCurrentLayer()
|
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()) {
|
||||||
|
matrixStack.push()
|
||||||
|
val width = MC.font.getWidth(text)
|
||||||
|
matrixStack.translate(-width / 2F, verticalAlign.align(index, texts.size), 0F)
|
||||||
|
val vertexConsumer: VertexConsumer =
|
||||||
|
vertexConsumers.getBuffer(RenderLayer.getTextBackgroundSeeThrough())
|
||||||
|
val matrix4f = matrixStack.peek().positionMatrix
|
||||||
|
vertexConsumer.vertex(matrix4f, -1.0f, -1.0f, 0.0f).color(0x70808080)
|
||||||
|
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
||||||
|
vertexConsumer.vertex(matrix4f, -1.0f, MC.font.fontHeight.toFloat(), 0.0f).color(0x70808080)
|
||||||
|
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
||||||
|
vertexConsumer.vertex(matrix4f, width.toFloat(), MC.font.fontHeight.toFloat(), 0.0f)
|
||||||
|
.color(0x70808080)
|
||||||
|
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
||||||
|
vertexConsumer.vertex(matrix4f, width.toFloat(), -1.0f, 0.0f).color(0x70808080)
|
||||||
|
.light(LightmapTextureManager.MAX_BLOCK_LIGHT_COORDINATE).next()
|
||||||
|
matrixStack.translate(0F, 0F, 0.01F)
|
||||||
|
|
||||||
|
MC.font.draw(
|
||||||
|
text,
|
||||||
|
0F,
|
||||||
|
0F,
|
||||||
|
-1,
|
||||||
|
false,
|
||||||
|
matrixStack.peek().positionMatrix,
|
||||||
|
vertexConsumers,
|
||||||
|
TextRenderer.TextLayerType.SEE_THROUGH,
|
||||||
|
0,
|
||||||
|
LightmapTextureManager.MAX_LIGHT_COORDINATE
|
||||||
|
)
|
||||||
|
matrixStack.pop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun tinyBlock(vec3d: Vec3d, size: Float) {
|
fun tinyBlock(vec3d: Vec3d, size: Float) {
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorProgram)
|
RenderSystem.setShader(GameRenderer::getPositionColorProgram)
|
||||||
matrixStack.push()
|
matrixStack.push()
|
||||||
|
|||||||
Reference in New Issue
Block a user