// @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);
return program, success;
}
}
+
+ free :: (use shader: ^Shader) {
+ gl.deleteProgram(program);
+ }
}
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
},
}
- 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 });
}
}
(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();
-// 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"
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 {