Mercurial > games > semicongine
changeset 1398:f7bf7a5cc1e7
sync from bedroom to office
author | sam <sam@basx.dev> |
---|---|
date | Sat, 14 Dec 2024 17:17:51 +0700 |
parents | 4fd96b36696a |
children | dde74be11b49 |
files | semicongine/text.nim semicongine/text/font.nim semicongine/text/textbox.nim tests/test_text.nim |
diffstat | 4 files changed, 59 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/semicongine/text.nim Sat Dec 14 16:34:02 2024 +0700 +++ b/semicongine/text.nim Sat Dec 14 17:17:51 2024 +0700 @@ -23,8 +23,9 @@ GlyphInfo* = object uvs*: array[4, Vec2f] dimension*: Vec2f - topOffset*: float32 - leftOffset*: float32 + offsetX*: float32 + offsetY*: float32 + leftBearing*: float32 advance*: float32 FontObj* = object @@ -98,15 +99,15 @@ const int[6] indices = int[](0, 1, 2, 2, 3, 0); const int[4] i_x = int[](0, 0, 2, 2); const int[4] i_y = int[](1, 3, 3, 1); -const float epsilon = 0.000000000000001; -// const float epsilon = 0.1; +// const float epsilon = 0.000000000000001; +const float epsilon = 0.1; void main() { int vertexI = indices[gl_VertexIndex]; vec3 pos = vec3( glyphData.pos[glyphIndex][i_x[vertexI]] * scale, glyphData.pos[glyphIndex][i_y[vertexI]] * scale, - gl_VertexIndex * epsilon + 1 - (gl_InstanceIndex + 1) * epsilon ); vec2 uv = vec2(glyphData.uv[glyphIndex][i_x[vertexI]], glyphData.uv[glyphIndex][i_y[vertexI]]); gl_Position = vec4(pos + position, 1.0); @@ -116,13 +117,13 @@ fragmentCode* = """void main() { float v = texture(fontAtlas, fragmentUv).r; - // CARFULL: This can lead to rough edges at times // if(v == 0) { // discard; // } - // outColor = vec4(fragmentColor.rgb, fragmentColor.a * v); - // outColor = fragmentColor; - outColor = vec4(1, 1, 1, v); + outColor = vec4(fragmentColor.rgb, fragmentColor.a * v); + if (v == 0) { + outColor = vec4(1, 0, 1, 1); + } }""" proc `=copy`(dest: var FontObj, source: FontObj) {.error.} @@ -143,11 +144,11 @@ var i = 0'u16 for rune, info in font.glyphs.pairs(): let - left = -info.leftOffset - right = -info.leftOffset + info.dimension.x - top = font.lineHeight + info.topOffset - bottom = font.lineHeight + info.topOffset - info.dimension.y - glyphData.pos[i] = vec4(left, bottom, right, top) * 0.01'f32 + left = -info.offsetX + right = -info.offsetX + info.dimension.x + top = font.lineHeight + info.offsetY + bottom = font.lineHeight + info.offsetY - info.dimension.y + glyphData.pos[i] = vec4(left, bottom, right, top) * 0.005'f32 assert info.uvs[0].x == info.uvs[1].x, "Currently only axis aligned rectangles are allowed for info boxes in font texture maps" assert info.uvs[0].y == info.uvs[3].y,
--- a/semicongine/text/font.nim Sat Dec 14 16:34:02 2024 +0700 +++ b/semicongine/text/font.nim Sat Dec 14 17:17:51 2024 +0700 @@ -70,8 +70,8 @@ warn &"Loading font {name}: Codepoint '{codePoint}' ({cint(codePoint)}) has no glyph" var - topOffsets: Table[Rune, int] - leftOffsets: Table[Rune, int] + offsetY: Table[Rune, int] + offsetX: Table[Rune, int] images: seq[Image[Gray]] for codePoint in codePoints: @@ -88,8 +88,8 @@ addr offX, addr offY, ) - topOffsets[codePoint] = offY - leftOffsets[codePoint] = offX + offsetX[codePoint] = offX + offsetY[codePoint] = offY if char(codePoint) in UppercaseLetters: result.capHeight = float32(height) @@ -132,10 +132,10 @@ vec2((coord.x + iw - 0.5) / w, (coord.y + 0.5) / h), vec2((coord.x + iw - 0.5) / w, (coord.y + ih - 0.5) / h), ], - topOffset: float32(topOffsets[codePoint]) * result.fontscale, - # leftOffset: float32(leftBearing) * result.fontscale, - leftOffset: float32(leftOffsets[codePoint] + leftBearing) * result.fontscale, - advance: float32(advance) * result.fontscale, + offsetX: float32(offsetX[codePoint]), + offsetY: float32(offsetY[codePoint]), + leftBearing: float32(leftBearing), + advance: float32(advance), ) for codePointAfter in codePoints:
--- a/semicongine/text/textbox.nim Sat Dec 14 16:34:02 2024 +0700 +++ b/semicongine/text/textbox.nim Sat Dec 14 17:17:51 2024 +0700 @@ -86,10 +86,10 @@ else: let glyph = textbox.font.glyphs[textbox.visibleText[i]] - left = offsetX + glyph.leftOffset - right = offsetX + glyph.leftOffset + glyph.dimension.x - top = offsetY - glyph.topOffset - bottom = offsetY - glyph.topOffset - glyph.dimension.y + left = offsetX + glyph.offsetX + right = offsetX + glyph.offsetX + glyph.dimension.x + top = offsetY - glyph.offsetY + bottom = offsetY - glyph.offsetY - glyph.dimension.y textbox.position.data[vertexOffset + 0] = vec3(left - anchorX, bottom - anchorY, 0)
--- a/tests/test_text.nim Sat Dec 14 16:34:02 2024 +0700 +++ b/tests/test_text.nim Sat Dec 14 17:17:51 2024 +0700 @@ -18,20 +18,45 @@ const N_GLYPHS = 200 proc test_01_static_label_new(time: float32) = - var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) + # var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) + var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) var renderdata = initRenderData() var pipeline = createPipeline[GlyphShader[N_GLYPHS]](renderPass = vulkan.swapchain.renderPass) var (ds, glyphtable) = glyphDescriptorSet(font, N_GLYPHS) var glyphs = Glyphs( - position: - asGPUArray([vec3(0, 0, 0.2), vec3(0, 0, 0.1), vec3(0, 0, 0)], VertexBufferMapped), - scale: asGPUArray([1'f32, 1'f32, 1'f32], VertexBufferMapped), + position: asGPUArray( + [ + vec3(-1, 0, 0), + vec3(-0.6, 0, 0), + vec3(-0.3, 0, 0), + vec3(0, 0, 0), + vec3(0.3, 0, 0), + vec3(0.6, 0, 0), + ], + VertexBufferMapped, + ), + scale: asGPUArray([1'f32, 1'f32, 1'f32, 1'f32, 1'f32, 1'f32], VertexBufferMapped), color: asGPUArray( - [vec4(1, 1, 1, 1), vec4(1, 1, 1, 1), vec4(1, 1, 1, 1)], VertexBufferMapped + [ + vec4(1, 1, 0, 1), + vec4(0, 0, 1, 1), + vec4(1, 1, 1, 1), + vec4(1, 1, 0, 1), + vec4(0, 0, 1, 1), + vec4(1, 1, 1, 1), + ], + VertexBufferMapped, ), glyphIndex: asGPUArray( - [glyphtable[Rune('A')], glyphtable[Rune('B')], glyphtable[Rune('g')]], + [ + glyphtable[Rune('a')], + glyphtable[Rune('l')], + glyphtable[Rune('i')], + glyphtable[Rune('g')], + glyphtable[Rune('x')], + glyphtable[Rune('x')], + ], VertexBufferMapped, ), ) @@ -59,8 +84,7 @@ pipeline, EMPTY(), glyphs, - fixedVertexCount = 6, - fixedInstanceCount = 2, + fixedVertexCount = 6, # fixedInstanceCount = 2, ) # cleanup