comparison semiconginev2/text.nim @ 1234:841e12f33c47

add: text & font rendering, not tested yet
author sam <sam@basx.dev>
date Sat, 20 Jul 2024 00:03:57 +0700
parents
children 176383220123
comparison
equal deleted inserted replaced
1233:1cf698973dca 1234:841e12f33c47
1 const
2 NEWLINE = Rune('\n')
3 SPACE = Rune(' ')
4
5 type
6 GlyphInfo* = object
7 uvs*: array[4, Vec2f]
8 dimension*: Vec2f
9 topOffset*: float32
10 leftOffset*: float32
11 advance*: float32
12 FontObj* = object
13 name*: string
14 glyphs*: Table[Rune, GlyphInfo]
15 fontAtlas*: Image[Gray]
16 maxHeight*: int
17 kerning*: Table[(Rune, Rune), float32]
18 fontscale*: float32
19 lineHeight*: float32
20 lineAdvance*: float32
21 capHeight*: float32
22 xHeight*: float32
23 Font = ref FontObj
24
25 TextboxData = object
26 color: Vec4f
27 position: Vec3f
28 scale: float32
29 TextboxDescriptorSet = object
30 textbox: GPUValue[TextboxData, UniformBufferMapped]
31 fontAtlas: Image[Gray]
32
33 DefaultFontShader* = object
34 position {.VertexAttribute.}: Vec3f
35 uv {.VertexAttribute.}: Vec2f # TODO: maybe we can keep the uvs in a uniform buffer and just pass an index
36 fragmentUv {.Pass.}: Vec2f
37 color {.ShaderOutput.}: Vec4f
38 descriptorSets {.DescriptorSets.}: (TextboxDescriptorSet, )
39 vertexCode = &"""
40 gl_Position = vec4(position * textbox.scale + textbox.position, 1.0);
41 fragmentUv = uv;
42 """
43 fragmentCode = &"""color = vec4(textbox.color.rgb, textbox.color.rgb.a * texture(fontAtlas, fragmentUv).r);"""
44
45
46 include ./text/font
47 include ./text/textbox