From bcc91b3db8cd50795c21860cd7797581199d5589 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 19 Aug 2026 22:34:34 +0200 Subject: refactor(engine): move default shader bindings system to main_render_pass mod --- engine/src/rendering/shader/default.rs | 405 --------------------------------- 1 file changed, 405 deletions(-) delete mode 100644 engine/src/rendering/shader/default.rs (limited to 'engine/src/rendering/shader/default.rs') diff --git a/engine/src/rendering/shader/default.rs b/engine/src/rendering/shader/default.rs deleted file mode 100644 index 59d0c9e..0000000 --- a/engine/src/rendering/shader/default.rs +++ /dev/null @@ -1,405 +0,0 @@ -use std::path::Path; -use std::sync::LazyLock; - -use crate::asset::{Assets, Label as AssetLabel}; -use crate::camera::{Active as ActiveCamera, Camera}; -use crate::draw_flags::NoDraw; -use crate::ecs::actions::Actions; -use crate::ecs::pair::ChildOf; -use crate::ecs::query::term::{Traverse, TraverseUp, With, Without}; -use crate::ecs::sole::Single; -use crate::ecs::Query; -use crate::lighting::{ - DirectionalLight, - Environmental as EnvironmentalLighting, - PointLight, -}; -use crate::material::{Flags as MaterialFlags, Material}; -use crate::model::{MaterialSearchResult, Model}; -use crate::projection::ClipVolume as ProjectionClipVolume; -use crate::rendering::shader::cursor::{ - BindingTextureKind as ShaderBindingTextureKind, - BindingValue as ShaderBindingValue, - Cursor as ShaderCursor, -}; -use crate::rendering::shader::{ - Context as ShaderContext, - EntrypointFlags as ShaderEntrypointFlags, - ModuleSource as ShaderModuleSource, - Shader, -}; -use crate::rendering::{ - PendingShaderBindings, - SurfaceSpec, - TargetWindow as RenderingTargetWindow, -}; -use crate::scene::{Active as ActiveScene, Scene}; -use crate::texture::WHITE_1X1_ASSET_LABEL as TEXTURE_WHITE_1X1_ASSET_LABEL; -use crate::transform::Transform; -use crate::windowing::window::Window; - -pub static ASSET_LABEL: LazyLock = LazyLock::new(|| AssetLabel { - path: Path::new("").into(), - name: Some("default_shader".into()), -}); - -pub fn initialize(mut assets: Single) -> Result<(), crate::Error> -{ - assets.get_mut()?.store_with_label( - ASSET_LABEL.clone(), - ShaderModuleSource { - name: "default_shader.slang".into(), - file_path: Path::new("@engine/default_shader").into(), - source: include_str!("../../../res/default_shader.slang").into(), - link_entrypoints: ShaderEntrypointFlags::VERTEX - | ShaderEntrypointFlags::FRAGMENT, - }, - ); - - Ok(()) -} - -pub fn enqueue_set_shader_bindings( - renderable_query: Query>, - camera_query: Query<( - &Camera, - &Transform, - &ActiveCamera, - Traverse<(With, With), TraverseUp, ChildOf>, - )>, - window_query: Query<(&Window, &SurfaceSpec, With)>, - point_light_query: Query<( - &PointLight, - &Transform, - Traverse<(With, With), TraverseUp, ChildOf>, - )>, - directional_light_query: Query<( - &DirectionalLight, - Traverse<(With, With), TraverseUp, ChildOf>, - )>, - assets: Single, - shader_context: Single, - mut actions: Actions, -) -> Result<(), crate::Error> -{ - let assets = assets.get()?; - let shader_context = shader_context.get()?; - - let Some((camera, camera_transform, _)) = camera_query.iter().next() else { - tracing::trace!("No active camera"); - return Ok(()); - }; - - let default_shader_asset = assets - .get_handle_to_loaded::(ASSET_LABEL.clone()) - .unwrap(); - - for ( - entity_id, - ( - model, - environmental_lighting, - material_flags, - transform, - shader, - mut pending_shader_bindings, - ), - ) in renderable_query.iter_with_euids() - { - let shader_asset = match &shader { - Some(shader) => &shader.asset_handle, - None => &default_shader_asset, - }; - - if shader_asset.id() != default_shader_asset.id() { - continue; - } - - let has_pending_shader_bindings_comp = pending_shader_bindings.is_some(); - - let shader_bindings = match pending_shader_bindings.as_deref_mut() { - Some(pending_shader_bindings) => pending_shader_bindings, - None => &mut PendingShaderBindings::default(), - }; - - // Bindings are cleared to prevent them from growing infinitely - shader_bindings.bindings.clear(); - shader_bindings.surface_specific_bindings.clear(); - - let Some(shader_program) = shader_context.get_program(&shader_asset.id()) else { - continue; - }; - - let Some(model_spec) = assets.get(&model.spec_asset) else { - continue; - }; - - let shader_cursor = ShaderCursor::new( - shader_program - .reflection(0) - .unwrap() - .global_params_var_layout() - .unwrap(), - ); - - let transform = match transform.as_deref() { - Some(transform) => transform, - None => &Transform::default(), - }; - - let model_matrix = transform.to_matrix(); - let inverted_model_matrix = model_matrix.inverse(); - - 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 { - continue; - }; - - model_material - } - MaterialSearchResult::NotFound => { - continue; - } - MaterialSearchResult::NoMaterials => &Material::builder().build(), - }; - - if [ - &model_material.ambient_map, - &model_material.diffuse_map, - &model_material.specular_map, - ] - .into_iter() - .flatten() - .any(|texture_asset| !assets.is_loaded_and_has_type(&texture_asset)) - { - continue; - } - - let material_flags = material_flags - .as_deref() - .unwrap_or(&const { MaterialFlags::builder().build() }); - - let env_lighting = match &environmental_lighting { - Some(env_lighting) => &env_lighting, - None => &EnvironmentalLighting::default(), - }; - - let model_3d_shader_cursor = shader_cursor.field("Uniforms").field("model_3d"); - let lighting_shader_cursor = shader_cursor.field("Uniforms").field("lighting"); - let material_shader_cursor = lighting_shader_cursor.field("material"); - - let view = camera.to_view_matrix(camera_transform.position); - - shader_bindings.bindings.extend([ - model_3d_shader_cursor - .field("model") - .binding(model_matrix.into())?, - model_3d_shader_cursor - .field("model_inverted") - .binding(inverted_model_matrix.into())?, - model_3d_shader_cursor.field("view").binding(view.into())?, - lighting_shader_cursor - .field("view_pos") - .binding(camera_transform.position.into())?, - material_shader_cursor.field("ambient").binding( - (if material_flags.use_ambient_color { - &model_material.ambient - } else { - &env_lighting.ambient_color - } - .clone()) - .into(), - )?, - material_shader_cursor - .field("diffuse") - .binding(model_material.diffuse.clone().into())?, - material_shader_cursor - .field("specular") - .binding(model_material.specular.clone().into())?, - material_shader_cursor - .field("shininess") - .binding(model_material.shininess.into())?, - lighting_shader_cursor - .field("directional_light_cnt") - .binding( - u32::try_from(directional_light_query.iter().count()) - .expect( - "Directional light count does not fit in 32-bit unsigned integer", - ) - .into(), - )?, - lighting_shader_cursor.field("point_light_cnt").binding( - u32::try_from(point_light_query.iter().count()) - .expect("Point light count does not fit in 32-bit unsigned integer") - .into(), - )?, - ]); - - for (window, window_surface_spec) in &window_query { - shader_bindings.surface_specific_bindings.push(( - window_surface_spec.id, - model_3d_shader_cursor.field("projection").binding( - camera - .projection - .to_matrix_rh( - window.inner_size, - ProjectionClipVolume::NegOneToOne, - ) - .into(), - )?, - )); - } - - shader_bindings - .bindings - .reserve(point_light_query.iter().count() * 6); - - for (point_light_index, (point_light, point_light_transform)) in - point_light_query.iter().enumerate() - { - let point_light_shader_cursor = lighting_shader_cursor - .field("point_lights") - .element(point_light_index); - - let phong_shader_cursor = point_light_shader_cursor.field("phong"); - - let attenuation_props_shader_cursor = - point_light_shader_cursor.field("attenuation_props"); - - shader_bindings.bindings.extend([ - phong_shader_cursor - .field("diffuse") - .binding(point_light.diffuse.clone().into())?, - phong_shader_cursor - .field("specular") - .binding(point_light.specular.clone().into())?, - point_light_shader_cursor.field("position").binding( - (point_light_transform.position + point_light.local_position).into(), - )?, - attenuation_props_shader_cursor - .field("constant") - .binding(point_light.attenuation_params.constant.into())?, - attenuation_props_shader_cursor - .field("linear") - .binding(point_light.attenuation_params.linear.into())?, - attenuation_props_shader_cursor - .field("quadratic") - .binding(point_light.attenuation_params.quadratic.into())?, - ]); - } - - shader_bindings - .bindings - .reserve(directional_light_query.iter().count() * 3); - - for (directional_light_index, (directional_light,)) in - directional_light_query.iter().enumerate() - { - let directional_light_shader_cursor = lighting_shader_cursor - .field("directional_lights") - .element(directional_light_index); - - let phong_shader_cursor = directional_light_shader_cursor.field("phong"); - - shader_bindings.bindings.extend([ - phong_shader_cursor - .field("diffuse") - .binding(directional_light.diffuse.clone().into())?, - phong_shader_cursor - .field("specular") - .binding(directional_light.specular.clone().into())?, - directional_light_shader_cursor - .field("direction") - .binding(directional_light.direction.into())?, - ]); - } - - shader_bindings.bindings.push( - shader_cursor - .field("ambient_map") - .binding(ShaderBindingValue::Texture( - model_material - .ambient_map - .as_ref() - .map(|ambient_map| ambient_map.clone()) - .unwrap_or_else(|| { - assets - .get_handle_to_loaded( - TEXTURE_WHITE_1X1_ASSET_LABEL.clone(), - ) - .expect("Not possible") - }) - .id() - .into(), - ShaderBindingTextureKind::Texture2D, - ))?, - ); - - shader_bindings.bindings.push( - shader_cursor - .field("diffuse_map") - .binding(ShaderBindingValue::Texture( - model_material - .diffuse_map - .as_ref() - .map(|diffuse_map| diffuse_map.clone()) - .unwrap_or_else(|| { - assets - .get_handle_to_loaded( - TEXTURE_WHITE_1X1_ASSET_LABEL.clone(), - ) - .expect("Not possible") - }) - .id() - .into(), - ShaderBindingTextureKind::Texture2D, - ))?, - ); - - shader_bindings.bindings.push( - shader_cursor - .field("specular_map") - .binding(ShaderBindingValue::Texture( - model_material - .specular_map - .as_ref() - .map(|specular_map| specular_map.clone()) - .unwrap_or_else(|| { - assets - .get_handle_to_loaded( - TEXTURE_WHITE_1X1_ASSET_LABEL.clone(), - ) - .expect("Not possible") - }) - .id() - .into(), - ShaderBindingTextureKind::Texture2D, - ))?, - ); - - if !has_pending_shader_bindings_comp { - actions.add_components(entity_id, (shader_bindings.clone(),)); - } - } - - Ok(()) -} - -type RenderableEntity<'a> = ( - &'a Model, - Traverse< - ( - Option<&'a EnvironmentalLighting>, - With, - With, - ), - TraverseUp, - ChildOf, - >, - Option<&'a MaterialFlags>, - Option<&'a Transform>, - Option<&'a Shader>, - Option<&'a mut PendingShaderBindings>, - Without, -); -- cgit v1.2.3-18-g5258