summaryrefslogtreecommitdiff
path: root/engine/src/rendering/main_render_pass.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/rendering/main_render_pass.rs')
-rw-r--r--engine/src/rendering/main_render_pass.rs129
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();