font rendering: z, fix issue in non italic mode

This commit is contained in:
Bixilon 2021-08-04 20:07:41 +02:00
parent a4a2dfc6ac
commit 69ae387d0b
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
11 changed files with 45 additions and 28 deletions

View File

@ -78,4 +78,7 @@ object RenderConstants {
const val MAXIMUM_PARTICLE_AMOUNT = 200000
const val DEFAULT_LINE_WIDTH = 1.0f / 128.0f
const val UV_ADD = 0.001f
}

View File

@ -41,15 +41,15 @@ class CharData(
uvEnd = uvEnd * texture.textureArrayUV
}
fun render(position: Vec2i, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
render(position, false, style, vertexConsumer)
fun render(position: Vec2i, z: Int, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
render(position, z + 2, false, style, vertexConsumer)
if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) {
render(position, true, style, vertexConsumer)
render(position, z, true, style, vertexConsumer)
}
}
private fun GUIVertexConsumer.addQuad(start: Vec2t<*>, end: Vec2t<*>, texture: AbstractTexture, uvStart: Vec2, uvEnd: Vec2, italic: Boolean, tint: RGBColor) {
val italicOffset = italic.decide(ITALIC_OFFSET, 0.0f)
private fun GUIVertexConsumer.addQuad(start: Vec2t<*>, end: Vec2t<*>, z: Int, texture: AbstractTexture, uvStart: Vec2, uvEnd: Vec2, italic: Boolean, tint: RGBColor) {
val italicOffset = italic.decide({ (end.y.toFloat() - start.y.toFloat()) / Font.CHAR_HEIGHT.toFloat() * ITALIC_OFFSET }, 0.0f)
val positions = arrayOf(
Vec2(start.x.toFloat() + italicOffset, start.y),
Vec2(end.x.toFloat() + italicOffset, start.y),
@ -64,11 +64,11 @@ class CharData(
)
for ((vertexIndex, textureIndex) in Mesh.QUAD_DRAW_ODER) {
addVertex(positions[vertexIndex], texture, texturePositions[textureIndex], tint)
addVertex(positions[vertexIndex], z, texture, texturePositions[textureIndex], tint)
}
}
private fun render(position: Vec2i, shadow: Boolean, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
private fun render(position: Vec2i, z: Int, shadow: Boolean, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
var color = style.color ?: ChatColors.WHITE
@ -92,18 +92,18 @@ class CharData(
val italic = style.formatting.contains(PreChatFormattingCodes.ITALIC)
vertexConsumer.addQuad(startPosition, endPosition, texture, uvStart, uvEnd, italic, color)
vertexConsumer.addQuad(startPosition, endPosition, z, texture, uvStart, uvEnd, italic, color)
if (style.formatting.contains(PreChatFormattingCodes.BOLD)) {
vertexConsumer.addQuad(startPosition + Vec2(boldOffset, 0.0f), endPosition + Vec2(boldOffset, 0.0f), texture, uvStart, uvEnd, italic, color)
vertexConsumer.addQuad(startPosition + Vec2(boldOffset, 0.0f), endPosition + Vec2(boldOffset, 0.0f), z, texture, uvStart, uvEnd, italic, color)
}
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), 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 + 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)
}
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), renderWindow.WHITE_TEXTURE.texture, renderWindow.WHITE_TEXTURE.uvStart, renderWindow.WHITE_TEXTURE.uvEnd, italic, color)
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)
}
// ToDo: Obfuscated

View File

