diff options
| author | HampusM <hampus@hampusmat.com> | 2026-04-20 15:11:38 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-04-20 15:11:38 +0200 |
| commit | 1adcfbf8d8850b9f57bd9fdf25f2148d77ee1772 (patch) | |
| tree | acb78cbcdb8c2e1342e02246c5f4bb863c19707a | |
| parent | 62e503a646397124e29948c786bb174289f39020 (diff) | |
feat(engine): add RemoveMesh renderer command
| -rw-r--r-- | engine/src/renderer.rs | 1 | ||||
| -rw-r--r-- | engine/src/renderer/object.rs | 5 | ||||
| -rw-r--r-- | engine/src/renderer/opengl.rs | 42 |
3 files changed, 48 insertions, 0 deletions
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<Object> + { + 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"); |
