From 3a679e846f812d1cc71aba066b1b203f697ea286 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Wed, 9 Jun 2021 14:34:45 -0500 Subject: [PATCH] switched to new font system (bmfont) --- modules/bmfont/utils.onyx | 51 +++++++++ .../shaders/alpha_fragment.glsl | 15 +++ modules/ui/components/button.onyx | 13 +-- modules/ui/resources/fonts/test.fnt | 100 ++++++++++++++++++ modules/ui/resources/fonts/test_0.data | Bin 0 -> 65536 bytes modules/ui/ui.onyx | 47 ++++---- src/onyxutils.c | 2 +- 7 files changed, 198 insertions(+), 30 deletions(-) create mode 100644 modules/bmfont/utils.onyx create mode 100644 modules/immediate_mode/shaders/alpha_fragment.glsl create mode 100644 modules/ui/resources/fonts/test.fnt create mode 100644 modules/ui/resources/fonts/test_0.data diff --git a/modules/bmfont/utils.onyx b/modules/bmfont/utils.onyx new file mode 100644 index 00000000..c4702976 --- /dev/null +++ b/modules/bmfont/utils.onyx @@ -0,0 +1,51 @@ +package bmfont + +#private_file math :: package core.math + +@Incomplete // does not use the size parameter +get_width :: (use font: ^BMFont, text: str, size: f32) -> f32 { + max_x := 0.0f; + x := 0.0f; + + for char: text { + if char == #char "\n" { + max_x = math.max(max_x, x); + x = 0.0f; + continue; + } + + glyph := font->get_glyph(char); + + if glyph == null { + glyph = font->get_glyph(0); + } + + x += ~~ glyph.xadvance * size; + } + + return math.max(max_x, x); +} + +@Incomplete // does not use the size parameter +get_height :: (use font: ^BMFont, text: str, size: f32) -> f32 { + max_y := 0.0f; + y := 0.0f; + + for char: text { + if char == #char "\n" { + y += max_y; + max_y = 0; + continue; + } + + glyph := font->get_glyph(char); + + if glyph == null { + glyph = font->get_glyph(0); + } + + max_y = math.max(max_y, ~~glyph.h * size); + } + + return y + max_y; +} \ No newline at end of file diff --git a/modules/immediate_mode/shaders/alpha_fragment.glsl b/modules/immediate_mode/shaders/alpha_fragment.glsl new file mode 100644 index 00000000..38d89add --- /dev/null +++ b/modules/immediate_mode/shaders/alpha_fragment.glsl @@ -0,0 +1,15 @@ +#version 300 es + +precision mediump float; + +uniform sampler2D u_texture; + +in vec4 v_color; +in vec2 v_texture; + +out vec4 fragColor; + +void main() { + float alpha = texture(u_texture, v_texture).a; + fragColor = v_color * alpha; +} \ No newline at end of file diff --git a/modules/ui/components/button.onyx b/modules/ui/components/button.onyx index c2923805..f5e3d947 100644 --- a/modules/ui/components/button.onyx +++ b/modules/ui/components/button.onyx @@ -54,12 +54,12 @@ button :: (use r: Rectangle, text: str, theme := ^default_button_theme, site := } if is_hot_item(hash) { - move_towards(^button_state.hover_time, 1.0f, 0.1f); + move_towards(^button_state.hover_time, 1.0f, 0.1f); @ThemeConfiguration } else { - move_towards(^button_state.hover_time, 0.0f, 0.1f); + move_towards(^button_state.hover_time, 0.0f, 0.1f); @ThemeConfiguration } - move_towards(^button_state.click_time, 0.0f, 0.08f); + move_towards(^button_state.click_time, 0.0f, 0.08f); @ThemeConfiguration border_width := theme.border_width; width, height := Rectangle.dimensions(r); @@ -70,10 +70,11 @@ button :: (use r: Rectangle, text: str, theme := ^default_button_theme, site := surface_color = color_lerp(button_state.click_time, surface_color, theme.click_color); gfx.rect(.{ x0 + border_width, y0 + border_width }, .{ width - border_width * 2, height - border_width * 2 }, surface_color); - text_width := 0.0f; @Cleanup // font->get_width(text, theme.font_size); - text_height := 0.0f; @Cleanup // font->get_height(text, theme.font_size); + text_width := bmfont.get_width(^font, text, theme.font_size); + text_height := bmfont.get_height(^font, text, theme.font_size); - draw_text_raw(text, x0 + (width - text_width) / 2, y0 + (height - text_height) / 2, theme.font_size, theme.text_color); + @ThemeConfiguration // This always draws the text centered on the button surface. + draw_text_raw(text, x0 + (width - text_width) / 2, y0 + ~~ font.common.baseline * theme.font_size + (height - text_height) / 2, theme.font_size, theme.text_color); if button_state.click_time > 0 || button_state.hover_time > 0 { map.put(^button_states, hash, button_state); diff --git a/modules/ui/resources/fonts/test.fnt b/modules/ui/resources/fonts/test.fnt new file mode 100644 index 00000000..15addba6 --- /dev/null +++ b/modules/ui/resources/fonts/test.fnt @@ -0,0 +1,100 @@ +info face="Fira Code Retina" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0 +common lineHeight=32 base=24 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4 +page id=0 file="test_0.tga" +chars count=96 +char id=-1 x=159 y=0 width=16 height=22 xoffset=0 yoffset=4 xadvance=16 page=0 chnl=15 +char id=32 x=252 y=0 width=3 height=1 xoffset=-1 yoffset=31 xadvance=16 page=0 chnl=15 +char id=33 x=249 y=42 width=6 height=19 xoffset=5 yoffset=5 xadvance=16 page=0 chnl=15 +char id=34 x=226 y=79 width=10 height=7 xoffset=3 yoffset=4 xadvance=16 page=0 chnl=15 +char id=35 x=129 y=46 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=36 x=5 y=0 width=14 height=28 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=37 x=97 y=26 width=16 height=20 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=38 x=98 y=47 width=15 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=39 x=237 y=79 width=4 height=7 xoffset=6 yoffset=4 xadvance=16 page=0 chnl=15 +char id=40 x=56 y=0 width=10 height=27 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=41 x=67 y=0 width=10 height=27 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=42 x=161 y=86 width=14 height=14 xoffset=1 yoffset=8 xadvance=16 page=0 chnl=15 +char id=43 x=176 y=84 width=14 height=13 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=44 x=191 y=83 width=6 height=10 xoffset=5 yoffset=19 xadvance=16 page=0 chnl=15 +char id=45 x=17 y=71 width=12 height=3 xoffset=2 yoffset=13 xadvance=16 page=0 chnl=15 +char id=46 x=17 y=111 width=6 height=5 xoffset=5 yoffset=19 xadvance=16 page=0 chnl=15 +char id=47 x=96 y=0 width=14 height=25 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=48 x=15 y=75 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=49 x=44 y=71 width=13 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=50 x=72 y=70 width=13 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=51 x=100 y=67 width=13 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=52 x=114 y=26 width=14 height=20 xoffset=1 yoffset=4 xadvance=16 page=0 chnl=15 +char id=53 x=128 y=67 width=13 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=54 x=0 y=75 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=55 x=129 y=25 width=12 height=20 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=56 x=114 y=47 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=57 x=237 y=0 width=14 height=21 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=58 x=154 y=86 width=6 height=15 xoffset=5 yoffset=9 xadvance=16 page=0 chnl=15 +char id=59 x=142 y=25 width=6 height=20 xoffset=5 yoffset=9 xadvance=16 page=0 chnl=15 +char id=60 x=128 y=87 width=12 height=15 xoffset=2 yoffset=8 xadvance=16 page=0 chnl=15 +char id=61 x=213 y=79 width=12 height=8 xoffset=2 yoffset=11 xadvance=16 page=0 chnl=15 +char id=62 x=60 y=90 width=13 height=15 xoffset=2 yoffset=8 xadvance=16 page=0 chnl=15 +char id=63 x=181 y=63 width=12 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=64 x=176 y=0 width=16 height=22 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=65 x=17 y=51 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=66 x=114 y=67 width=13 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=67 x=82 y=50 width=15 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=68 x=50 y=50 width=15 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=69 x=86 y=70 width=13 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=70 x=168 y=64 width=12 height=19 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15 +char id=71 x=34 y=51 width=15 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=72 x=204 y=43 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=73 x=155 y=66 width=12 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=74 x=58 y=70 width=13 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=75 x=189 y=43 width=14 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=76 x=142 y=66 width=12 height=19 xoffset=3 yoffset=5 xadvance=16 page=0 chnl=15 +char id=77 x=0 y=55 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=78 x=159 y=44 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=79 x=168 y=23 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=80 x=234 y=43 width=14 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=81 x=126 y=0 width=17 height=24 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=82 x=144 y=46 width=14 height=19 xoffset=2 yoffset=5 xadvance=16 page=0 chnl=15 +char id=83 x=66 y=50 width=15 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=84 x=236 y=22 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=85 x=174 y=43 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=86 x=219 y=23 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=87 x=149 y=24 width=18 height=19 xoffset=-1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=88 x=202 y=23 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=89 x=185 y=23 width=16 height=19 xoffset=0 yoffset=5 xadvance=16 page=0 chnl=15 +char id=90 x=219 y=43 width=14 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=91 x=78 y=0 width=8 height=26 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=92 x=111 y=0 width=14 height=25 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=15 +char id=93 x=87 y=0 width=8 height=26 xoffset=4 yoffset=1 xadvance=16 page=0 chnl=15 +char id=94 x=198 y=79 width=14 height=9 xoffset=1 yoffset=0 xadvance=16 page=0 chnl=15 +char id=95 x=24 y=111 width=14 height=3 xoffset=1 yoffset=26 xadvance=16 page=0 chnl=15 +char id=96 x=242 y=79 width=8 height=5 xoffset=4 yoffset=3 xadvance=16 page=0 chnl=15 +char id=97 x=45 y=91 width=14 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=98 x=56 y=28 width=13 height=21 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=99 x=243 y=63 width=12 height=15 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=100 x=42 y=28 width=13 height=21 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=101 x=228 y=63 width=14 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=102 x=28 y=29 width=13 height=21 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=103 x=144 y=0 width=14 height=23 xoffset=1 yoffset=7 xadvance=16 page=0 chnl=15 +char id=104 x=84 y=27 width=12 height=21 xoffset=2 yoffset=3 xadvance=16 page=0 chnl=15 +char id=105 x=208 y=0 width=13 height=22 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=106 x=20 y=0 width=11 height=28 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=107 x=193 y=0 width=14 height=22 xoffset=2 yoffset=2 xadvance=16 page=0 chnl=15 +char id=108 x=0 y=33 width=13 height=21 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=15 +char id=109 x=211 y=63 width=16 height=15 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=110 x=102 y=87 width=12 height=15 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=111 x=0 y=95 width=14 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=112 x=70 y=28 width=13 height=21 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=113 x=14 y=29 width=13 height=21 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=114 x=74 y=90 width=13 height=15 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=115 x=88 y=90 width=13 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=116 x=30 y=71 width=13 height=19 xoffset=1 yoffset=5 xadvance=16 page=0 chnl=15 +char id=117 x=115 y=87 width=12 height=15 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=118 x=15 y=95 width=14 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=119 x=194 y=63 width=16 height=15 xoffset=0 yoffset=9 xadvance=16 page=0 chnl=15 +char id=120 x=30 y=91 width=14 height=15 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=121 x=222 y=0 width=14 height=21 xoffset=1 yoffset=9 xadvance=16 page=0 chnl=15 +char id=122 x=141 y=87 width=12 height=15 xoffset=2 yoffset=9 xadvance=16 page=0 chnl=15 +char id=123 x=44 y=0 width=11 height=27 xoffset=2 yoffset=1 xadvance=16 page=0 chnl=15 +char id=124 x=0 y=0 width=4 height=32 xoffset=6 yoffset=0 xadvance=16 page=0 chnl=15 +char id=125 x=32 y=0 width=11 height=27 xoffset=3 yoffset=1 xadvance=16 page=0 chnl=15 +char id=126 x=0 y=111 width=16 height=5 xoffset=0 yoffset=13 xadvance=16 page=0 chnl=15 diff --git a/modules/ui/resources/fonts/test_0.data b/modules/ui/resources/fonts/test_0.data new file mode 100644 index 0000000000000000000000000000000000000000..7b2450bd2a937ce4102733ad2b991737d9ea4d24 GIT binary patch literal 65536 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 gGB6pK3`_+c|B`|K1BEorNdN!< literal 0 HcmV?d00001 diff --git a/modules/ui/ui.onyx b/modules/ui/ui.onyx index 48e4cd2d..16767989 100644 --- a/modules/ui/ui.onyx +++ b/modules/ui/ui.onyx @@ -8,7 +8,7 @@ use package core #private font_texture : gl.GLTexture; @Temporary -DEFAULT_TEXT_SIZE :: 40.0f +DEFAULT_TEXT_SIZE :: 1.0f UI_Id :: #type u32 @@ -34,7 +34,7 @@ mouse_state: MouseState = MouseState.{}; init_ui :: () { init_font(); - map.init(^button_states, default=.{}); + map.init(^button_states, default=.{}, hash_count=4); } clear_buttons :: () { @@ -100,13 +100,15 @@ is_hot_item :: (id: UI_Id) -> bool { return hot_item == id; } -draw_text_raw :: (text: str, x: f32, y: f32, line_height := DEFAULT_TEXT_SIZE, color := gfx.Color4.{1,1,1}) { +draw_text_raw :: (text: str, x: f32, y: f32, size := DEFAULT_TEXT_SIZE, color := gfx.Color4.{1,1,1}) { gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, font_texture); - gfx.set_texture(0); + gfx.use_alpha_shader(0); original_x := x; - baseline := cast(f32) font.common.baseline; + baseline := cast(f32) font.common.baseline * size; + + line_height := cast(f32) font.common.line_height * size; for char: text { if char == #char "\n" { @@ -122,19 +124,14 @@ draw_text_raw :: (text: str, x: f32, y: f32, line_height := DEFAULT_TEXT_SIZE, c assert(glyph != null, "NO NULL GLYPH"); } - // Round to the nearest pixel - tx, ty := math.floor(x + ~~glyph.xoffset + .5), math.floor(y + ~~glyph.yoffset + baseline + .5); - w := math.floor(cast(f32) glyph.w + .5); - h := math.floor(cast(f32) glyph.h + .5); + // Round to the nearest pixel to avoid bleeding to the next glyph + tx, ty := math.floor(x + ~~glyph.xoffset * size + .5), math.floor(y + ~~glyph.yoffset * size - baseline + .5); + w := math.floor(cast(f32) glyph.w * size + .5); + h := math.floor(cast(f32) glyph.h * size + .5); - gfx.textured_rect( - .{ tx, ty }, - .{ w, h }, - .{ glyph.tex_x, glyph.tex_y }, - .{ glyph.tex_w, glyph.tex_h }, - color = color); + gfx.textured_rect(.{ tx, ty }, .{ w, h }, .{ glyph.tex_x, glyph.tex_y }, .{ glyph.tex_w, glyph.tex_h }, color = color); - x += ~~glyph.xadvance; + x += ~~glyph.xadvance * size; } gfx.flush(); @@ -157,7 +154,7 @@ draw_rect :: proc { @Themeing draw_text :: (use r: Rectangle, text: str, theme := ^default_text_theme, site := #callsite) -> bool { - draw_text_raw(text, x0, y0, theme.font_size, theme.text_color); + draw_text_raw(text, x0, y0 + ~~font.common.baseline * theme.font_size, theme.font_size, theme.text_color); } Rectangle :: struct { @@ -195,7 +192,7 @@ Rectangle :: struct { @Relocate Text_Theme :: struct { text_color := gfx.Color4.{ 1, 1, 1 }; - font_size := 18.0f; + font_size := 1.0f; } default_text_theme: Text_Theme = Text_Theme.{}; @@ -217,14 +214,18 @@ get_site_hash :: (site: CallSite, increment := 0) -> UI_Id { } get_text_width :: (text: str, size := DEFAULT_TEXT_SIZE) -> f32 { - @Cleanup - return 0; // font->get_width(text, size); + return font->get_width(text, size); } +@Cleanup +// There should be a way to load multiple fonts and have a font cache. +// The font cache pointers should be stable so you can take a pointer +// to a font and it will remain valid. Probably want some kind of arena +// with a map from i32 -> ^BMFont. #private init_font :: () { - fnt_file_data := #file_contents "./resources/fonts/FiraCode.fnt"; - texture_data := #file_contents "./resources/fonts/FiraCode.data"; + fnt_file_data := #file_contents "./resources/fonts/test.fnt"; + texture_data := #file_contents "./resources/fonts/test_0.data"; font = bmfont.load_bmfont(fnt_file_data); @@ -232,7 +233,7 @@ get_text_width :: (text: str, size := DEFAULT_TEXT_SIZE) -> f32 { font_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, font_texture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, tex_width, tex_height, 0, gl.RGBA, gl.UNSIGNED_BYTE, texture_data); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, tex_width, tex_height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, texture_data); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); diff --git a/src/onyxutils.c b/src/onyxutils.c index 8d1d9ac9..cca3892d 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -225,7 +225,7 @@ void scope_clear(Scope* scope) { // Polymorphic Procedures // -AstNode node_that_signals_a_yield = {}; +AstNode node_that_signals_a_yield = { 0 }; static void ensure_polyproc_cache_is_created(AstPolyProc* pp) { if (pp->concrete_funcs == NULL) { -- 2.25.1