mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 20:05:02 -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 MAXIMUM_PARTICLE_AMOUNT = 200000
|
||||||
|
|
||||||
const val DEFAULT_LINE_WIDTH = 1.0f / 128.0f
|
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
|
uvEnd = uvEnd * texture.textureArrayUV
|
||||||
}
|
}
|
||||||
|
|
||||||
fun render(position: Vec2i, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
|
fun render(position: Vec2i, z: Int, style: TextStyle, vertexConsumer: GUIVertexConsumer) {
|
||||||
render(position, false, style, vertexConsumer)
|
render(position, z + 2, false, style, vertexConsumer)
|
||||||
if (style.formatting.contains(PreChatFormattingCodes.SHADOWED)) {
|
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) {
|
private fun GUIVertexConsumer.addQuad(start: Vec2t<*>, end: Vec2t<*>, z: Int, texture: AbstractTexture, uvStart: Vec2, uvEnd: Vec2, italic: Boolean, tint: RGBColor) {
|
||||||
val italicOffset = italic.decide(ITALIC_OFFSET, 0.0f)
|
val italicOffset = italic.decide({ (end.y.toFloat() - start.y.toFloat()) / Font.CHAR_HEIGHT.toFloat() * ITALIC_OFFSET }, 0.0f)
|
||||||
val positions = arrayOf(
|
val positions = arrayOf(
|
||||||
Vec2(start.x.toFloat() + italicOffset, start.y),
|
Vec2(start.x.toFloat() + italicOffset, start.y),
|
||||||
Vec2(end.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) {
|
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
|
var color = style.color ?: ChatColors.WHITE
|
||||||
|
|
||||||
|
|
||||||
@ -92,18 +92,18 @@ class CharData(
|
|||||||
val italic = style.formatting.contains(PreChatFormattingCodes.ITALIC)
|
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)) {
|
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)) {
|
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)) {
|
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
|
// ToDo: Obfuscated
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.font.provider
|
package de.bixilon.minosoft.gui.rendering.font.provider
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.registries.ResourceLocation
|
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.RenderWindow
|
||||||
import de.bixilon.minosoft.gui.rendering.font.CharData
|
import de.bixilon.minosoft.gui.rendering.font.CharData
|
||||||
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
|
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
|
||||||
@ -70,7 +71,7 @@ class BitmapFontProvider(
|
|||||||
val xOffset = pixel.x * CHAR_WIDTH * x
|
val xOffset = pixel.x * CHAR_WIDTH * x
|
||||||
|
|
||||||
val uvStart = Vec2(
|
val uvStart = Vec2(
|
||||||
x = xOffset + (pixel.x * xStart[x]),
|
x = xOffset + (pixel.x * xStart[x]) - RenderConstants.UV_ADD,
|
||||||
y = yStart,
|
y = yStart,
|
||||||
)
|
)
|
||||||
val uvEnd = Vec2(
|
val uvEnd = Vec2(
|
||||||
|
@ -20,9 +20,9 @@ import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
|||||||
import glm_.vec2.Vec2i
|
import glm_.vec2.Vec2i
|
||||||
|
|
||||||
object BaseComponentRenderer : ChatComponentRenderer<BaseComponent> {
|
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) {
|
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> {
|
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) {
|
when (text) {
|
||||||
is BaseComponent -> BaseComponentRenderer.render(offset, element, renderWindow, consumer, text)
|
is BaseComponent -> BaseComponentRenderer.render(offset, z, element, renderWindow, consumer, text)
|
||||||
is TextComponent -> TextComponentRenderer.render(offset, 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}")
|
else -> TODO("Don't know how to render ${text::class.java}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ import glm_.vec2.Vec2i
|
|||||||
|
|
||||||
object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
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
|
var first = true
|
||||||
for (char in text.message.toCharArray()) {
|
for (char in text.message.toCharArray()) {
|
||||||
if (char == '\n') {
|
if (char == '\n') {
|
||||||
@ -41,7 +41,7 @@ object TextComponentRenderer : ChatComponentRenderer<TextComponent> {
|
|||||||
offset.x += Font.HORIZONTAL_SPACING
|
offset.x += Font.HORIZONTAL_SPACING
|
||||||
}
|
}
|
||||||
|
|
||||||
charData.render(offset, text, consumer)
|
charData.render(offset, z, text, consumer)
|
||||||
|
|
||||||
offset.x += charData.calculateWidth(text)
|
offset.x += charData.calculateWidth(text)
|
||||||
}
|
}
|
||||||
|
@ -24,5 +24,8 @@ abstract class Element {
|
|||||||
open var size: Vec2i = Vec2i()
|
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) {
|
override fun render(offset: Vec2i, z: Int, consumer: GUIVertexConsumer): Int {
|
||||||
ChatComponentRenderer.render(offset, this, renderWindow, consumer, textComponent)
|
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) {
|
if (!text.prepared) {
|
||||||
text.render(Vec2i(10, 10), mesh)
|
text.render(Vec2i(10, 10), 0, mesh)
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh.load()
|
mesh.load()
|
||||||
|
@ -30,12 +30,12 @@ class GUIMesh(
|
|||||||
val matrix: Mat4,
|
val matrix: Mat4,
|
||||||
) : Mesh(renderWindow, HUDMeshStruct), GUIVertexConsumer {
|
) : 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)
|
val outPosition = matrix * Vec4(position.x.toFloat(), position.y.toFloat(), 1.0f, 1.0f)
|
||||||
data.addAll(floatArrayOf(
|
data.addAll(floatArrayOf(
|
||||||
outPosition.x,
|
outPosition.x,
|
||||||
outPosition.y,
|
outPosition.y,
|
||||||
0.95f,
|
BASE_Z + Z_MULTIPLIER * z,
|
||||||
uv.x,
|
uv.x,
|
||||||
uv.y,
|
uv.y,
|
||||||
Float.fromBits(texture.renderData?.layer ?: RenderConstants.DEBUG_TEXTURE_ID),
|
Float.fromBits(texture.renderData?.layer ?: RenderConstants.DEBUG_TEXTURE_ID),
|
||||||
@ -51,4 +51,9 @@ class GUIMesh(
|
|||||||
) {
|
) {
|
||||||
companion object : MeshStruct(HUDMeshStruct::class)
|
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 {
|
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