new and better way of doing shaders
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 29 Jan 2022 04:03:23 +0000 (22:03 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 29 Jan 2022 04:03:23 +0000 (22:03 -0600)
14 files changed:
run_tree/assets/shaders/basic.glsl [new file with mode: 0644]
run_tree/assets/shaders/basic_fragment.glsl [deleted file]
run_tree/assets/shaders/basic_vertex.glsl [deleted file]
run_tree/assets/shaders/font.glsl [new file with mode: 0644]
run_tree/assets/shaders/font_fragment.glsl [deleted file]
run_tree/assets/shaders/font_vertex.glsl [deleted file]
run_tree/assets/shaders/imgui.glsl [new file with mode: 0644]
run_tree/assets/shaders/imgui_fragment.glsl [deleted file]
run_tree/assets/shaders/imgui_vertex.glsl [deleted file]
run_tree/lib/onyx_opengles.so
src/gfx/font.onyx
src/gfx/immediate.onyx
src/gfx/shader.onyx
src/main.onyx

diff --git a/run_tree/assets/shaders/basic.glsl b/run_tree/assets/shaders/basic.glsl
new file mode 100644 (file)
index 0000000..e6522e5
--- /dev/null
@@ -0,0 +1,34 @@
+precision mediump float;
+
+COMM vec4 v_col;
+
+#ifdef VERTEX_SHADER
+
+layout(location = 0) in vec2 a_pos;
+layout(location = 1) in vec4 a_col;
+
+layout(std140) uniform u_window_matrix_block {
+    mat4 u_view;
+};
+
+layout(std140) uniform u_world_matrix_block {
+    mat4 u_world;
+    mat4 u_model;
+};
+
+void main() {
+    gl_Position = u_view * u_world * u_model * vec4(a_pos, 0, 1);
+    v_col = a_col;
+}
+
+#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 (file)
index 521185f..0000000
+++ /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/basic_vertex.glsl b/run_tree/assets/shaders/basic_vertex.glsl
deleted file mode 100644 (file)
index f59a055..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#version 300 es
-precision mediump float;
-
-layout(location = 0) in vec2 a_pos;
-layout(location = 1) in vec4 a_col;
-
-layout(std140) uniform u_window_matrix_block {
-    mat4 u_view;
-};
-
-layout(std140) uniform u_world_matrix_block {
-    mat4 u_world;
-    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
diff --git a/run_tree/assets/shaders/font.glsl b/run_tree/assets/shaders/font.glsl
new file mode 100644 (file)
index 0000000..db0265d
--- /dev/null
@@ -0,0 +1,35 @@
+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;
+layout(location = 3) in vec2 a_tex_top_left;
+layout(location = 4) in vec2 a_tex_bottom_right;
+
+layout(std140) uniform u_window_matrix_block {
+    mat4 u_window;
+};
+
+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 (file)
index 8980446..0000000
+++ /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/font_vertex.glsl b/run_tree/assets/shaders/font_vertex.glsl
deleted file mode 100644 (file)
index 59019b6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#version 300 es
-precision mediump float;
-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;
-layout(location = 3) in vec2 a_tex_top_left;
-layout(location = 4) in vec2 a_tex_bottom_right;
-
-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);
-}
-
diff --git a/run_tree/assets/shaders/imgui.glsl b/run_tree/assets/shaders/imgui.glsl
new file mode 100644 (file)
index 0000000..16b6129
--- /dev/null
@@ -0,0 +1,35 @@
+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;
+
+layout(std140) uniform u_window_matrix_block {
+    mat4 u_window;
+};
+
+void main() {
+    gl_Position = u_window * vec4(a_pos, 0, 1);
+    v_tex = a_tex;
+    v_col = a_col;
+}
+
+#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 (file)
index 62e39fb..0000000
+++ /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/assets/shaders/imgui_vertex.glsl b/run_tree/assets/shaders/imgui_vertex.glsl
deleted file mode 100644 (file)
index 3fa601e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#version 300 es
-precision mediump float;
-layout(location = 0) in vec2 a_pos;
-layout(location = 1) in vec2 a_tex;
-layout(location = 2) in vec4 a_col;
-
-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
index cc89c8ceae7de89bc5d293eed274a2f643a69003..2b34641b14c9c438794dd39ee4952e529eff0345 100755 (executable)
Binary files a/run_tree/lib/onyx_opengles.so and b/run_tree/lib/onyx_opengles.so differ
index cb5d30753dedc5644ae354846299fb5ebc6d9d7d..dd78b0446823be0416825c055ebe97755eb4ca15 100644 (file)
@@ -16,7 +16,7 @@ use package opengles
 fonts_init :: () {
     map.init(^font_registry);
 
-    font_shader = shader_make("./assets/shaders/font_vertex.glsl", "./assets/shaders/font_fragment.glsl");
+    font_shader = shader_make("./assets/shaders/font.glsl");
     shader_use(font_shader);
     shader_link_window_matrix_block(font_shader);
 
@@ -150,6 +150,17 @@ font_draw :: (font: Font, x, y: f32, msg: str) {
     glBindVertexArray(-1);
 }
 
+font_get_width :: (font: Font, msg: str) -> 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 {
index b96d2244eef1978c1491d850ce69f01d64086294..9221bf473c126781d1de69c85605cb175c38671a 100644 (file)
@@ -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;
index e4394046b4526a90ce9c5d665ca6d9c5e4c9253f..246c3d1802deb261e02c176e334ce6ceb30dc948 100644 (file)
@@ -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;
index d450ae798be5ebc25a2c5132af5b1c172b8ef64d..a96a1e53ccc6509566994a1e56cd1efba45e39cb 100644 (file)
@@ -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);