From 88ca9cd1141272128d8ac0148bde30f948481bdd Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sat, 8 May 2021 22:57:14 -0500 Subject: [PATCH] slightly better font rendering; using 'em' units --- build.bat | 10 ++++++++++ src/font/bitmap_font.onyx | 30 ++++++++++++++++++++++++----- src/res/font.data | Bin 262144 -> 262144 bytes src/res/font_2.data | Bin 0 -> 262144 bytes src/tower.onyx | 39 ++++++++++++++++++++++++++++---------- 5 files changed, 64 insertions(+), 15 deletions(-) create mode 100644 build.bat create mode 100644 src/res/font_2.data diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..c70f55d --- /dev/null +++ b/build.bat @@ -0,0 +1,10 @@ +@echo off + +set TARGET=site\tower.wasm +set ONYX_INSTALLATION_FOLDER=\dev\onyx + +copy "%ONYX_INSTALLATION_FOLDER%\bin\onyx-loader.js" .\site\js\onyx-loader.js >NUL +copy "%ONYX_INSTALLATION_FOLDER%\modules\webgl2\webgl2.js" .\site\js\webgl2.js >NUL +copy "%ONYX_INSTALLATION_FOLDER%\modules\js_events\js_events.js" .\site\js\js_events.js >NUL + +\dev\onyx\onyx -r js --use-post-mvp-features -V -o %TARGET% src\build.onyx -I %ONYX_INSTALLATION_FOLDER% diff --git a/src/font/bitmap_font.onyx b/src/font/bitmap_font.onyx index 1ec0cb5..8807862 100644 --- a/src/font/bitmap_font.onyx +++ b/src/font/bitmap_font.onyx @@ -30,10 +30,13 @@ use package core Bitmap_Font :: struct { font_texture : Bitmap_Font_Texture; + em: f32; // Width of 'M' + glyphs : map.Map(u32, Glyph); Glyph :: struct { x0, y0, x1, y1: f32; + w, h: f32; } get_glyph :: (use bmp: ^Bitmap_Font, char: u8) -> ^Glyph { @@ -49,10 +52,15 @@ Bitmap_Font_Texture :: struct { // NOTE: Assumes pixels are laid out in RGBA format. get_pixel :: (use texture: ^Bitmap_Font_Texture, x: u32, y: u32) -> u32 { - return (cast(u32) data[(y * width + x) * Components_Per_Pixel + 0] << 24) - | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 1] << 16) - | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 2] << 8) - | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 3] << 0); + return (cast(^u32) data.data)[y * width + x]; + + // SPEED: All of these values could be read simultaneously by treating the data + // array as a slice of u32, and then not multiplying by Components_Per_Pixel. + // + // return (cast(u32) data[(y * width + x) * Components_Per_Pixel + 0] << 24) + // | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 1] << 16) + // | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 2] << 8) + // | (cast(u32) data[(y * width + x) * Components_Per_Pixel + 3] << 0); } } @@ -66,7 +74,7 @@ bitmap_font_create :: (bft: Bitmap_Font_Texture, glyph_str: str) -> Bitmap_Font bmp: Bitmap_Font; bmp.font_texture = bft; - map.init(^bmp.glyphs, .{0,0,0,0}); + map.init(^bmp.glyphs, .{0,0,0,0,0,0}); success := bitmap_font_prepare_glyphs(^bmp, glyph_str); assert(success, "Failed to load glyphs out of font."); @@ -81,6 +89,8 @@ bitmap_font_prepare_glyphs :: (use bmp: ^Bitmap_Font, glyph_str: str) -> bool { g_x0, g_y0 = 0, 0; for glyph_char: glyph_str { + if g_y0 >= font_texture.height do return false; + // These will need to be converted to floating point when they are inserted into the glyph, // but it is easier to think about them as actual pixel coordinates when parsing the glyphs. x0, y0, x1, y1: u32; @@ -95,6 +105,8 @@ bitmap_font_prepare_glyphs :: (use bmp: ^Bitmap_Font, glyph_str: str) -> bool { y0 = cast(f32) y0 / ~~font_texture.height, x1 = cast(f32) x1 / ~~font_texture.width, y1 = cast(f32) y1 / ~~font_texture.height, + w = cast(f32) (x1 - x0) / ~~font_texture.width, + h = cast(f32) (y1 - y0) / ~~font_texture.height, }); g_x0 = x1 + 1; @@ -107,5 +119,13 @@ bitmap_font_prepare_glyphs :: (use bmp: ^Bitmap_Font, glyph_str: str) -> bool { } } + M_glyph := map.get_ptr(^glyphs, #char "M"); + if M_glyph != null { + em = M_glyph.w * ~~font_texture.width; + } else { + // ROBUSTNESS: If there is no 'M' in the character set, then just use 16. It will probably be very wrong. + em = 16; + } + return true; } diff --git a/src/res/font.data b/src/res/font.data index 96b8ec4c06cf978b1e45ef5306f0df325b39fab2..615eafbd72191e1cd88f15011f1f4289b42345c3 100644 GIT binary patch literal 262144 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 literal 262144 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 z8@!+YuH<=m9@c<0U=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!# zfHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r& z4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU z)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~w zU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=` z1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8 zHDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZ zSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!# zfHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r& z4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU z)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~w zU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=` z1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8 zHDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZ zSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!# zfHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r& z4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU z)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~w zU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=` z1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8 zHDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZ zSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!#fHhzZSOeC8HDC=`1J-~wU=3IU)_^r&4Oj!# WfHhzZSOeC8HDC=`1J=OnH1PicJ>8K2 literal 0 HcmV?d00001 diff --git a/src/tower.onyx b/src/tower.onyx index 35d0bd3..47a97a4 100644 --- a/src/tower.onyx +++ b/src/tower.onyx @@ -19,12 +19,15 @@ main :: (args: [] cstr) { init_font(); + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + start_loop :: () -> void #foreign "game" "start_loop" --- start_loop(); } init_font :: () { - font_data := #file_contents "src/res/font.data"; + font_data := #file_contents "src/res/font_2.data"; bft := bitmap_font.Bitmap_Font_Texture.{ data = font_data, @@ -32,7 +35,7 @@ init_font :: () { height = 256, }; - font = bitmap_font.bitmap_font_create(bft, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 \xff"); + font = bitmap_font.bitmap_font_create(bft, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 \xff:"); font_texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, font_texture); @@ -73,21 +76,37 @@ poll_events :: () { gl.setSize(event.resize.width, event.resize.height); gl.viewport(0, 0, event.resize.width, event.resize.height); + gfx.use_ortho_projection(0, ~~window_width, 0, ~~window_height); } } } +fps := 0; +fps_timer := 1.0f; +frames := 0 update :: (dt: f32) { + fps_timer -= dt; + frames += 1; + if fps_timer < 0 { + fps = frames; + frames = 0; + fps_timer = 1.0f; + } } draw :: () { gl.clearColor(0.1, 0.1, 0.1, 1); gl.clear(gl.COLOR_BUFFER_BIT); - gfx.use_ortho_projection(0, ~~window_width, 0, ~~window_height); + fps_buffer : [16] u8; + fps_str := conv.str_format("FPS: %i", ~~ fps_buffer, fps); + draw_text(fps_str, 0, 0, 32, .{0,1,0}); draw_text("Hello World", 100, 100, 128); - draw_text("something else...", 100, 230, 32); + draw_text("something else...", 100, 230, 32, .{1,0,0}); + + draw_text("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 100, 300, 16); + draw_text("abcdefghijklmnopqrstuvwxyz", 100, 340, 16); gfx.flush(); } @@ -96,11 +115,10 @@ draw :: () { -draw_text :: (text: str, x: f32, y: f32, size := 32.0f) { +draw_text :: (text: str, x: f32, y: f32, size := 32.0f, color := gfx.Color4.{1,1,1}) { gl.bindTexture(gl.TEXTURE_2D, font_texture); gfx.set_texture(0); - gfx.use_ortho_projection(0, ~~window_width, 0, ~~window_height); for char: text { glyph := font->get_glyph(char); @@ -110,13 +128,14 @@ draw_text :: (text: str, x: f32, y: f32, size := 32.0f) { assert(glyph != null, "NO NULL GLYPH"); } - gfx.textured_quad( + gfx.textured_rect( .{ x, y }, - .{ size, size }, + .{ glyph.w * size * font.em, glyph.h * size * font.em }, .{ glyph.x0, glyph.y0 }, - .{ glyph.x1 - glyph.x0, glyph.y1 - glyph.y0 }); + .{ glyph.x1 - glyph.x0, glyph.y1 - glyph.y0 }, + color = color); - x += size; + x += glyph.w * size * 16; } gfx.flush(); -- 2.25.1