From 04dcc6a9a4c993de42088a02d658ddbc4678769b Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 1 Mar 2021 21:09:00 -0600 Subject: [PATCH] added quad rendering --- lib/gl/gl_utils.onyx | 8 ++++++++ lib/immediate_renderer.onyx | 39 ++++++++++++++++++++++++++++--------- test/basic.onyx | 11 ++--------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/lib/gl/gl_utils.onyx b/lib/gl/gl_utils.onyx index 2d0ddd7..0ad5359 100644 --- a/lib/gl/gl_utils.onyx +++ b/lib/gl/gl_utils.onyx @@ -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); + } } diff --git a/lib/immediate_renderer.onyx b/lib/immediate_renderer.onyx index 4ade840..e6f4862 100644 --- a/lib/immediate_renderer.onyx +++ b/lib/immediate_renderer.onyx @@ -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(); diff --git a/test/basic.onyx b/test/basic.onyx index a95ad5f..7baf413 100644 --- a/test/basic.onyx +++ b/test/basic.onyx @@ -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 { -- 2.25.1