From 6b906d89a43888132c9519f9dd33b1346c7d91bb Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 28 Jan 2022 22:03:23 -0600 Subject: [PATCH] new and better way of doing shaders --- .../shaders/{basic_vertex.glsl => basic.glsl} | 21 ++++++-- run_tree/assets/shaders/basic_fragment.glsl | 10 ---- .../shaders/{font_vertex.glsl => font.glsl} | 22 ++++++-- run_tree/assets/shaders/font_fragment.glsl | 13 ----- .../shaders/{imgui_vertex.glsl => imgui.glsl} | 27 ++++++++-- run_tree/assets/shaders/imgui_fragment.glsl | 14 ----- run_tree/lib/onyx_opengles.so | Bin 237120 -> 237120 bytes src/gfx/font.onyx | 13 ++++- src/gfx/immediate.onyx | 5 +- src/gfx/shader.onyx | 30 ++++++++--- src/main.onyx | 49 ++++++++++++------ 11 files changed, 128 insertions(+), 76 deletions(-) rename run_tree/assets/shaders/{basic_vertex.glsl => basic.glsl} (69%) delete mode 100644 run_tree/assets/shaders/basic_fragment.glsl rename run_tree/assets/shaders/{font_vertex.glsl => font.glsl} (65%) delete mode 100644 run_tree/assets/shaders/font_fragment.glsl rename run_tree/assets/shaders/{imgui_vertex.glsl => imgui.glsl} (51%) delete mode 100644 run_tree/assets/shaders/imgui_fragment.glsl diff --git a/run_tree/assets/shaders/basic_vertex.glsl b/run_tree/assets/shaders/basic.glsl similarity index 69% rename from run_tree/assets/shaders/basic_vertex.glsl rename to run_tree/assets/shaders/basic.glsl index f59a055..e6522e5 100644 --- a/run_tree/assets/shaders/basic_vertex.glsl +++ b/run_tree/assets/shaders/basic.glsl @@ -1,6 +1,9 @@ -#version 300 es precision mediump float; +COMM vec4 v_col; + +#ifdef VERTEX_SHADER + layout(location = 0) in vec2 a_pos; layout(location = 1) in vec4 a_col; @@ -13,9 +16,19 @@ layout(std140) uniform u_world_matrix_block { mat4 u_model; }; -out vec4 v_col; - void main() { gl_Position = u_view * u_world * u_model * vec4(a_pos, 0, 1); v_col = a_col; -} \ No newline at end of file +} + +#endif + +#ifdef FRAGMENT_SHADER + +out vec4 fragColor; + +void main() { + fragColor = vec4(v_col.xyz, 1); +} + +#endif diff --git a/run_tree/assets/shaders/basic_fragment.glsl b/run_tree/assets/shaders/basic_fragment.glsl deleted file mode 100644 index 521185f..0000000 --- a/run_tree/assets/shaders/basic_fragment.glsl +++ /dev/null @@ -1,10 +0,0 @@ -#version 300 es -precision mediump float; - -in vec4 v_col; - -out vec4 fragColor; - -void main() { - fragColor = vec4(v_col.xyz, 1); -} \ No newline at end of file diff --git a/run_tree/assets/shaders/font_vertex.glsl b/run_tree/assets/shaders/font.glsl similarity index 65% rename from run_tree/assets/shaders/font_vertex.glsl rename to run_tree/assets/shaders/font.glsl index 59019b6..db0265d 100644 --- a/run_tree/assets/shaders/font_vertex.glsl +++ b/run_tree/assets/shaders/font.glsl @@ -1,5 +1,9 @@ -#version 300 es precision mediump float; + +COMM vec2 v_texture; + +#ifdef VERTEX_SHADER + layout(location = 0) in vec2 a_interp; layout(location = 1) in vec2 a_pos_top_left; layout(location = 2) in vec2 a_pos_bottom_right; @@ -10,10 +14,22 @@ layout(std140) uniform u_window_matrix_block { mat4 u_window; }; -out vec2 v_texture; - void main() { gl_Position = u_window * vec4(mix(a_pos_top_left, a_pos_bottom_right, a_interp), 0, 1); v_texture = mix(a_tex_top_left, a_tex_bottom_right, a_interp); } +#endif + +#ifdef FRAGMENT_SHADER + +uniform sampler2D u_texture; +uniform vec4 u_color; + +out vec4 fragColor; + +void main() { + fragColor = vec4(u_color.rgb, u_color.a * texture(u_texture, v_texture).a); +} + +#endif diff --git a/run_tree/assets/shaders/font_fragment.glsl b/run_tree/assets/shaders/font_fragment.glsl deleted file mode 100644 index 8980446..0000000 --- a/run_tree/assets/shaders/font_fragment.glsl +++ /dev/null @@ -1,13 +0,0 @@ -#version 300 es -precision mediump float; - -in vec2 v_texture; - -uniform sampler2D u_texture; -uniform vec4 u_color; - -out vec4 fragColor; - -void main() { - fragColor = vec4(u_color.rgb, u_color.a * texture(u_texture, v_texture).a); -} diff --git a/run_tree/assets/shaders/imgui_vertex.glsl b/run_tree/assets/shaders/imgui.glsl similarity index 51% rename from run_tree/assets/shaders/imgui_vertex.glsl rename to run_tree/assets/shaders/imgui.glsl index 3fa601e..16b6129 100644 --- a/run_tree/assets/shaders/imgui_vertex.glsl +++ b/run_tree/assets/shaders/imgui.glsl @@ -1,5 +1,10 @@ -#version 300 es precision mediump float; + +COMM vec4 v_col; +COMM vec2 v_tex; + +#ifdef VERTEX_SHADER + layout(location = 0) in vec2 a_pos; layout(location = 1) in vec2 a_tex; layout(location = 2) in vec4 a_col; @@ -8,11 +13,23 @@ layout(std140) uniform u_window_matrix_block { mat4 u_window; }; -out vec4 v_col; -out vec2 v_tex; - void main() { gl_Position = u_window * vec4(a_pos, 0, 1); v_tex = a_tex; v_col = a_col; -} \ No newline at end of file +} + +#endif + +#ifdef FRAGMENT_SHADER + +uniform sampler2D u_texture; +uniform float u_texture_enabled; + +out vec4 fragColor; + +void main() { + fragColor = v_col * mix(vec4(1), texture(u_texture, v_tex), vec4(u_texture_enabled)); +} + +#endif diff --git a/run_tree/assets/shaders/imgui_fragment.glsl b/run_tree/assets/shaders/imgui_fragment.glsl deleted file mode 100644 index 62e39fb..0000000 --- a/run_tree/assets/shaders/imgui_fragment.glsl +++ /dev/null @@ -1,14 +0,0 @@ -#version 300 es -precision mediump float; - -in vec4 v_col; -in vec2 v_tex; - -uniform sampler2D u_texture; -uniform float u_texture_enabled; - -out vec4 fragColor; - -void main() { - fragColor = v_col * mix(vec4(1), texture(u_texture, v_tex), vec4(u_texture_enabled)); -} diff --git a/run_tree/lib/onyx_opengles.so b/run_tree/lib/onyx_opengles.so index cc89c8ceae7de89bc5d293eed274a2f643a69003..2b34641b14c9c438794dd39ee4952e529eff0345 100755 GIT binary patch delta 796 zcmX@Ghws21z6mop?=EHlgS#6Snlp(!=y=>^rYw+u>tb@$G^wdCdZXOKH@{&Lk!D=I znNej~O1l zBCQ~OmuG^+fGEHL$eRh{IS6=k9{+#Iqw^3{HxH8T6F~Jd zfQGzg-2pPPJM@A_@+FU6o~sZGLLYcAp7Q8q5@~k5zzEcC?Rtg3r{e$r|3C{2r=MBH;O0q?9wHg($Yw>sc(e+UEJ%plO+&Wzd>Y&bNFgGP zJ4C9dH#9R!h(&=-3H{;GDF6)YKfq9qJB)sRg|}~*#XNx-0AkG)CIA2c delta 793 zcmX@Ghws21z6mopcP?fCgPj`}nlp(c{LqdnZb@r#IJ3U+@Qqx1&zq(`o8K^rNHcbB zW|W)W!x+7J=Bkrd7;j8Zu4fG5=w|42z0>V_WBQ(Y#@_lXAcJ1#b-P~a6=?;ryIt=v zUT8f~V&&1zx;B%6!J`|90vv$6`7oY?fJf)?|Cc;E4*?Z>B%c6kKKOviV}=Lg2@l2# zuUU71%?Z8Yk$lOcm**;o=g}Sdz=QFWM<-LW>lH?z25Z+FHC-OvOsr1R?=&#V204m9sYiifs{ss_;T64n=|By!O!gy2-kRC{Y{7*x+ z>SG$*!AJq(jypi+#{U2B(H;BatS10zjTz76U`< z;q4ci84Y+QPq?YFZ35#R2~Oh&|Nl<_hHT>Yrz;qDE4b=00Yll9PoRy-nU~GAnVDIE ziHDtofk6Q%d<^E>M-{ET(dP#?I{rS2E52z{oQ_aTc>a@0w f32 { + x_, y_ := 0.0f, 0.0f; + + quad: stbtt_aligned_quad; + for msg { + stbtt_GetPackedQuad(font.chars.data, font.texture_width, font.texture_height, + ~~(it - #char " "), ^x_, ^y_, ^quad, false); + } + + return x_; +} FontDescriptor :: struct { diff --git a/src/gfx/immediate.onyx b/src/gfx/immediate.onyx index b96d224..9221bf4 100644 --- a/src/gfx/immediate.onyx +++ b/src/gfx/immediate.onyx @@ -7,7 +7,7 @@ immediate_init :: () { memory.alloc_slice(^vertex_data, Maximum_Vertex_Count); vertex_count = 0; - imgui_shader = shader_make(Shader_Vertex_Path, Shader_Fragment_Path); + imgui_shader = shader_make(Shader_Path); shader_use(imgui_shader); shader_link_window_matrix_block(imgui_shader); shader_set_uniform(imgui_shader, #cstr "u_texture_enabled", 0.0f); @@ -99,8 +99,7 @@ Immediate_Vertex :: struct { } #local { - Shader_Vertex_Path :: "./assets/shaders/imgui_vertex.glsl" - Shader_Fragment_Path :: "./assets/shaders/imgui_fragment.glsl" + Shader_Path :: "./assets/shaders/imgui.glsl" imgui_shader: Shader; Maximum_Vertex_Count :: 1023; diff --git a/src/gfx/shader.onyx b/src/gfx/shader.onyx index e439404..246c3d1 100644 --- a/src/gfx/shader.onyx +++ b/src/gfx/shader.onyx @@ -26,11 +26,10 @@ shaders_init :: () { glBindBufferBase(GL_UNIFORM_BUFFER, WORLD_MATRIX_BLOCK, world_matrix_block_buffer); } -shader_make :: (vertex_path, fragment_path: str) -> Shader { - vertex_shader := os.get_contents(vertex_path); - fragment_shader := os.get_contents(fragment_path); - vs := compile_shader(vertex_shader, GL_VERTEX_SHADER); - fs := compile_shader(fragment_shader, GL_FRAGMENT_SHADER); +shader_make :: (shader_path: str) -> Shader { + shader_source := os.get_contents(shader_path); + vs := compile_shader(shader_source, GL_VERTEX_SHADER); + fs := compile_shader(shader_source, GL_FRAGMENT_SHADER); prog := link_program(vs, fs); @@ -128,9 +127,24 @@ update_model_matrix :: (v: Vector2) { #local { compile_shader :: (source: str, type: GLenum) -> GLint { shader := glCreateShader(type); - source_data := source.data; - source_len := source.count; - glShaderSource(shader, 1, ^source_data, ^source_len); + + #persist VERTEX_HEADER := """ +#version 300 es +#define VERTEX_SHADER 1 +#define COMM out + """; + + #persist FRAGMENT_HEADER := """ +#version 300 es +#define FRAGMENT_SHADER 1 +#define COMM in + """; + + header := VERTEX_HEADER if type == GL_VERTEX_SHADER else FRAGMENT_HEADER; + sources : [] ^u8 = .[ header.data, source.data ]; + source_lens : [] i32 = .[ header.count, source.count ]; + + glShaderSource(shader, 2, sources.data, source_lens.data); glCompileShader(shader); success: GLint; diff --git a/src/main.onyx b/src/main.onyx index d450ae7..a96a1e5 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -4,6 +4,8 @@ use package opengles use package glfw3 #local runtime :: package runtime +DEBUG :: #defined(runtime.vars.DEBUG) + @GlobalVariable window: GLFWwindow_p @@ -11,7 +13,7 @@ window: GLFWwindow_p window_width: u32 window_height: u32 -main_font: Font; +#if DEBUG { debug_font: Font; } entity_manager: Entity_Manager; @@ -35,13 +37,23 @@ init :: () { update_view_matrix(); player_texture = texture_make(#cstr "./assets/images/player.png"); - main_font = font_lookup(.{"./assets/fonts/calibri.ttf", 32}); - entity_manager = entity_manager_make(); - player := Player.make(); - entity_manager->add(player); + #if DEBUG { debug_font = font_lookup(.{"./assets/fonts/calibri.ttf", 16}); } + + entity_manager = entity_manager_create(); + player := entity_manager->make(Player, .{ + pos = .{300, 300} + }); - entity_manager->add(Wall.make(.{100, 100}, .{200, 100})); + entity_manager->make(Wall, .{ .{100, 100}, .{400, 50} }); + entity_manager->make(Wall, .{ .{100, 100}, .{50, 400} }); + entity_manager->make(Wall, .{ .{450, 100}, .{50, 400} }); + entity_manager->make(Wall, .{ .{100, 450}, .{400, 50} }); + + entity_manager->make(Door, .{ .{150, 150}, .{50, 50} }); + entity_manager->make(Door, .{ .{400, 150}, .{50, 50} }); + entity_manager->make(Door, .{ .{400, 400}, .{50, 50} }); + entity_manager->make(Door, .{ .{150, 400}, .{50, 50} }); } update :: (dt: f32) { @@ -57,19 +69,26 @@ draw :: () { update_world_matrix(); update_model_matrix(.{0,0}); - immediate_set_color(.{0,0,1}); - immediate_rectangle(0, 0, 100, 100); - entity_manager->draw(); - mx, my := mouse_get_position(); - immediate_set_color(.{1,1,1}); - immediate_rectangle(~~mx, ~~my, 10, 10); + #if false { + mx, my := mouse_get_position(); + immediate_set_color(.{1,1,1}); + immediate_rectangle(~~mx, ~~my, 10, 10); + } immediate_flush(); - font_set_color(.{1,0,0}); - font_print(main_font, 0, 32, "FPS: {}", game_fps); + #if DEBUG { + font_set_color(.{1,0,0}); + font_print(debug_font, 0, 16, "FPS: {}", game_fps); + font_print(debug_font, 0, 32, "HEAP: {b16}", alloc.heap.get_watermark()); + font_print(debug_font, 0, 48, "FREE: {}KB", alloc.heap.get_freed_size() / 1024); + + version_buf : [32] u8; + version_str := conv.format(version_buf, "Version: {}.{}", runtime.vars.MAJOR_VERSION, runtime.vars.MINOR_VERSION); + font_print(debug_font, ~~window_width - font_get_width(debug_font, version_str), 16, version_str); + } glfwSwapBuffers(window); } @@ -107,7 +126,7 @@ run :: () { } } -create_window :: () => { +create_window :: () { #if runtime.compiler_os == .Linux { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); -- 2.25.1