summaryrefslogtreecommitdiff
path: root/engine/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-04-18 13:04:19 +0200
committerHampusM <hampus@hampusmat.com>2026-04-18 13:04:19 +0200
commit770b64cb98c7e52d2ed3f75b817aaed5502461ab (patch)
treecd29ad76f45adad128bacb5173f225237185572a /engine/src
parent92a432415eaeb09aa5ad16304bcbba33e11ee222 (diff)
feat(engine): add UpdateMesh renderer command
Diffstat (limited to 'engine/src')
-rw-r--r--engine/src/renderer.rs6
-rw-r--r--engine/src/renderer/opengl.rs51
-rw-r--r--engine/src/renderer/opengl/graphics_mesh.rs42
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);