mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 11:54:59 -04:00
limit sign text width
This commit is contained in:
parent
647bfb25a5
commit
225a6ff9c2
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user