summaryrefslogtreecommitdiff
path: root/engine/src/renderer/opengl
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/renderer/opengl
parent92a432415eaeb09aa5ad16304bcbba33e11ee222 (diff)
feat(engine): add UpdateMesh renderer command
Diffstat (limited to 'engine/src/renderer/opengl')
-rw-r--r--engine/src/renderer/opengl/graphics_mesh.rs42
1 files changed, 42 insertions, 0 deletions
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);