diff options
Diffstat (limited to 'engine/src/rendering')
| -rw-r--r-- | engine/src/rendering/main_render_pass.rs | 129 |
1 files changed, 69 insertions, 60 deletions
diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index cb38071..ca19a0f 100644 --- a/engine/src/rendering/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -26,7 +26,7 @@ use crate::lighting::{ }; use crate::material::{Flags as MaterialFlags, Material}; use crate::mesh::Mesh; -use crate::model::{MaterialSearchResult, Model}; +use crate::model::{ModelMaterial, ModelMesh}; use crate::projection::{ClipVolume as ProjectionClipVolume, Perspective, Projection}; use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; use crate::rendering::shader::cursor::{ @@ -70,7 +70,8 @@ use crate::vector::Vec3; use crate::windowing::window::Window; type RenderableEntity<'a> = ( - &'a Model, + &'a ModelMesh, + Option<&'a ModelMaterial>, Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>, Option<&'a MaterialFlags>, Option<&'a Transform>, @@ -157,8 +158,14 @@ pub fn add_main_render_pass( draw_properties: DrawProperties::default(), }); - for (model, ..) in &renderable_query { - add_renderable_creation_commands(assets, object_store, render_pass, &model); + for (mesh, material, ..) in &renderable_query { + add_renderable_creation_commands( + assets, + object_store, + render_pass, + &mesh, + material.as_deref(), + ); } let shaders = @@ -224,29 +231,24 @@ pub fn add_main_render_pass( .commands .push(Command::ClearBuffers(buf_clear_mask)); - for (model, material_flags, transform, draw_flags) in &renderable_query { - let Some(model_spec) = assets.get(&model.spec_asset) else { - continue; - }; - - let Some(mesh_asset) = &model_spec.mesh_asset else { - continue; - }; - - if assets.get(mesh_asset).is_none() { + for (mesh, material, material_flags, transform, draw_flags) in &renderable_query { + if assets.get(&mesh.asset).is_none() { continue; } - let model_material = match model_spec.find_first_material(assets) { - MaterialSearchResult::Found(model_material_asset) - if let Some(model_material) = assets.get(model_material_asset) => + let model_material = match material { + Some(material) + if let Some(material_desc) = assets.get(&material.asset) => { - model_material + match assets.get(&material_desc.asset) { + Some(material) => material, + None => continue, + } } - MaterialSearchResult::Found(_) | MaterialSearchResult::NotFound => { + Some(_) => { continue; } - MaterialSearchResult::NoMaterials => &Material::builder().build(), + None => &Material::default(), }; if model_material @@ -273,7 +275,9 @@ pub fn add_main_render_pass( .commands .push(Command::ActivateShader(shaders.main_3d_shader_obj_id)); - if let Some(draw_flags) = draw_flags.as_deref().filter(|&draw_flags| draw_flags.polygon_mode_config != PolygonModeConfig::default()) { + if let Some(draw_flags) = draw_flags.as_deref().filter(|&draw_flags| { + draw_flags.polygon_mode_config != PolygonModeConfig::default() + }) { render_pass.commands.push(Command::UpdateDrawProperties( DrawProperties { polygon_mode_config: draw_flags.polygon_mode_config.clone(), @@ -284,7 +288,7 @@ pub fn add_main_render_pass( } render_pass.commands.push(Command::DrawMesh( - ObjectId::Asset(mesh_asset.id()), + ObjectId::Asset(mesh.asset.id()), DrawMeshOptions::default(), )); @@ -466,37 +470,29 @@ fn add_renderable_creation_commands( assets: &Assets, object_store: &mut ObjectStore, render_pass: &mut RenderPass, - model: &Model, + mesh: &ModelMesh, + material: Option<&ModelMaterial>, ) { - let Some(model_spec) = assets.get(&model.spec_asset) else { - return; - }; - - let Some(mesh_asset) = &model_spec.mesh_asset else { - return; - }; - - if assets.get(mesh_asset).is_none() { + if assets.get(&mesh.asset).is_none() { return; } - debug_assert!(model_spec.materials.len() <= 1); - - let model_material = match model_spec.find_first_material(assets) { - MaterialSearchResult::Found(model_material_asset) => { - let Some(model_material) = assets.get(model_material_asset) else { - return; - }; - - model_material + let model_material = match material { + Some(material) if let Some(material_desc) = assets.get(&material.asset) => { + match assets.get(&material_desc.asset) { + Some(material) => material, + None => return, + } } - MaterialSearchResult::NotFound => { + Some(_) => { return; } - MaterialSearchResult::NoMaterials => &Material::builder().build(), + None => &Material::default(), }; + // debug_assert!(model_spec.materials.len() <= 1); + for texture_asset in model_material.textures() { let Some(texture) = assets.get(texture_asset) else { return; @@ -505,7 +501,8 @@ fn add_renderable_creation_commands( let Texture::Texture2D(texture) = texture else { tracing::error!( texture_asset_id = ?texture_asset.id(), - texture_asset_label = ?assets.get_label(texture_asset), + texture_asset_label = + assets.get_label(texture_asset).map(tracing::field::display), "Material texture map is not 2D" ); return; @@ -537,12 +534,14 @@ fn add_renderable_creation_commands( }); } - if !object_store.contains_maybe_pending_with_id(&ObjectId::Asset(mesh_asset.id())) { - object_store.insert_pending(ObjectId::Asset(mesh_asset.id())); + let mesh_obj_id = ObjectId::Asset(mesh.asset.id()); + + if !object_store.contains_maybe_pending_with_id(&mesh_obj_id) { + object_store.insert_pending(mesh_obj_id); render_pass.commands.push(Command::CreateMesh { - obj_id: ObjectId::Asset(mesh_asset.id()), - mesh: AssetOrValue::Asset(mesh_asset.clone()), + obj_id: mesh_obj_id, + mesh: AssetOrValue::Asset(mesh.asset.clone()), usage: MeshUsage::Static, }); } @@ -728,8 +727,8 @@ fn add_set_3d_shader_renderable_bindings( let model_matrix = transform.to_matrix(); let inverted_model_matrix = model_matrix.inverse(); - let material_flags = material_flags - .unwrap_or(&const { MaterialFlags::builder().build() }); + let material_flags = + material_flags.unwrap_or(&const { MaterialFlags::builder().build() }); let env_lighting = match &scene_env_lighting { Some(env_lighting) => env_lighting, @@ -747,7 +746,9 @@ fn add_set_3d_shader_renderable_bindings( let diffuse_map_obj_id = material .diffuse_map .as_ref() - .map_or(white_1x1_tex_obj_id, |diffuse_map| ObjectId::Asset(diffuse_map.id())); + .map_or(white_1x1_tex_obj_id, |diffuse_map_asset| { + ObjectId::Asset(diffuse_map_asset.id()) + }); render_pass.commands.extend( [ @@ -758,10 +759,13 @@ fn add_set_3d_shader_renderable_bindings( .field("model_inverted") .binding(inverted_model_matrix.into())?, material_shader_cursor.field("ambient").binding( - if material_flags - .use_ambient_color { &material.ambient } else { &env_lighting.ambient_color } - .to_rgb_lossy() - .into(), + if material_flags.use_ambient_color { + &material.ambient + } else { + &env_lighting.ambient_color + } + .to_rgb_lossy() + .into(), )?, material_shader_cursor .field("diffuse") @@ -774,7 +778,9 @@ fn add_set_3d_shader_renderable_bindings( material .ambient_map .as_ref() - .map_or(diffuse_map_obj_id, |ambient_map| ObjectId::Asset(ambient_map.id())), + .map_or(diffuse_map_obj_id, |ambient_map_asset| { + ObjectId::Asset(ambient_map_asset.id()) + }), ShaderBindingTextureKind::Texture2D, ), )?, @@ -789,7 +795,9 @@ fn add_set_3d_shader_renderable_bindings( material .specular_map .as_ref() - .map_or(white_1x1_tex_obj_id, |specular_map| ObjectId::Asset(specular_map.id())), + .map_or(white_1x1_tex_obj_id, |specular_map_asset| { + ObjectId::Asset(specular_map_asset.id()) + }), ShaderBindingTextureKind::Texture2D, ), )?, @@ -895,9 +903,10 @@ fn load_sky_box( actions: &mut Actions, ) -> Result<Option<SkyBoxIds>, crate::Error> { - let mesh_object_id = if let Some(sky_box_state) = &sky_box_state { sky_box_state.mesh_object_id } else { - let sky_box_mesh = - Mesh::cube(Dimens3 { width: 1.0, height: 1.0, depth: 1.0 }); + let mesh_object_id = if let Some(sky_box_state) = &sky_box_state { + sky_box_state.mesh_object_id + } else { + let sky_box_mesh = Mesh::cube(Dimens3 { width: 1.0, height: 1.0, depth: 1.0 }); let mesh_object_id = ObjectId::new_sequential(); |
