mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 09:56:37 -04:00
newline rendering
This commit is contained in:
parent
1e72bae1e1
commit
8ce641cacf
@ -154,7 +154,7 @@ class ChatComponentRendererTest {
|
||||
info.assert(
|
||||
lineIndex = 1,
|
||||
lines = listOf(
|
||||
TextLineInfo(BaseComponent(TextComponent("")), 0.0f),
|
||||
TextLineInfo(BaseComponent(), 0.0f),
|
||||
),
|
||||
size = Vec2(0.0f, 11.0f),
|
||||
)
|
||||
@ -175,10 +175,10 @@ class ChatComponentRendererTest {
|
||||
fun `basic new line 2`() {
|
||||
val info = render(TextComponent("bcd\n\nefgh"))
|
||||
info.assert(
|
||||
lineIndex = 1,
|
||||
lineIndex = 2,
|
||||
lines = listOf(
|
||||
TextLineInfo(BaseComponent(TextComponent("bcd")), 5.0f),
|
||||
TextLineInfo(BaseComponent(TextComponent("")), 0.0f),
|
||||
TextLineInfo(BaseComponent(), 0.0f),
|
||||
TextLineInfo(BaseComponent(TextComponent("efgh")), 14.0f),
|
||||
),
|
||||
size = Vec2(14f, 33.0f),
|
||||
|
@ -26,10 +26,12 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||
|
||||
object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
|
||||
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: BaseComponent) {
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: BaseComponent): Boolean {
|
||||
for (part in text.parts) {
|
||||
ChatComponentRenderer.render(offset, fontManager, properties, info, consumer, options, part)
|
||||
val filled = ChatComponentRenderer.render(offset, fontManager, properties, info, consumer, options, part)
|
||||
if (filled) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
override fun render3dFlat(context: RenderContext, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: BaseComponent, light: Int) {
|
||||
|
@ -37,7 +37,7 @@ interface ChatComponentRenderer<T : ChatComponent> {
|
||||
/**
|
||||
* Returns true if the text exceeded the maximum size
|
||||
*/
|
||||
fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: T)
|
||||
fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: T): Boolean
|
||||
|
||||
fun render3dFlat(context: RenderContext, offset: Vec2i, scale: Float, maxSize: Vec2i, consumer: WorldGUIConsumer, text: T, light: Int)
|
||||
|
||||
@ -46,11 +46,11 @@ interface ChatComponentRenderer<T : ChatComponent> {
|
||||
companion object : ChatComponentRenderer<ChatComponent> {
|
||||
const val TEXT_BLOCK_RESOLUTION = 128
|
||||
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: ChatComponent) {
|
||||
when (text) {
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: ChatComponent): Boolean {
|
||||
return when (text) {
|
||||
is BaseComponent -> BaseComponentRenderer.render(offset, fontManager, properties, info, consumer, options, text)
|
||||
is TextComponent -> TextComponentRenderer.render(offset, fontManager, properties, info, consumer, options, text)
|
||||
is EmptyComponent -> return
|
||||
is EmptyComponent -> return false
|
||||
else -> TODO("Don't know how to render ${text::class.java}")
|
||||
}
|
||||
}
|
||||
|
@ -41,8 +41,19 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
||||
return properties.forcedColor ?: text.color ?: properties.fallbackColor
|
||||
}
|
||||
|
||||
private fun renderNewline(offset: TextOffset, info: TextRenderInfo) {
|
||||
TODO()
|
||||
private fun renderNewline(properties: TextRenderProperties, offset: TextOffset, info: TextRenderInfo, updateSize: Boolean): Boolean {
|
||||
val height = offset.getNextLineHeight(properties)
|
||||
if (!offset.addLine(info, height)) {
|
||||
info.cutOff = true
|
||||
return true
|
||||
}
|
||||
|
||||
if (updateSize) {
|
||||
info.size.y += height
|
||||
}
|
||||
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
private fun renderStrikethrough() {
|
||||
@ -53,8 +64,8 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: TextComponent) {
|
||||
if (text.message.isEmpty()) return
|
||||
override fun render(offset: TextOffset, fontManager: FontManager, properties: TextRenderProperties, info: TextRenderInfo, consumer: GUIVertexConsumer?, options: GUIVertexOptions?, text: TextComponent): Boolean {
|
||||
if (text.message.isEmpty()) return false
|
||||
|
||||
val textFont = fontManager[text.font]
|
||||
val color = getColor(properties, text)
|
||||
@ -62,12 +73,14 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
||||
var skipWhitespaces = false
|
||||
|
||||
val line = StringBuilder()
|
||||
var filled = false
|
||||
|
||||
for (codePoint in text.message.codePoints()) {
|
||||
if (codePoint == '\n'.code) {
|
||||
renderNewline(offset, info)
|
||||
filled = renderNewline(properties, offset, info, consumer == null)
|
||||
info.lines[info.lineIndex - 1].push(text, line)
|
||||
skipWhitespaces = true
|
||||
continue
|
||||
if (filled) break else continue
|
||||
}
|
||||
if (skipWhitespaces && Character.isWhitespace(codePoint)) {
|
||||
continue
|
||||
@ -86,7 +99,10 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
||||
|
||||
val lineInfo = renderer.render(offset, color, properties, info, formatting, codePoint, consumer, options)
|
||||
if (consumer != null) continue // already know that information
|
||||
if (lineInfo == CodePointAddResult.BREAK) break
|
||||
if (lineInfo == CodePointAddResult.BREAK) {
|
||||
filled = true
|
||||
break
|
||||
}
|
||||
|
||||
if (lineIndex != info.lineIndex) {
|
||||
// new line started
|
||||
@ -98,6 +114,8 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
||||
if (line.isNotEmpty()) {
|
||||
info.lines[info.lineIndex].push(text, line)
|
||||
}
|
||||
|
||||
return filled
|
||||
}
|
||||
|
||||
override fun calculatePrimitiveCount(text: TextComponent): Int {
|
||||
|
Loading…
x
Reference in New Issue
Block a user