summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/renderer.rs22
-rw-r--r--engine/src/renderer/opengl.rs32
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,