diff options
Diffstat (limited to 'engine/src/renderer/mod.rs')
-rw-r--r-- | engine/src/renderer/mod.rs | 206 |
1 files changed, 85 insertions, 121 deletions
diff --git a/engine/src/renderer/mod.rs b/engine/src/renderer/mod.rs index 9b4acb4..617c60f 100644 --- a/engine/src/renderer/mod.rs +++ b/engine/src/renderer/mod.rs @@ -16,13 +16,7 @@ use crate::lighting::LightSource; use crate::material::Material; use crate::matrix::Matrix; use crate::mesh::Mesh; -use crate::opengl::buffer::{ - ArrayKind as ArrayBufferKind, - Buffer, - ElementArrayKind as ElementArrayBufferKind, - Usage as BufferUsage, -}; -use crate::opengl::currently_bound::CurrentlyBound; +use crate::opengl::buffer::{Buffer, Usage as BufferUsage}; #[cfg(feature = "debug")] use crate::opengl::debug::{MessageSeverity, MessageSource, MessageType}; use crate::opengl::shader::{ @@ -35,14 +29,18 @@ use crate::opengl::texture::{ Texture as GlTexture, TextureUnit, }; -use crate::opengl::vertex_array::{PrimitiveKind, VertexArray}; +use crate::opengl::vertex_array::{ + DataType as VertexArrayDataType, + PrimitiveKind, + VertexArray, +}; use crate::opengl::{clear_buffers, enable, BufferClearMask, Capability}; use crate::projection::new_perspective; use crate::shader::Program as ShaderProgram; use crate::texture::{Id as TextureId, List as TextureMap, Texture}; use crate::transform::Transform; use crate::vector::{Vec2, Vec3}; -use crate::vertex::Vertex; +use crate::vertex::{AttributeComponentType, Vertex}; use crate::window::Window; #[derive(Debug, Default)] @@ -124,45 +122,38 @@ fn render( clear_buffers(BufferClearMask::COLOR | BufferClearMask::DEPTH); - for (mesh, texture_map, shader_program, material, transform) in &query { + for (mesh, texture_list, shader_program, material, transform) in &query { let shader_program = gl_shader_programs .entry(shader_program.u64_hash()) .or_insert_with(|| create_gl_shader_program(&shader_program).unwrap()); - shader_program.activate(|shader_program_curr_bound| { - apply_transformation_matrices( - &transform, - shader_program, - &camera, - window.size().expect("Failed to get window size"), - &shader_program_curr_bound, - ); + apply_transformation_matrices( + &transform, + shader_program, + &camera, + window.size().expect("Failed to get window size"), + ); - apply_light( - &material, - shader_program, - light_source.as_deref(), - &camera, - &shader_program_curr_bound, - ); + apply_light(&material, shader_program, light_source.as_deref(), &camera); - for texture in &texture_map.list { - let gl_texture = gl_textures - .entry(texture.id()) - .or_insert_with(|| create_gl_texture(texture)); + for texture in &texture_list.list { + let gl_texture = gl_textures + .entry(texture.id()) + .or_insert_with(|| create_gl_texture(texture)); - let texture_unit = TextureUnit::from_texture_id(texture.id()) - .unwrap_or_else(|| { - panic!("Texture id {} is a invalid texture unit", texture.id()); - }); + let texture_unit = + TextureUnit::from_texture_id(texture.id()).unwrap_or_else(|| { + panic!("Texture id {} is a invalid texture unit", texture.id()); + }); - set_active_texture_unit(texture_unit); + set_active_texture_unit(texture_unit); - gl_texture.bind(|_| {}); - } + gl_texture.bind(); + } - draw_mesh(&mesh); - }); + shader_program.activate(); + + draw_mesh(&mesh); } } @@ -201,37 +192,24 @@ fn draw_mesh(mesh: &Mesh) // should be rethinked let renderable = Renderable::new(mesh.vertices(), mesh.indices()); - renderable.vertex_arr.bind(|vert_arr_curr_bound| { - if let Some(index_info) = &renderable.index_info { - VertexArray::draw_elements( - &vert_arr_curr_bound, - PrimitiveKind::Triangles, - 0, - index_info.cnt, - ); - } else { - VertexArray::draw_arrays( - &vert_arr_curr_bound, - PrimitiveKind::Triangles, - 0, - 3, - ); - } - }); + renderable.vertex_arr.bind(); + + if let Some(index_info) = &renderable.index_info { + VertexArray::draw_elements(PrimitiveKind::Triangles, 0, index_info.cnt); + } else { + VertexArray::draw_arrays(PrimitiveKind::Triangles, 0, 3); + } } fn create_gl_texture(texture: &Texture) -> GlTexture { - let gl_texture = GlTexture::new(); - - gl_texture.bind(|texture_curr_bound| { - GlTexture::generate( - &texture_curr_bound, - texture.dimensions(), - texture.image().as_bytes(), - texture.pixel_data_format(), - ); - }); + let mut gl_texture = GlTexture::new(); + + gl_texture.generate( + *texture.dimensions(), + texture.image().as_bytes(), + texture.pixel_data_format(), + ); gl_texture.apply_properties(texture.properties()); @@ -272,7 +250,7 @@ struct Renderable vertex_arr: VertexArray, /// Vertex and index buffer has to live as long as the vertex array - _vertex_buffer: Buffer<Vertex, ArrayBufferKind>, + _vertex_buffer: Buffer<Vertex>, index_info: Option<IndexInfo>, } @@ -280,31 +258,46 @@ impl Renderable { fn new(vertices: &[Vertex], indices: Option<&[u32]>) -> Self { - let vertex_arr = VertexArray::new(); - let vertex_buffer = Buffer::new(); + let mut vertex_arr = VertexArray::new(); + let mut vertex_buffer = Buffer::new(); let mut index_info = None; - vertex_arr.bind(|vert_arr_curr_bound| { - vertex_buffer.bind(|vert_buf_curr_bound| { - Buffer::store(&vert_buf_curr_bound, vertices, BufferUsage::Static); + vertex_buffer.store(vertices, BufferUsage::Static); - VertexArray::configure_attrs(&vert_arr_curr_bound, &vert_buf_curr_bound); - }); + vertex_arr.bind_vertex_buffer(0, &vertex_buffer, 0); - if let Some(indices) = indices { - let new_index_buffer = Buffer::new(); + let mut offset = 0u32; - new_index_buffer.bind(|index_buf_curr_bound| { - Buffer::store(&index_buf_curr_bound, indices, BufferUsage::Static); - }); + for attrib in Vertex::attrs() { + vertex_arr.enable_attrib(attrib.index); - index_info = Some(IndexInfo { - _buffer: new_index_buffer, - cnt: indices.len().try_into().unwrap(), - }); - } - }); + vertex_arr.set_attrib_format( + attrib.index, + match attrib.component_type { + AttributeComponentType::Float => VertexArrayDataType::Float, + }, + false, + offset, + ); + + vertex_arr.set_attrib_vertex_buf_binding(attrib.index, 0); + + offset += attrib.component_size * attrib.component_cnt as u32; + } + + if let Some(indices) = indices { + let mut index_buffer = Buffer::new(); + + index_buffer.store(indices, BufferUsage::Static); + + vertex_arr.bind_element_buffer(&index_buffer); + + index_info = Some(IndexInfo { + _buffer: index_buffer, + cnt: indices.len().try_into().unwrap(), + }); + } Self { vertex_arr, @@ -316,25 +309,16 @@ impl Renderable fn apply_transformation_matrices( transform: &Transform, - gl_shader_program: &GlShaderProgram, + gl_shader_program: &mut GlShaderProgram, camera: &Camera, window_size: Dimens<u32>, - shader_program_curr_bound: &CurrentlyBound<GlShaderProgram>, ) { - gl_shader_program.set_uniform_matrix_4fv( - shader_program_curr_bound, - cstr!("model"), - &transform.as_matrix(), - ); + gl_shader_program.set_uniform_matrix_4fv(cstr!("model"), &transform.as_matrix()); let view = create_view(camera); - gl_shader_program.set_uniform_matrix_4fv( - shader_program_curr_bound, - cstr!("view"), - &view, - ); + gl_shader_program.set_uniform_matrix_4fv(cstr!("view"), &view); #[allow(clippy::cast_precision_loss)] let projection = new_perspective( @@ -344,23 +328,17 @@ fn apply_transformation_matrices( 0.1, ); - gl_shader_program.set_uniform_matrix_4fv( - shader_program_curr_bound, - cstr!("projection"), - &projection, - ); + gl_shader_program.set_uniform_matrix_4fv(cstr!("projection"), &projection); } fn apply_light( material: &Material, - gl_shader_program: &GlShaderProgram, + gl_shader_program: &mut GlShaderProgram, light_source: Option<&LightSource>, camera: &Camera, - shader_program_curr_bound: &CurrentlyBound<GlShaderProgram>, ) { gl_shader_program.set_uniform_vec_3fv( - shader_program_curr_bound, cstr!("light.position"), &light_source.map_or_else(Vec3::default, |light_source| { light_source.position().clone() @@ -368,7 +346,6 @@ fn apply_light( ); gl_shader_program.set_uniform_vec_3fv( - shader_program_curr_bound, cstr!("light.ambient"), &light_source .map_or(Color::WHITE_F32, |light_source| { @@ -378,7 +355,6 @@ fn apply_light( ); gl_shader_program.set_uniform_vec_3fv( - shader_program_curr_bound, cstr!("light.diffuse"), &light_source .map_or(Color::WHITE_F32, |light_source| { @@ -388,7 +364,6 @@ fn apply_light( ); gl_shader_program.set_uniform_vec_3fv( - shader_program_curr_bound, cstr!("light.specular"), &light_source .map_or(Color::WHITE_F32, |light_source| { @@ -399,36 +374,25 @@ fn apply_light( #[allow(clippy::cast_possible_wrap)] gl_shader_program.set_uniform_1i( - shader_program_curr_bound, cstr!("material.ambient"), material.ambient_map().into_inner() as i32, ); #[allow(clippy::cast_possible_wrap)] gl_shader_program.set_uniform_1i( - shader_program_curr_bound, cstr!("material.diffuse"), material.diffuse_map().into_inner() as i32, ); #[allow(clippy::cast_possible_wrap)] gl_shader_program.set_uniform_1i( - shader_program_curr_bound, cstr!("material.specular"), material.specular_map().into_inner() as i32, ); - gl_shader_program.set_uniform_1fv( - shader_program_curr_bound, - cstr!("material.shininess"), - material.shininess(), - ); + gl_shader_program.set_uniform_1fv(cstr!("material.shininess"), material.shininess()); - gl_shader_program.set_uniform_vec_3fv( - shader_program_curr_bound, - cstr!("view_pos"), - &camera.position, - ); + gl_shader_program.set_uniform_vec_3fv(cstr!("view_pos"), &camera.position); } fn create_view(camera: &Camera) -> Matrix<f32, 4, 4> @@ -486,6 +450,6 @@ fn opengl_debug_message_cb( #[derive(Debug)] struct IndexInfo { - _buffer: Buffer<u32, ElementArrayBufferKind>, + _buffer: Buffer<u32>, cnt: u32, } |