wip text scaling

This commit is contained in:
Bixilon 2021-10-24 18:23:18 +02:00
parent fd7c55c750
commit f1ca745c50
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 36 additions and 20 deletions

View File

@ -43,10 +43,10 @@ class CharData(
uvEnd = uvEnd * texture.textureArrayUV uvEnd = uvEnd * texture.textureArrayUV
} }
fun render(position: Vec2i, z: Int, style: TextStyle, consumer: GUIVertexConsumer, options: GUIVertexOptions?) { fun render(position: Vec2i, z: Int, style: TextStyle, consumer: GUIVertexConsumer, options: GUIVertexOptions?, scale: Float) {
render(position, z + 2, false, style, consumer, options) render(position, z + 2, false, style, consumer, options, scale)
if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) { if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) {
render(position, z, true, style, consumer, options) render(position, z, true, style, consumer, options, scale)
} }
} }
@ -70,7 +70,7 @@ class CharData(
} }
} }
private fun render(position: Vec2i, z: Int, shadow: Boolean, style: TextStyle, vertexConsumer: GUIVertexConsumer, options: GUIVertexOptions?) { private fun render(position: Vec2i, z: Int, shadow: Boolean, style: TextStyle, vertexConsumer: GUIVertexConsumer, options: GUIVertexOptions?, scale: Float) {
var color = style.color ?: ChatColors.WHITE var color = style.color ?: ChatColors.WHITE
@ -83,12 +83,15 @@ class CharData(
var boldOffset = 0.0f var boldOffset = 0.0f
if (style.formatting.contains(PreChatFormattingCodes.BOLD)) { if (style.formatting.contains(PreChatFormattingCodes.BOLD)) {
boldOffset = BOLD_OFFSET boldOffset = BOLD_OFFSET * scale
} }
val charHeight = Font.CHAR_HEIGHT * scale
val horizontalSpacing = Font.HORIZONTAL_SPACING * scale
val verticalSpacing = Font.VERTICAL_SPACING * scale
val startPosition = Vec2(position) + shadowOffset val startPosition = Vec2(position) + (shadowOffset * scale)
val endPosition = startPosition + Vec2(scaledWidth, Font.CHAR_HEIGHT.toFloat()) val endPosition = startPosition + (Vec2(scaledWidth * scale, charHeight))
val italic = style.formatting.contains(PreChatFormattingCodes.ITALIC) val italic = style.formatting.contains(PreChatFormattingCodes.ITALIC)
@ -101,23 +104,23 @@ 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), 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, options) vertexConsumer.addQuad(startPosition + Vec2(-horizontalSpacing, charHeight / 2.0f - scale / 2), Vec2(endPosition.x + horizontalSpacing, startPosition.y + charHeight / 2.0f + scale / 2), z + 1, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color, options)
} }
if (style.formatting.contains(PreChatFormattingCodes.UNDERLINED)) { if (style.formatting.contains(PreChatFormattingCodes.UNDERLINED)) {
vertexConsumer.addQuad(startPosition + Vec2i(-Font.HORIZONTAL_SPACING, Font.CHAR_HEIGHT), Vec2i(endPosition.x + boldOffset + Font.HORIZONTAL_SPACING, startPosition.y + Font.CHAR_HEIGHT + Font.VERTICAL_SPACING / 2.0f), z, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color, options) vertexConsumer.addQuad(startPosition + Vec2i(-horizontalSpacing, charHeight), Vec2i(endPosition.x + boldOffset + horizontalSpacing, startPosition.y + charHeight + verticalSpacing / 2.0f), z, renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color, options)
} }
// ToDo: Obfuscated // ToDo: Obfuscated
} }
fun calculateWidth(style: TextStyle): Int { fun calculateWidth(style: TextStyle, scale: Float): Int {
var width = scaledWidth.toFloat() var width = scaledWidth.toFloat()
if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) { if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) {
width += SHADOW_OFFSET width += SHADOW_OFFSET
} }
return width.ceil return (width * scale).ceil
} }

View File

