diff options
Diffstat (limited to 'engine/src/renderer/mod.rs')
-rw-r--r-- | engine/src/renderer/mod.rs | 79 |
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); + } +} |