summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/renderer.rs1
-rw-r--r--engine/src/renderer/object.rs5
-rw-r--r--engine/src/renderer/opengl.rs42
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");