diff options
| author | HampusM <hampus@hampusmat.com> | 2026-04-17 17:04:41 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-04-17 17:04:41 +0200 |
| commit | 6285d4e72141e714ee319cf616e888fc6868a993 (patch) | |
| tree | 3f67546a67c1408dfc9be2d321feb9e4edf27c4a | |
| parent | ef22fdcb1dbfc89aa524016637fe32597481e196 (diff) | |
feat(engine): make mesh in renderer::command::CreateMesh optional
| -rw-r--r-- | engine/src/renderer.rs | 22 | ||||
| -rw-r--r-- | engine/src/renderer/opengl.rs | 32 |
2 files changed, 46 insertions, 8 deletions
diff --git a/engine/src/renderer.rs b/engine/src/renderer.rs index a04fd4f..725f208 100644 --- a/engine/src/renderer.rs +++ b/engine/src/renderer.rs @@ -169,7 +169,15 @@ pub enum Command ActivateShader(ObjectId), SetShaderBinding(ShaderBindingLocation, ShaderBindingValue), CreateTexture(AssetHandle<Texture>), - CreateMesh(ObjectId, Mesh), + CreateMesh + { + obj_id: ObjectId, + + /// Optional mesh data. Must be included if `obj_id` is [`ObjectId::Sequential`]. + /// If `obj_id` is [`ObjectId::Asset`], this mesh data will be used instead of + /// the mesh data stored in the asset. + mesh: Option<Mesh>, + }, DrawMesh(ObjectId), SetPolygonModeConfig(PolygonModeConfig), } @@ -336,9 +344,9 @@ pub fn add_main_render_passes( continue; }; - let Some(mesh) = assets.get(mesh_asset) else { + if assets.get(mesh_asset).is_none() { continue; - }; + } debug_assert!(model_spec.material_names.len() <= 1); @@ -417,10 +425,10 @@ pub fn add_main_render_passes( } if !object_store.contains_with_id(&ObjectId::Asset(mesh_asset.id())) { - render_pass.commands.push(Command::CreateMesh( - ObjectId::Asset(mesh_asset.id()), - mesh.clone(), - )); + render_pass.commands.push(Command::CreateMesh { + obj_id: ObjectId::Asset(mesh_asset.id()), + mesh: None, + }); } render_pass diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index 1093292..2419f67 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -924,7 +924,7 @@ fn handle_commands( tracing::error!("Failed to create texture object: {err}"); } } - RendererCommand::CreateMesh(mesh_object_id, mesh) => { + RendererCommand::CreateMesh { obj_id: mesh_object_id, mesh } => { let Some(curr_gl_ctx) = &opt_curr_gl_ctx else { tracing::error!("No GL context is current"); continue; @@ -959,6 +959,36 @@ fn handle_commands( let key = *next_graphics_ctx_object_key; + let mesh = match mesh_object_id { + RendererObjectId::Asset(mesh_asset_id) => match mesh.as_ref() { + Some(mesh) => mesh, + None => { + let Some(mesh) = + assets.get(&AssetHandle::from_id(mesh_asset_id)) + else { + tracing::error!( + asset_id=?mesh_asset_id, + "Mesh asset does not exist" + ); + continue; + }; + + mesh + } + }, + RendererObjectId::Sequential(_) => { + let Some(mesh) = mesh.as_ref() else { + tracing::error!( + object_id=?mesh_object_id, + "Object ID is sequential but no mesh data is given" + ); + continue; + }; + + mesh + } + }; + let graphics_mesh = match GraphicsMesh::new(&curr_gl_ctx, &mesh, &vertex_desc) { Ok(graphics_mesh) => graphics_mesh, |