@ -72,7 +72,7 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
} }
fun wrap(): Boolean { fun wrap(): Boolean {
if (addY(Font.TOTAL_CHAR_HEIGHT)) { if (addY(renderInfo.charHeight)) {
return true return true
} }
pushLine() pushLine()
@ -134,18 +134,18 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
val charData = renderWindow.font[char] ?: continue val charData = renderWindow.font[char] ?: continue
val charWidth = charData.calculateWidth(text) val charWidth = charData.calculateWidth(text, renderInfo.scale)
var width = charWidth var width = charWidth
if (offset.x != initialOffset.x + renderInfo.charMargin) { if (offset.x != initialOffset.x + renderInfo.charMargin) {
// add spacing between letters // add spacing between letters
width += if (bold) { width += (if (bold) {
Font.HORIZONTAL_SPACING_BOLD Font.HORIZONTAL_SPACING_BOLD
} else if (shadow) { } else if (shadow) {
Font.HORIZONTAL_SPACING_SHADOW Font.HORIZONTAL_SPACING_SHADOW
} else { } else {
Font.HORIZONTAL_SPACING Font.HORIZONTAL_SPACING
} } * renderInfo.scale).toInt()
} }
val previousY = offset.y val previousY = offset.y
@ -163,7 +163,7 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
// ToDo: Remove Font.HORIZONTAL_SPACING // ToDo: Remove Font.HORIZONTAL_SPACING
} }
consumer?.let { charData.render(letterOffset, z, text, it, options) } consumer?.let { charData.render(letterOffset, z, text, it, options, renderInfo.scale) }
if (consumer == null) { if (consumer == null) {
currentLineText += char currentLineText += char

View File

@ -23,6 +23,7 @@ class TextRenderInfo(
val fontAlignment: HorizontalAlignments, val fontAlignment: HorizontalAlignments,
val charHeight: Int, val charHeight: Int,
val charMargin: Int, val charMargin: Int,
val scale: Float,
val lines: MutableList<TextLineInfo> = mutableListOf(), val lines: MutableList<TextLineInfo> = mutableListOf(),
var currentLineNumber: Int = 0, var currentLineNumber: Int = 0,
) { ) {

View File

@ -39,11 +39,21 @@ open class TextElement(
var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR, var backgroundColor: RGBColor = RenderConstants.TEXT_BACKGROUND_COLOR,
noBorder: Boolean = false, noBorder: Boolean = false,
parent: Element? = null, parent: Element? = null,
scale: Float = 1.0f,
) : LabeledElement(hudRenderer) { ) : LabeledElement(hudRenderer) {
lateinit var renderInfo: TextRenderInfo lateinit var renderInfo: TextRenderInfo
private set private set
// ToDo: Reapply if backgroundColor or fontAlignment changes // ToDo: Reapply if backgroundColor or fontAlignment changes
var scale: Float = scale
set(value) {
if (field == value) {
return
}
field = value
cacheUpToDate = false
}
var background: Boolean = background var background: Boolean = background
set(value) { set(value) {
if (field == value) { if (field == value) {
@ -58,8 +68,8 @@ open class TextElement(
return return
} }
field = value field = value
charHeight = value.decide(Font.CHAR_HEIGHT, Font.TOTAL_CHAR_HEIGHT) charHeight = (value.decide(Font.CHAR_HEIGHT, Font.TOTAL_CHAR_HEIGHT) * scale).toInt()
charMargin = value.decide(0, Font.CHAR_MARGIN) charMargin = (value.decide(0, Font.CHAR_MARGIN) * scale).toInt()
forceApply() forceApply()
} }
var charHeight: Int = 0 var charHeight: Int = 0
@ -88,6 +98,7 @@ open class TextElement(
fontAlignment = fontAlignment, fontAlignment = fontAlignment,
charHeight = charHeight, charHeight = charHeight,
charMargin = charMargin, charMargin = charMargin,
scale = scale,
) )
ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, prefSize, 0, InfiniteSizeElement(hudRenderer), renderWindow, null, null, renderInfo, value) ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, prefSize, 0, InfiniteSizeElement(hudRenderer), renderWindow, null, null, renderInfo, value)
} }
@ -107,6 +118,7 @@ open class TextElement(
fontAlignment = fontAlignment, fontAlignment = fontAlignment,
charHeight = charHeight, charHeight = charHeight,
charMargin = charMargin, charMargin = charMargin,
scale = scale,
) )
if (!emptyMessage) { if (!emptyMessage) {
ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, size, 0, this, renderWindow, null, null, renderInfo, chatComponent) ChatComponentRenderer.render(Vec2i.EMPTY, Vec2i.EMPTY, size, 0, this, renderWindow, null, null, renderInfo, chatComponent)

View File

@ -22,7 +22,7 @@ import de.bixilon.minosoft.util.MMath.round10
import glm_.vec2.Vec2i import glm_.vec2.Vec2i
class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement<TextElement>(hudRenderer), Pollable { class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement<TextElement>(hudRenderer), Pollable {
override val layout: TextElement = TextElement(hudRenderer, "") override val layout: TextElement = TextElement(hudRenderer, "", scale = 3.0f)
override val layoutOffset: Vec2i = Vec2i(2, 2) override val layoutOffset: Vec2i = Vec2i(2, 2)
@ -53,7 +53,7 @@ class WorldInfoHUDElement(hudRenderer: HUDRenderer) : HUDElement<TextElement>(hu
layout.text = if (hide) { layout.text = if (hide) {
"" ""
} else { } else {
"FPS $fps" "§aFPS $fps"
} }
} }