diff options
| author | HampusM <hampus@hampusmat.com> | 2026-04-18 13:04:19 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-04-18 13:04:19 +0200 |
| commit | 770b64cb98c7e52d2ed3f75b817aaed5502461ab (patch) | |
| tree | cd29ad76f45adad128bacb5173f225237185572a /engine | |
| parent | 92a432415eaeb09aa5ad16304bcbba33e11ee222 (diff) | |
feat(engine): add UpdateMesh renderer command
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/src/renderer.rs | 6 | ||||
| -rw-r--r-- | engine/src/renderer/opengl.rs | 51 | ||||
| -rw-r--r-- | engine/src/renderer/opengl/graphics_mesh.rs | 42 |
3 files changed, 99 insertions, 0 deletions
diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index d7ce02e..bf1cb51 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -180,6 +180,12 @@ pub enum Command usage: MeshUsage, }, + UpdateMesh + { + obj_id: ObjectId, + mesh: Mesh, + usage: MeshUsage, + }, DrawMesh(ObjectId), SetPolygonModeConfig(PolygonModeConfig), } diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index 911a155..f1ca7a5 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -1026,6 +1026,57 @@ fn handle_commands( *next_graphics_ctx_object_key += 1; } + RendererCommand::UpdateMesh { + obj_id: mesh_object_id, + mesh, + usage: mesh_usage, + } => { + let Some(curr_gl_ctx) = &opt_curr_gl_ctx else { + tracing::error!("No GL context is current"); + continue; + }; + + let Some(mesh_graphics_ctx_obj_key) = renderer_object_store + .get_obj(&mesh_object_id) + .map(|obj| obj.as_raw()) + else { + tracing::error!( + object_id=?mesh_object_id, + "Object store does not contain a mesh object with this ID" + ); + continue; + }; + + let Some(mesh_graphics_ctx_obj) = + graphics_ctx_objects.get_mut(&mesh_graphics_ctx_obj_key) + else { + tracing::error!( + object_id=?mesh_object_id, + key=mesh_graphics_ctx_obj_key, + "Graphics context does not contain a mesh object with this key" + ); + continue; + }; + + #[allow(irrefutable_let_patterns)] + let GraphicsContextObject::Mesh { + mesh: graphics_mesh, + compatible_shader_program_obj_id: _, + } = mesh_graphics_ctx_obj + else { + tracing::error!( + object_id=?mesh_object_id, + key=mesh_graphics_ctx_obj_key, + "Graphics context object with this key is not a mesh" + ); + continue; + }; + + if let Err(err) = graphics_mesh.update(curr_gl_ctx, &mesh, mesh_usage) + { + tracing::error!("Failed to update mesh: {err}"); + } + } RendererCommand::DrawMesh(mesh_object_id) => { let Some(curr_gl_ctx) = &opt_curr_gl_ctx else { tracing::error!("No GL context is current"); diff --git a/engine/src/renderer/opengl/graphics_mesh.rs b/engine/src/renderer/opengl/graphics_mesh.rs index 3cf9181..c5ff0c6 100644 --- a/engine/src/renderer/opengl/graphics_mesh.rs +++ b/engine/src/renderer/opengl/graphics_mesh.rs @@ -143,6 +143,48 @@ impl GraphicsMesh }) } + pub fn update( + &mut self, + current_context: &GlCurrentContextWithFns<'_>, + mesh: &Mesh, + mesh_usage: MeshUsage, + ) -> Result<(), Error> + { + let buffer_usage = mesh_usage_to_gl_buffer_usage(mesh_usage); + + self.vertex_buffer + .store(current_context, mesh.vertex_buf().as_bytes(), buffer_usage) + .map_err(Error::StoreVerticesFailed)?; + + if let Some(indices) = mesh.indices() { + let index_buffer = self + .index_buffer + .get_or_insert_with(|| GlBuffer::new(current_context)); + + index_buffer + .store(current_context, indices, buffer_usage) + .map_err(Error::StoreIndicesFailed)?; + + self.vertex_arr + .bind_element_buffer(current_context, &index_buffer); + + self.element_cnt = indices + .len() + .try_into() + .expect("Mesh index count does not fit into a 32-bit unsigned int"); + + return Ok(()); + } + + self.element_cnt = mesh + .vertex_buf() + .len() + .try_into() + .expect("Mesh vertex count does not fit into a 32-bit unsigned int"); + + Ok(()) + } + pub fn destroy(&mut self, curr_gl_ctx: &GlCurrentContextWithFns<'_>) { self.vertex_arr.delete(curr_gl_ctx); |
