added quad rendering
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 2 Mar 2021 03:09:00 +0000 (21:09 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 2 Mar 2021 03:09:00 +0000 (21:09 -0600)
lib/gl/gl_utils.onyx
lib/immediate_renderer.onyx
test/basic.onyx

index 2d0ddd7465bb6edbb04a95aa8abc91175e34ab2c..0ad535976eeabd510bce0cfb5985bb60a863e3df 100644 (file)
@@ -26,6 +26,10 @@ Shader :: struct {
         // @Robustness: Errors in compiling the shaders are ignored right now.
         vertex_shader, _   := compile_shader(vertex_source,   gl.VERTEX_SHADER);
         fragment_shader, _ := compile_shader(fragment_source, gl.FRAGMENT_SHADER);
+        defer {
+            gl.deleteShader(vertex_shader);
+            gl.deleteShader(fragment_shader);
+        }
 
         // @Robustness: Errors in linking the program are ignored right now.
         shader_program, _ := link_program(vertex_shader, fragment_shader);
@@ -69,5 +73,9 @@ Shader :: struct {
             return program, success;
         }
     }
+
+    free :: (use shader: ^Shader) {
+        gl.deleteProgram(program);
+    }
 }
 
index 4ade840307f5840410289d06ceeb6b4e96eac52c..e6f4862fe87c7b4ceb46cc22bbda879c762ba549 100644 (file)
@@ -85,6 +85,25 @@ Immediate_Renderer :: struct {
         gl.bindBuffer(gl.ARRAY_BUFFER, -1);
     }
 
+    free :: (use ir: ^Immediate_Renderer) {
+        shader->free();
+
+        gl.deleteVertexArray(vertex_array);
+        gl.deleteBuffer(vertex_buffer);
+    }
+
+    flush :: (use ir: ^Immediate_Renderer) {
+        gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
+        gl.bufferSubData(gl.ARRAY_BUFFER, 0, .{ count = vertex_count * sizeof Immediate_Vertex, data = ~~verticies.data });
+        gl.bindBuffer(gl.ARRAY_BUFFER, -1);
+
+        gl.useProgram(shader.program);
+        gl.bindVertexArray(vertex_array);
+        gl.drawArrays(gl.TRIANGLES, 0, vertex_count);
+
+        vertex_count = 0;
+    }
+
     // As a small note, I love the pattern matching style of programming that
     // can be done in situtations like this. Now, this isn't the most efficient
     // because it is mostly just marshalling the arguments around, but the
@@ -105,16 +124,14 @@ Immediate_Renderer :: struct {
         },
     }
 
-    flush :: (use ir: ^Immediate_Renderer) {
-        gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
-        gl.bufferSubData(gl.ARRAY_BUFFER, 0, .{ count = vertex_count * sizeof Immediate_Vertex, data = ~~verticies.data });
-        gl.bindBuffer(gl.ARRAY_BUFFER, -1);
+    quad :: (use ir: ^Immediate_Renderer, position: Vector2, size: Vector2, color: Color4 = .{1,1,1,1}) {
+        immediate_renderer->push_vertex(.{ position.x,          position.y          }, color);
+        immediate_renderer->push_vertex(.{ position.x + size.x, position.y          });
+        immediate_renderer->push_vertex(.{ position.x + size.x, position.y + size.y });
 
-        gl.useProgram(shader.program);
-        gl.bindVertexArray(vertex_array);
-        gl.drawArrays(gl.TRIANGLES, 0, vertex_count);
-
-        vertex_count = 0;
+        immediate_renderer->push_vertex(.{ position.x,          position.y          });
+        immediate_renderer->push_vertex(.{ position.x + size.x, position.y + size.y });
+        immediate_renderer->push_vertex(.{ position.x,          position.y + size.y });
     }
 }
 
@@ -137,4 +154,8 @@ immediate_vertex :: proc {
     (position: Vector2, color: Color4) { immediate_renderer->push_vertex(position, color); },
 }
 
+immediate_quad :: (position: Vector2, size: Vector2, color: Color4 = .{1,1,1,1}) {
+    immediate_renderer->quad(position, size, color);
+}
+
 immediate_flush :: () do immediate_renderer->flush();
index a95ad5fdd2988ee1f0e4756a648d174a664883f6..7baf4137cd7d12c44067821ed31b905206245aa1 100644 (file)
@@ -1,12 +1,3 @@
-// Things still needed for an initial version:
-//  - HTML page that load the correct files. (ugh...)
-//  - Eventing system to talk to JS. This will not be directly used by the immediate
-//    mode renderer, because that defeats the whole point of the "immediate mode".
-//    However, it is some thing that should be provided, given that every application
-//    will need it or something very similar.
-//  - Event loop in this file.
-
-
 #load "core/std"
 #load "lib/imgui"
 #load "lib/events"
@@ -67,6 +58,8 @@ draw :: () {
         immediate_vertex(.{ -1.0f, 0 }, color=.{ 0, 1, 0, 1 });
         immediate_vertex(.{ 0, -1.0f }, color=.{ 0, 0, 1, 1 });
     }
+
+    immediate_quad(.{ 0, 0 }, .{ .1, .1 }, .{ 1, 0, 1, 1 });
 }
 
 loop :: () -> void #export {