limit sign text width

This commit is contained in:
Bixilon 2022-04-23 20:35:03 +02:00
parent 647bfb25a5
commit 225a6ff9c2
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 20 additions and 12 deletions

View File

@ -32,9 +32,9 @@ object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
return false
}
override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) {
override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) {
for (part in text.parts) {
ChatComponentRenderer.render3dFlat(renderWindow, scale, consumer, part, light)
ChatComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, part, light)
}
}

View File

@ -35,7 +35,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(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: T, light: Int)
fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: T, light: Int)
fun calculatePrimitiveCount(text: T): Int
@ -50,15 +50,15 @@ interface ChatComponentRenderer<T : ChatComponent> {
}
}
override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: ChatComponent, light: Int) {
override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: ChatComponent, light: Int) {
when (text) {
is BaseComponent -> BaseComponentRenderer.render3dFlat(renderWindow, scale, consumer, text, light)
is TextComponent -> TextComponentRenderer.render3dFlat(renderWindow, scale, consumer, text, light)
is BaseComponent -> BaseComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, text, light)
is TextComponent -> TextComponentRenderer.render3dFlat(renderWindow, offset, scale, maxSize, consumer, 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) {
fun render3dFlat(renderWindow: RenderWindow, position: Vec3, scale: Float, rotation: Vec3, maxSize: Vec2i, mesh: WorldMesh, text: ChatComponent, light: Int) {
val matrix = Mat4()
.translateAssign(position)
.rotateDegreesAssign(rotation)
@ -69,7 +69,7 @@ interface ChatComponentRenderer<T : ChatComponent> {
textMesh.data.ensureSize(primitives * textMesh.order.size * SingleWorldMesh.SectionArrayMeshStruct.FLOATS_PER_VERTEX)
val consumer = WorldGUIConsumer(textMesh, matrix, light)
render3dFlat(renderWindow, scale, consumer, text, light)
render3dFlat(renderWindow, Vec2i(), scale, maxSize, consumer, text, light)
}
override fun calculatePrimitiveCount(text: ChatComponent): Int {

View File

@ -204,16 +204,22 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
return count
}
override fun render3dFlat(renderWindow: RenderWindow, scale: Float, consumer: WorldGUIConsumer, text: TextComponent, light: Int) {
override fun render3dFlat(renderWindow: RenderWindow, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: TextComponent, light: Int) {
val color = text.color ?: ChatColors.BLACK
val italic = text.formatting.contains(PreChatFormattingCodes.ITALIC)
val bold = text.formatting.contains(PreChatFormattingCodes.BOLD)
val strikethrough = text.formatting.contains(PreChatFormattingCodes.STRIKETHROUGH)
val underlined = text.formatting.contains(PreChatFormattingCodes.UNDERLINED)
for (char in text.message.codePoints()) {
val data = renderWindow.font[char] ?: continue
val width = data.render3d(consumer, color, shadow = false, italic = italic, bold = bold, strikethrough = strikethrough, underlined = underlined, scale = scale) + Font.HORIZONTAL_SPACING
consumer.offset((width / ChatComponentRenderer.TEXT_BLOCK_RESOLUTION) * scale)
val expectedWidth = ((data.width + Font.HORIZONTAL_SPACING) * scale).toInt()
if (maxSize.x - offset.x < expectedWidth) { // ToDo
return
}
val width = ((data.render3d(consumer, color, shadow = false, italic = italic, bold = bold, strikethrough = strikethrough, underlined = underlined, scale = scale) + Font.HORIZONTAL_SPACING) * scale).toInt()
offset.x += width
consumer.offset((width / ChatComponentRenderer.TEXT_BLOCK_RESOLUTION.toFloat()))
}
}
}

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.gui.rendering.world.entities.renderer.sign
import de.bixilon.kotlinglm.func.rad
import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.kutil.cast.CastUtil.nullCast
@ -26,6 +27,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
import de.bixilon.minosoft.data.registries.blocks.types.entity.sign.StandingSignBlock
import de.bixilon.minosoft.data.registries.blocks.types.entity.sign.WallSignBlock
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.font.Font
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
@ -65,7 +67,7 @@ class SignBlockEntityRenderer(
textMesh.data.ensureSize(primitives * textMesh.order.size * SingleWorldMesh.SectionArrayMeshStruct.FLOATS_PER_VERTEX)
for (line in sign.lines) {
ChatComponentRenderer.render3dFlat(renderWindow, textPosition, TEXT_SCALE, Vec3(0.0f, -yRotation, 0.0f), mesh, line, light)
ChatComponentRenderer.render3dFlat(renderWindow, textPosition, TEXT_SCALE, Vec3(0.0f, -yRotation, 0.0f), Vec2i(SIGN_MAX_WIDTH * TEXT_SCALE, Font.TOTAL_CHAR_HEIGHT * TEXT_SCALE), mesh, line, light)
textPosition.y -= 0.11f
}
}