From 1adcfbf8d8850b9f57bd9fdf25f2148d77ee1772 Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 20 Apr 2026 15:11:38 +0200 Subject: feat(engine): add RemoveMesh renderer command --- engine/src/renderer.rs | 1 + engine/src/renderer/object.rs | 5 +++++ engine/src/renderer/opengl.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index 68e8aed..0a889cf 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -191,6 +191,7 @@ pub enum Command mesh: Mesh, usage: MeshUsage, }, + RemoveMesh(ObjectId), DrawMesh(ObjectId, DrawMeshOptions), UpdateDrawProperties(DrawProperties, DrawPropertiesUpdateFlags), } diff --git a/engine/src/renderer/object.rs b/engine/src/renderer/object.rs index 8e2254f..13be4a4 100644 --- a/engine/src/renderer/object.rs +++ b/engine/src/renderer/object.rs @@ -77,6 +77,11 @@ impl Store self.objects.insert(id, object); } + pub fn remove(&mut self, id: &Id) -> Option + { + self.objects.remove(id) + } + pub fn entry(&mut self, id: Id) -> StoreEntry<'_> { StoreEntry { inner: self.objects.entry(id) } diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index a713d41..63842d3 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -1090,6 +1090,48 @@ fn handle_commands( tracing::error!("Failed to update mesh: {err}"); } } + RendererCommand::RemoveMesh(mesh_object_id) => { + 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 + .remove(&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.remove(&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: mut graphics_mesh, .. } = + 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; + }; + + graphics_mesh.destroy(curr_gl_ctx); + } RendererCommand::DrawMesh(mesh_object_id, draw_mesh_opts) => { let Some(curr_gl_ctx) = &opt_curr_gl_ctx else { tracing::error!("No GL context is current"); -- cgit v1.2.3-18-g5258