mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 02:45:13 -04:00
font rendering: z, fix issue in non italic mode
This commit is contained in:
parent
a4a2dfc6ac
commit
69ae387d0b
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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}")
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ class HUDRenderer(
|
||||
)
|
||||
|
||||
if (!text.prepared) {
|
||||
text.render(Vec2i(10, 10), mesh)
|
||||
text.render(Vec2i(10, 10), 0, mesh)
|
||||
}
|
||||
|
||||
mesh.load()
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user