@ -14,6 +14,7 @@
package de.bixilon.minosoft.gui.rendering.font.provider
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.font.CharData
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
@ -70,7 +71,7 @@ class BitmapFontProvider(
val xOffset = pixel.x * CHAR_WIDTH * x
val uvStart = Vec2(
x = xOffset + (pixel.x * xStart[x]),
x = xOffset + (pixel.x * xStart[x]) - RenderConstants.UV_ADD,
y = yStart,
)
val uvEnd = Vec2(

View File

@ -20,9 +20,9 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import glm_.vec2.Vec2i
object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
override fun render(offset: Vec2i, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: BaseComponent) {
override fun render(offset: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: BaseComponent) {
for (part in text.parts) {
ChatComponentRenderer.render(offset, element, renderWindow, consumer, part)
ChatComponentRenderer.render(offset, z, element, renderWindow, consumer, part)
}
}
}

View File

@ -23,15 +23,15 @@ import glm_.vec2.Vec2i
interface ChatComponentRenderer<T : ChatComponent> {
fun render(offset: Vec2i, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: T)
fun render(offset: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: T)
companion object {
companion object : ChatComponentRenderer<ChatComponent> {
fun render(offset: Vec2i, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: ChatComponent) {
override fun render(offset: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: ChatComponent) {
when (text) {
is BaseComponent -> BaseComponentRenderer.render(offset, element, renderWindow, consumer, text)
is TextComponent -> TextComponentRenderer.render(offset, element, renderWindow, consumer, text)
is BaseComponent -> BaseComponentRenderer.render(offset, z, element, renderWindow, consumer, text)
is TextComponent -> TextComponentRenderer.render(offset, z, element, renderWindow, consumer, text)
else -> TODO("Don't know how to render ${text::class.java}")
}
}

View File

@ -25,7 +25,7 @@ import glm_.vec2.Vec2i
object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
override fun render(offset: Vec2i, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: TextComponent) {
override fun render(offset: Vec2i, z: Int, element: LabeledElement, renderWindow: RenderWindow, consumer: GUIVertexConsumer, text: TextComponent) {
var first = true
for (char in text.message.toCharArray()) {
if (char == '\n') {
@ -41,7 +41,7 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
offset.x += Font.HORIZONTAL_SPACING
}
charData.render(offset, text, consumer)
charData.render(offset, z, text, consumer)
offset.x += charData.calculateWidth(text)
}

View File

@ -24,5 +24,8 @@ abstract class Element {
open var size: Vec2i = Vec2i()
abstract fun render(offset: Vec2i, consumer: GUIVertexConsumer)
/**
* @return The number of z layers used
*/
abstract fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int
}

View File

@ -37,7 +37,12 @@ class TextElement(
}
override fun render(offset: Vec2i, consumer: GUIVertexConsumer) {
ChatComponentRenderer.render(offset, this, renderWindow, consumer, textComponent)
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
ChatComponentRenderer.render(offset, z, this, renderWindow, consumer, textComponent)
return LAYERS
}
companion object {
const val LAYERS = 4
}
}

View File

@ -77,7 +77,7 @@ class HUDRenderer(
)
if (!text.prepared) {
text.render(Vec2i(10, 10), mesh)
text.render(Vec2i(10, 10), 0, mesh)
}
mesh.load()

View File

@ -30,12 +30,12 @@ class GUIMesh(
val matrix: Mat4,
) : Mesh(renderWindow, HUDMeshStruct), GUIVertexConsumer {
override fun addVertex(position: Vec2t<*>, texture: AbstractTexture, uv: Vec2, tint: RGBColor) {
override fun addVertex(position: Vec2t<*>, z: Int, texture: AbstractTexture, uv: Vec2, tint: RGBColor) {
val outPosition = matrix * Vec4(position.x.toFloat(), position.y.toFloat(), 1.0f, 1.0f)
data.addAll(floatArrayOf(
outPosition.x,
outPosition.y,
0.95f,
BASE_Z + Z_MULTIPLIER * z,
uv.x,
uv.y,
Float.fromBits(texture.renderData?.layer ?: RenderConstants.DEBUG_TEXTURE_ID),
@ -51,4 +51,9 @@ class GUIMesh(
) {
companion object : MeshStruct(HUDMeshStruct::class)
}
companion object {
private const val BASE_Z = 0.95f
private const val Z_MULTIPLIER = -0.001f
}
}

View File

@ -20,5 +20,5 @@ import glm_.vec2.Vec2t
interface GUIVertexConsumer {
fun addVertex(position: Vec2t<*>, texture: AbstractTexture, uv: Vec2, tint: RGBColor)
fun addVertex(position: Vec2t<*>, z: Int, texture: AbstractTexture, uv: Vec2, tint: RGBColor)
}