added alpha shader to immediate renderer
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 9 Jun 2021 19:33:59 +0000 (14:33 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 9 Jun 2021 19:33:59 +0000 (14:33 -0500)
bin/onyx
core/conv.onyx
modules/bmfont/module.onyx
modules/immediate_mode/immediate_renderer.onyx

index ad7d83e7bc510ea0648aacb0dfd8ab76040efc02..baf357f2e776af2aff32b29c1a1c80f8ee49654f 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 5c7383cc8656b29ace4e6b141d8961996eae62c3..defdba68ce9927629ee5d9ba3c32bce2a2594674 100644 (file)
@@ -33,7 +33,7 @@ i64_to_str :: (n: i64, base: u64, buf: [] u8, min_length := 0) -> str {
     c := ^buf[buf.count - 1];
     len := 0;
 
-    // BUGFIX: Make this work with '::';
+    @Bug // Make this work with '::';
     BASE64_MAP := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
 
     while n > 0 {
index b0f20b2be1264dad943997dc433121e94bf313e0..2adacab33d757e9574a50913b1f54a7845940956 100644 (file)
@@ -16,4 +16,5 @@ package bmfont
 
 #load "./types"
 #load "./bmfont_loader"
+#load "./utils"
 
index 3c565a36e04f401a9d5a0595886c46ff0c978b8a..1c916c6677f91a7381aa8a59d175ac9f52a268e4 100644 (file)
@@ -23,6 +23,7 @@ Immediate_Renderer :: struct {
     active_shader : ^Shader;
 
     simple_shader, textured_shader : Shader;
+    alpha_shader : Shader;
 
     // 'verticies' contains the vertex data and the maximum number of verticies
     // that can be rendered at a given time. 'vertex_count' is used to store how
@@ -50,9 +51,11 @@ Immediate_Renderer :: struct {
         IMMEDIATE_VERTEX_SHADER            :: #file_contents "./shaders/basic_vertex.glsl"
         IMMEDIATE_FRAGMENT_SHADER          :: #file_contents "./shaders/basic_fragment.glsl"
         IMMEDIATE_FRAGMENT_SHADER_TEXTURED :: #file_contents "./shaders/textured_fragment.glsl"
+        IMMEDIATE_ALPHA_SHADER             :: #file_contents "./shaders/alpha_fragment.glsl"
 
         simple_shader   = Shader.make_from_source(IMMEDIATE_VERTEX_SHADER, IMMEDIATE_FRAGMENT_SHADER);
         textured_shader = Shader.make_from_source(IMMEDIATE_VERTEX_SHADER, IMMEDIATE_FRAGMENT_SHADER_TEXTURED);
+        alpha_shader    = Shader.make_from_source(IMMEDIATE_VERTEX_SHADER, IMMEDIATE_ALPHA_SHADER);
         active_shader   = ^simple_shader;
 
         verticies = memory.make_slice(Immediate_Vertex, max_verticies);
@@ -66,6 +69,7 @@ Immediate_Renderer :: struct {
         
         ir->init_shader_params(^simple_shader);
         ir->init_shader_params(^textured_shader);
+        ir->init_shader_params(^alpha_shader);
 
         gl.useProgram(active_shader.program);
     }
@@ -103,6 +107,7 @@ Immediate_Renderer :: struct {
     free :: (use ir: ^Immediate_Renderer) {
         simple_shader->free();
         textured_shader->free();
+        alpha_shader->free();
 
         gl.deleteVertexArray(vertex_array);
         gl.deleteBuffer(vertex_buffer);
@@ -186,6 +191,16 @@ Immediate_Renderer :: struct {
         gl.uniform1i(active_shader.texture_uniform, math.max(texture_id, 0));
     }
 
+    use_alpha_shader :: (use ir: ^Immediate_Renderer, texture_id: i32 = -1) {
+        if active_shader != ^alpha_shader {
+            if vertex_count > 0 do flush(ir);
+            active_shader = ^alpha_shader;
+        }
+
+        gl.useProgram(active_shader.program);
+        gl.uniform1i(active_shader.texture_uniform, math.max(texture_id, 0));
+    }
+
     use_ortho_projection :: (use ir: ^Immediate_Renderer, left: f32, right: f32, top: f32, bottom: f32) {
         projection_matrix := f32.[
             2 / (right - left), 0, 0, 0,
@@ -198,6 +213,8 @@ Immediate_Renderer :: struct {
         gl.uniformMatrix4(simple_shader.view_uniform, false, projection_matrix);
         gl.useProgram(textured_shader.program);
         gl.uniformMatrix4(textured_shader.view_uniform, false, projection_matrix);
+        gl.useProgram(alpha_shader.program);
+        gl.uniformMatrix4(alpha_shader.view_uniform, false, projection_matrix);
 
         gl.useProgram(active_shader.program);
     }
@@ -241,3 +258,7 @@ set_texture :: (texture_id: i32 = -1) do immediate_renderer->set_texture(texture
 use_ortho_projection :: (left: f32, right: f32, top: f32, bottom: f32) {
     immediate_renderer->use_ortho_projection(left, right, top, bottom);
 }
+
+use_alpha_shader :: (texture_id: i32 = -1) {
+    immediate_renderer->use_alpha_shader(texture_id);
+}