summaryrefslogtreecommitdiff
path: root/engine/src/rendering/shader
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/rendering/shader')
-rw-r--r--engine/src/rendering/shader/default.rs405
1 files changed, 0 insertions, 405 deletions
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<AssetLabel> = LazyLock::new(|| AssetLabel {
- path: Path::new("").into(),
- name: Some("default_shader".into()),
-});
-
-pub fn initialize(mut assets: Single<Assets>) -> 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<RenderableEntity<'_>>,
- camera_query: Query<(
- &Camera,
- &Transform,
- &ActiveCamera,
- Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>,
- )>,
- window_query: Query<(&Window, &SurfaceSpec, With<RenderingTargetWindow>)>,
- point_light_query: Query<(
- &PointLight,
- &Transform,
- Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>,
- )>,
- directional_light_query: Query<(
- &DirectionalLight,
- Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>,
- )>,
- assets: Single<Assets>,
- shader_context: Single<ShaderContext>,
- 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::<ShaderModuleSource>(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<Scene>,
- With<ActiveScene>,
- ),
- TraverseUp,
- ChildOf,
- >,
- Option<&'a MaterialFlags>,
- Option<&'a Transform>,
- Option<&'a Shader>,
- Option<&'a mut PendingShaderBindings>,
- Without<NoDraw>,
-);