From 214959d20011d56c3cbbdb8c0cf05d0b599c5f9f Mon Sep 17 00:00:00 2001 From: Bixilon Date: Fri, 22 Apr 2022 14:30:39 +0200 Subject: [PATCH] sings: render real text, improve performance, re-enable frustum culling --- .../data/registries/blocks/MinecraftBlocks.kt | 2 +- .../minosoft/gui/rendering/RenderConstants.kt | 2 +- .../font/renderer/BaseComponentRenderer.kt | 4 +-- .../font/renderer/ChatComponentRenderer.kt | 26 +++++-------------- .../font/renderer/TextComponentRenderer.kt | 10 +++++-- .../entities/MeshedBlockEntityRenderer.kt | 1 - .../entities/OnlyMeshedBlockEntityRenderer.kt | 18 +++++++++++++ .../renderer/sign/SignBlockEntityRenderer.kt | 6 ++--- .../preparer/cull/SolidCullSectionPreparer.kt | 3 ++- 9 files changed, 41 insertions(+), 31 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/OnlyMeshedBlockEntityRenderer.kt diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/MinecraftBlocks.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/MinecraftBlocks.kt index 9dcb62bdb..b9a6d7dcf 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/MinecraftBlocks.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/MinecraftBlocks.kt @@ -189,7 +189,7 @@ object MinecraftBlocks { val LADDER = "minecraft:ladder".toResourceLocation() val RAIL = "minecraft:rail".toResourceLocation() val COBBLESTONE_STAIRS = "minecraft:cobblestone_stairs".toResourceLocation() - val OAK_WALL_SIGN = "minecraft:oak_wall_sign.json".toResourceLocation() + val OAK_WALL_SIGN = "minecraft:oak_wall_sign".toResourceLocation() val SPRUCE_WALL_SIGN = "minecraft:spruce_wall_sign".toResourceLocation() val BIRCH_WALL_SIGN = "minecraft:birch_wall_sign".toResourceLocation() val ACACIA_WALL_SIGN = "minecraft:acacia_wall_sign".toResourceLocation() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt index 854df9f7b..0d82bc4b7 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderConstants.kt @@ -33,7 +33,7 @@ object RenderConstants { val TEXT_BACKGROUND_COLOR = RGBColor(0, 0, 0, 80) - const val FRUSTUM_CULLING_ENABLED = false + const val FRUSTUM_CULLING_ENABLED = true const val SHOW_FPS_IN_WINDOW_TITLE = true const val MAXIMUM_QUEUE_TIME_PER_FRAME = 20L diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt index 5abf9dece..186219843 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/BaseComponentRenderer.kt @@ -33,9 +33,9 @@ object BaseComponentRenderer : ChatComponentRenderer { return false } - override fun render3DFlat(matrix: Mat4, mesh: WorldMesh, text: BaseComponent) { + override fun render3dFlat(renderWindow: RenderWindow, matrix: Mat4, scale: Float, mesh: WorldMesh, text: BaseComponent, light: Int) { for (part in text.parts) { - ChatComponentRenderer.render3DFlat(matrix, mesh, text) + ChatComponentRenderer.render3dFlat(renderWindow, matrix, scale, mesh, part, light) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt index 9c8522b94..e8095cf50 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/ChatComponentRenderer.kt @@ -17,11 +17,9 @@ import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.data.text.BaseComponent -import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.TextComponent import de.bixilon.minosoft.gui.rendering.RenderWindow -import de.bixilon.minosoft.gui.rendering.font.Font import de.bixilon.minosoft.gui.rendering.gui.elements.Element import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions @@ -35,7 +33,7 @@ interface ChatComponentRenderer { */ fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, element: Element, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, renderInfo: TextRenderInfo, text: T): Boolean - fun render3DFlat(matrix: Mat4, mesh: WorldMesh, text: T) + fun render3dFlat(renderWindow: RenderWindow, matrix: Mat4, scale: Float, mesh: WorldMesh, text: T, light: Int) companion object : ChatComponentRenderer { const val TEXT_BLOCK_RESOLUTION = 128 @@ -48,32 +46,22 @@ interface ChatComponentRenderer { } } - override fun render3DFlat(matrix: Mat4, mesh: WorldMesh, text: ChatComponent) { + override fun render3dFlat(renderWindow: RenderWindow, matrix: Mat4, scale: Float, mesh: WorldMesh, text: ChatComponent, light: Int) { when (text) { - is BaseComponent -> BaseComponentRenderer.render3DFlat(matrix, mesh, text) - is TextComponent -> TextComponentRenderer.render3DFlat(matrix, mesh, text) + is BaseComponent -> BaseComponentRenderer.render3dFlat(renderWindow, matrix, scale, mesh, text, light) + is TextComponent -> TextComponentRenderer.render3dFlat(renderWindow, matrix, scale, mesh, text, light) else -> TODO("Don't know how to render ${text::class.java}") } } fun render3dFlat(renderWindow: RenderWindow, position: Vec3, scale: Float, rotation: Vec3, mesh: WorldMesh, text: ChatComponent, light: Int) { - val rotationMatrix = Mat4() + val matrix = Mat4() + .translateAssign(position) .rotateDegreesAssign(rotation) .translateAssign(Vec3(0, 0, -1)) - val positionMatrix = Mat4() - .translateAssign(position) - val transformMatrix = positionMatrix * rotationMatrix - val text = "abcdefghijklmnop" - - - for ((index, char) in text.codePoints().toArray().withIndex()) { - val data = renderWindow.font[char] ?: continue - val color = ChatColors[index % ChatColors.VALUES.size] - val width = data.render3d(transformMatrix, mesh, color, shadow = false, italic = false, bold = false, strikethrough = false, underlined = false, scale = scale, light = light) + Font.HORIZONTAL_SPACING - transformMatrix.translateAssign(Vec3((width / TEXT_BLOCK_RESOLUTION) * scale, 0, 0)) - } + render3dFlat(renderWindow, matrix, scale, mesh, text, light) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt index 9dd204d7d..b9df828bb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/font/renderer/TextComponentRenderer.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.font.renderer import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.minosoft.data.text.ChatColors import de.bixilon.minosoft.data.text.PreChatFormattingCodes import de.bixilon.minosoft.data.text.TextComponent @@ -189,7 +190,12 @@ object TextComponentRenderer : ChatComponentRenderer { return false } - override fun render3DFlat(matrix: Mat4, mesh: WorldMesh, text: TextComponent) { - TODO("Not yet implemented") + override fun render3dFlat(renderWindow: RenderWindow, matrix: Mat4, scale: Float, mesh: WorldMesh, text: TextComponent, light: Int) { + for ((index, char) in text.message.codePoints().toArray().withIndex()) { + val data = renderWindow.font[char] ?: continue + val color = ChatColors[index % ChatColors.VALUES.size] + val width = data.render3d(matrix, mesh, color, shadow = false, italic = false, bold = false, strikethrough = false, underlined = false, scale = scale, light = light) + Font.HORIZONTAL_SPACING + matrix.translateAssign(Vec3((width / ChatComponentRenderer.TEXT_BLOCK_RESOLUTION) * scale, 0, 0)) + } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/MeshedBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/MeshedBlockEntityRenderer.kt index 80d489427..154ec33b2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/MeshedBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/MeshedBlockEntityRenderer.kt @@ -21,7 +21,6 @@ interface MeshedBlockEntityRenderer : BlockEntityRenderer, S override var light: Int get() = 0 set(value) {} - override fun draw(renderWindow: RenderWindow) = Unit override fun load() = Unit override fun unload() = Unit diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/OnlyMeshedBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/OnlyMeshedBlockEntityRenderer.kt new file mode 100644 index 000000000..1f3e57a8f --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/OnlyMeshedBlockEntityRenderer.kt @@ -0,0 +1,18 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.world.entities + +import de.bixilon.minosoft.data.entities.block.BlockEntity + +interface OnlyMeshedBlockEntityRenderer : MeshedBlockEntityRenderer diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt index bc94059d0..5eb7834ad 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/entities/renderer/sign/SignBlockEntityRenderer.kt @@ -30,7 +30,7 @@ import de.bixilon.minosoft.gui.rendering.font.renderer.ChatComponentRenderer import de.bixilon.minosoft.gui.rendering.models.unbaked.element.UnbakedElement import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotateAssign -import de.bixilon.minosoft.gui.rendering.world.entities.MeshedBlockEntityRenderer +import de.bixilon.minosoft.gui.rendering.world.entities.OnlyMeshedBlockEntityRenderer import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh import de.bixilon.minosoft.gui.rendering.world.preparer.cull.SolidCullSectionPreparer import de.bixilon.minosoft.util.Broken @@ -40,7 +40,7 @@ class SignBlockEntityRenderer( val sign: SignBlockEntity, val renderWindow: RenderWindow, override val blockState: BlockState, -) : MeshedBlockEntityRenderer { +) : OnlyMeshedBlockEntityRenderer { override fun singleRender(position: Vec3i, mesh: WorldMesh, random: Random, blockState: BlockState, neighbours: Array, light: ByteArray, ambientLight: FloatArray, tints: IntArray?): Boolean { val block = this.blockState.block @@ -87,9 +87,7 @@ class SignBlockEntityRenderer( private fun Vec3.signRotate(yRotation: Float) { this -= 0.5f - rotateAssign(yRotation, Axes.Y) - this += 0.5f } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/preparer/cull/SolidCullSectionPreparer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/preparer/cull/SolidCullSectionPreparer.kt index 46c8f9a34..118b9e16c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/preparer/cull/SolidCullSectionPreparer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/preparer/cull/SolidCullSectionPreparer.kt @@ -34,6 +34,7 @@ import de.bixilon.minosoft.gui.rendering.models.SingleBlockRenderable import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.world.entities.BlockEntityRenderer import de.bixilon.minosoft.gui.rendering.world.entities.MeshedBlockEntityRenderer +import de.bixilon.minosoft.gui.rendering.world.entities.OnlyMeshedBlockEntityRenderer import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh import de.bixilon.minosoft.gui.rendering.world.preparer.SolidSectionPreparer import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition @@ -92,7 +93,7 @@ class SolidCullSectionPreparer( position = Vec3i(offsetX + x, offsetY + y, offsetZ + z) blockEntity = section.blockEntities.unsafeGet(x, y, z) val blockEntityModel = blockEntity?.getRenderer(renderWindow, blockState, position, light[SELF_LIGHT_INDEX].toInt()) - if (blockEntityModel != null) { + if (blockEntityModel != null && (blockEntityModel !is OnlyMeshedBlockEntityRenderer)) { blockEntities += blockEntityModel mesh.addBlock(x, y, z) }