Mercurial > games > semicongine
changeset 432:2b373a03cf64
did: small refactoring
author | Sam <sam@basx.dev> |
---|---|
date | Sat, 10 Feb 2024 15:54:25 +0700 |
parents | e13b75bff00c |
children | 08b8facaf3b7 |
files | semicongine/text.nim tests/test_font.nim |
diffstat | 2 files changed, 28 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/semicongine/text.nim Fri Feb 09 20:02:55 2024 +0700 +++ b/semicongine/text.nim Sat Feb 10 15:54:25 2024 +0700 @@ -1,6 +1,5 @@ import std/tables import std/algorithm -# import std/sequtils import std/unicode import std/strformat @@ -10,31 +9,12 @@ import ./vulkan/shader const - SHADER_ATTRIB_PREFIX = "semicon_text_" - MAX_TEXT_MATERIALS = 10 -var instanceCounter = 0 - -type - Text* = object - maxLen*: int - font*: Font - maxWidth: float32 = 0 - # properties: - text: seq[Rune] - position: Vec2f - horizontalAlignment: HorizontalAlignment = Center - verticalAlignment: VerticalAlignment = Center - scale: float32 - aspect_ratio: float32 - # management/internal: - dirty: bool # is true if any of the attributes changed - processedText: seq[Rune] # used to store processed (word-wrapper) text to preserve original - lastRenderedText: seq[Rune] # stores the last rendered text, to prevent unnecessary updates - mesh: Mesh - -const NEWLINE = Rune('\n') SPACE = Rune(' ') + + # font shader + MAX_TEXT_MATERIALS = 10 + SHADER_ATTRIB_PREFIX = "semicon_text_" POSITION_ATTRIB = SHADER_ATTRIB_PREFIX & "position" UV_ATTRIB = SHADER_ATTRIB_PREFIX & "uv" TEXT_MATERIAL_TYPE* = MaterialType( @@ -64,6 +44,26 @@ fragmentCode = &"""color = vec4(Uniforms.color[materialIndexOut].rgb, Uniforms.color[materialIndexOut].a * texture(fontAtlas[materialIndexOut], uvFrag).r);""" ) +var instanceCounter = 0 + +type + Text* = object + maxLen*: int + font*: Font + maxWidth: float32 = 0 + # properties: + text: seq[Rune] + position: Vec2f + horizontalAlignment: HorizontalAlignment = Center + verticalAlignment: VerticalAlignment = Center + scale: float32 + aspect_ratio: float32 + # management/internal: + dirty: bool # is true if any of the attributes changed + processedText: seq[Rune] # used to store processed (word-wrapper) text to preserve original + lastRenderedText: seq[Rune] # stores the last rendered text, to prevent unnecessary updates + mesh: Mesh + func `$`*(text: Text): string = "\"" & $text.text[0 ..< min(text.text.len, 16)] & "\"" @@ -273,9 +273,9 @@ [uint16(offset + 2), uint16(offset + 3), uint16(offset + 0)], ] - result = Text(maxLen: maxLen, text: text, font: font, dirty: true, scale: scale, position: position, aspect_ratio: 1, horizontalAlignment: horizontalAlignment, verticalAlignment: verticalAlignment, maxWidth: maxWidth) + result = Text(maxLen: maxLen, font: font, dirty: true, scale: scale, position: position, aspect_ratio: 1, horizontalAlignment: horizontalAlignment, verticalAlignment: verticalAlignment, maxWidth: maxWidth) + `text=`(result, text) result.mesh = newMesh(positions = positions, indices = indices, uvs = uvs, name = &"text-{instanceCounter}") - inc instanceCounter result.mesh[].renameAttribute("position", POSITION_ATTRIB) result.mesh[].renameAttribute("uv", UV_ATTRIB) result.mesh.material = initMaterialData( @@ -283,6 +283,7 @@ name = font.name & " text", attributes = {"fontAtlas": initDataList(@[font.fontAtlas]), "color": initDataList(@[color])}, ) + inc instanceCounter result.refresh()
--- a/tests/test_font.nim Fri Feb 09 20:02:55 2024 +0700 +++ b/tests/test_font.nim Sat Feb 10 15:54:25 2024 +0700 @@ -22,7 +22,7 @@ Vertical alignment: F4: Top F5: Center - F6: Bottom""", scale = 0.0002, position = newVec2f(0, 0), horizontalAlignment = Left, verticalAlignment = Top) + F6: Bottom""", scale = 0.0002, position = newVec2f(-0.9, -0.9), horizontalAlignment = Left, verticalAlignment = Top) scene.add main_text scene.add help_text engine.loadScene(scene)