summaryrefslogtreecommitdiff
path: root/engine/src/renderer/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/renderer/mod.rs')
-rw-r--r--engine/src/renderer/mod.rs79
1 files changed, 76 insertions, 3 deletions
diff --git a/engine/src/renderer/mod.rs b/engine/src/renderer/mod.rs
index 9cd379d..3c42f93 100644
--- a/engine/src/renderer/mod.rs
+++ b/engine/src/renderer/mod.rs
@@ -1,10 +1,17 @@
-use std::ffi::{c_void, CString};
+use std::ffi::{c_float, c_void, CString};
+use std::mem::size_of;
use std::process::abort;
+use std::ptr::null;
use glfw::WindowSize;
+use crate::renderer::vertex_array::{PrimitiveKind, VertexArray};
+use crate::renderer::vertex_buffers::{BufferUsage, VertexBuffers};
use crate::vector::Vec2;
+mod vertex_array;
+mod vertex_buffers;
+
pub fn initialize(window: &glfw::Window) -> Result<(), Error>
{
gl::load_with(|symbol| {
@@ -30,10 +37,51 @@ pub fn initialize(window: &glfw::Window) -> Result<(), Error>
Ok(())
}
-pub fn render()
+pub fn render<'renderable>(renderables: impl IntoIterator<Item = &'renderable Renderable>)
{
unsafe {
- gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
+ gl::Clear(gl::COLOR_BUFFER_BIT);
+ }
+
+ for renderable in renderables {
+ renderable.shader_program.activate();
+
+ renderable.vertex_arr.draw(PrimitiveKind::Triangles, 0, 3);
+ }
+}
+
+pub struct Renderable
+{
+ shader_program: crate::shader::Program,
+ vertex_arr: VertexArray,
+}
+
+impl Renderable
+{
+ pub fn new(shader_program: crate::shader::Program, vertices: &[f32]) -> Self
+ {
+ let vertex_arr = VertexArray::new();
+
+ vertex_arr.bind();
+
+ let vertex_buffer = VertexBuffers::<1>::new();
+
+ vertex_buffer
+ .store(0, vertices, BufferUsage::Static)
+ .unwrap();
+
+ vertex_attrib_ptr(0);
+ enable_vertex_attrib_array(0);
+
+ unsafe {
+ gl::BindBuffer(gl::ARRAY_BUFFER, 0);
+ gl::BindVertexArray(0);
+ }
+
+ Self {
+ shader_program,
+ vertex_arr,
+ }
}
}
@@ -57,3 +105,28 @@ pub enum Error
#[error("Failed to get window size")]
GetWindowSizeFailed(#[source] glfw::Error),
}
+
+fn vertex_attrib_ptr(index: usize)
+{
+ let stride = 3 * size_of::<c_float>();
+
+ unsafe {
+ #[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)]
+ gl::VertexAttribPointer(
+ index as gl::types::GLuint,
+ 3,
+ gl::FLOAT,
+ gl::FALSE,
+ stride as gl::types::GLsizei,
+ null(),
+ );
+ }
+}
+
+fn enable_vertex_attrib_array(index: usize)
+{
+ unsafe {
+ #[allow(clippy::cast_possible_truncation)]
+ gl::EnableVertexAttribArray(index as gl::types::GLuint);
+ }
+}