mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 03:15:35 -04:00
sings: render real text, improve performance, re-enable frustum culling
This commit is contained in:
parent
55d0419040
commit
214959d200
@ -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()
|
||||
|
@ -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
|
||||
|
@ -33,9 +33,9 @@ object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<T : ChatComponent> {
|
||||
*/
|
||||
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<ChatComponent> {
|
||||
const val TEXT_BLOCK_RESOLUTION = 128
|
||||
@ -48,32 +46,22 @@ interface ChatComponentRenderer<T : ChatComponent> {
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<TextComponent> {
|
||||
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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,6 @@ interface MeshedBlockEntityRenderer<E : BlockEntity> : BlockEntityRenderer<E>, S
|
||||
override var light: Int
|
||||
get() = 0
|
||||
set(value) {}
|
||||
|
||||
override fun draw(renderWindow: RenderWindow) = Unit
|
||||
override fun load() = Unit
|
||||
override fun unload() = Unit
|
||||
|
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 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<E : BlockEntity> : MeshedBlockEntityRenderer<E>
|
@ -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<SignBlockEntity> {
|
||||
) : OnlyMeshedBlockEntityRenderer<SignBlockEntity> {
|
||||
|
||||
override fun singleRender(position: Vec3i, mesh: WorldMesh, random: Random, blockState: BlockState, neighbours: Array<BlockState?>, 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
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user