pre size calculation

This commit is contained in:
Bixilon 2021-08-05 11:29:22 +02:00
parent 3d198617cb
commit fa84eff093
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
6 changed files with 24 additions and 9 deletions

View File

@ -99,7 +99,7 @@ class CharData(
} }
if (style.formatting.contains(PreChatFormattingCodes.STRIKETHROUGH)) { if (style.formatting.contains(PreChatFormattingCodes.STRIKETHROUGH)) {
vertexConsumer.addQuad(startPosition + Vec2(-Font.HORIZONTAL_SPACING, Font.CHAR_HEIGHT / 2.0f + 0.5f), Vec2(endPosition.x + Font.HORIZONTAL_SPACING, startPosition.y + Font.CHAR_HEIGHT / 2.0f + 1.5f), z + 1, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color) vertexConsumer.addQuad(startPosition + Vec2(-Font.HORIZONTAL_SPACING, Font.CHAR_HEIGHT / 2.0f), Vec2(endPosition.x + Font.HORIZONTAL_SPACING, startPosition.y + Font.CHAR_HEIGHT / 2.0f + 1.0f), z + 1, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color)
} }
if (style.formatting.contains(PreChatFormattingCodes.UNDERLINED)) { if (style.formatting.contains(PreChatFormattingCodes.UNDERLINED)) {

View File

@ -21,7 +21,7 @@ import glm_.vec2.Vec2i
object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> { object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: BaseComponent) { override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: BaseComponent) {
for (part in text.parts) { for (part in text.parts) {
ChatComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, part) ChatComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, part)
} }

View File

@ -23,12 +23,12 @@ import glm_.vec2.Vec2i
interface ChatComponentRenderer<T : ChatComponent> { interface ChatComponentRenderer<T : ChatComponent> {
fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: T) fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: T)
companion object : ChatComponentRenderer<ChatComponent> { companion object : ChatComponentRenderer<ChatComponent> {
override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: ChatComponent) { override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: ChatComponent) {
when (text) { when (text) {
is BaseComponent -> BaseComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text) is BaseComponent -> BaseComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text)
is TextComponent -> TextComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text) is TextComponent -> TextComponentRenderer.render(initialOffset, offset, size, z, element, renderWindow, consumer, text)

View File

@ -25,7 +25,7 @@ import glm_.vec2.Vec2i
object TextComponentRenderer : ChatComponentRenderer<TextComponent> { object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: TextComponent) { override fun render(initialOffset: Vec2i, offset: Vec2i, size: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer?, text: TextComponent) {
var first = true var first = true
/** /**
@ -79,6 +79,11 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
if (first) { if (first) {
first = false first = false
// Add initial size
if (size.y == 0) {
size.y = Font.CHAR_HEIGHT + Font.VERTICAL_SPACING
}
} else if (offset.x != initialOffset.x && add(Font.HORIZONTAL_SPACING)) { } else if (offset.x != initialOffset.x && add(Font.HORIZONTAL_SPACING)) {
return return
} }
@ -88,7 +93,7 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
if (offset.x == initialOffset.x && offset.x - initialOffset.x + width > element.maxSize.x) { if (offset.x == initialOffset.x && offset.x - initialOffset.x + width > element.maxSize.x) {
return return
} }
charData.render(offset, z, text, consumer) consumer?.let { charData.render(offset, z, text, it) }
if (add(width)) { if (add(width)) {
return return

View File

@ -30,19 +30,29 @@ class TextElement(
prepared = false prepared = false
} }
override var textComponent: ChatComponent = ChatComponent.of(text) override var textComponent: ChatComponent = ChatComponent.of("")
private set(value) { private set(value) {
size = minSize size = minSize
if (value.message.isNotEmpty()) {
val size = Vec2i(0, 0)
ChatComponentRenderer.render(Vec2i(0, 0), Vec2i(0, 0), size, 0, this, renderWindow, null, value)
this.size = size
}
field = value field = value
} }
init {
textComponent = ChatComponent.of(text)
}
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int { override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
ChatComponentRenderer.render(Vec2i(offset), offset, Vec2i(0, 0), z, this, renderWindow, consumer, textComponent) ChatComponentRenderer.render(Vec2i(offset), offset, Vec2i(0, 0), z, this, renderWindow, consumer, textComponent)
prepared = true
return LAYERS return LAYERS
} }
companion object { companion object {
const val LAYERS = 4 const val LAYERS = 4 // 1 layer for the text, 1 for strikethrough. * 2 for shadow
} }
} }

View File

@ -97,7 +97,7 @@ class HUDRenderer(
), ),
) )
if (!text2.prepared) { if (!text2.prepared) {
text2.render(Vec2i(10, 60), 0, mesh) text2.render(Vec2i(0, 40), 0, mesh)
} }
mesh.load() mesh.load()