diff options
| author | HampusM <hampus@hampusmat.com> | 2026-08-02 18:08:42 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-08-02 18:08:42 +0200 |
| commit | 5120c19887ffac15f5d26eacbf38db4376533e62 (patch) | |
| tree | 1fa14fcfacf0113057fcd362b58cc2e88bc0a490 /engine/src/rendering/shader | |
| parent | 7b0edcfc6a07ff4d64e602f2b68d93fedc8b826d (diff) | |
feat(engine): add scenes
Diffstat (limited to 'engine/src/rendering/shader')
| -rw-r--r-- | engine/src/rendering/shader/default.rs | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/engine/src/rendering/shader/default.rs b/engine/src/rendering/shader/default.rs index 1c883b0..32cdc47 100644 --- a/engine/src/rendering/shader/default.rs +++ b/engine/src/rendering/shader/default.rs @@ -1,17 +1,16 @@ use std::path::Path; use std::sync::LazyLock; -use ecs::query::term::With; - use crate::asset::{Assets, Label as AssetLabel}; use crate::camera::{Active as ActiveCamera, Camera}; use crate::data_types::dimens::Dimens; use crate::draw_flags::NoDraw; use crate::ecs::actions::Actions; -use crate::ecs::query::term::Without; +use crate::ecs::query::term::{Traverse, TraverseUp, With, Without}; +use crate::ecs::pair::ChildOf; use crate::ecs::sole::Single; use crate::ecs::Query; -use crate::lighting::{DirectionalLight, GlobalLight, PointLight}; +use crate::lighting::{DirectionalLight, Environmental as EnvironmentalLighting, PointLight}; use crate::material::{Flags as MaterialFlags, Material}; use crate::matrix::Matrix; use crate::model::{MaterialSearchResult, Model}; @@ -31,6 +30,7 @@ use crate::rendering::{ 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::{Scale, Transform, WorldPosition}; use crate::vector::Vec3; @@ -60,22 +60,32 @@ pub fn initialize(mut assets: Single<Assets>) -> Result<(), crate::Error> pub fn enqueue_set_shader_bindings( renderable_query: Query<RenderableEntity<'_>>, - camera_query: Query<(&Camera, &WorldPosition, &ActiveCamera)>, + camera_query: Query<( + &Camera, + &WorldPosition, + &ActiveCamera, + Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf> + )>, window_query: Query<(&Window, &SurfaceSpec, With<RenderingTargetWindow>)>, - point_light_query: Query<(&PointLight, &WorldPosition)>, - directional_light_query: Query<(&DirectionalLight,)>, + point_light_query: Query<( + &PointLight, + &WorldPosition, + 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>, - global_light: Single<GlobalLight>, mut actions: Actions, ) -> Result<(), crate::Error> { let assets = assets.get()?; let shader_context = shader_context.get()?; - let global_light = global_light.get()?; let Some((camera, camera_world_pos, _)) = camera_query.iter().next() else { - tracing::trace!("No current camera"); + tracing::trace!("No active camera"); return Ok(()); }; @@ -85,7 +95,7 @@ pub fn enqueue_set_shader_bindings( for ( entity_id, - (model, material_flags, world_pos, scale, shader, mut pending_shader_bindings), + (model, environmental_lighting, material_flags, world_pos, scale, shader, mut pending_shader_bindings), ) in renderable_query.iter_with_euids() { let shader_asset = match &shader { @@ -161,10 +171,17 @@ pub fn enqueue_set_shader_bindings( .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 = create_view_matrix(&camera, camera_world_pos.position); + shader_bindings.bindings.extend([ model_3d_shader_cursor .field("model") @@ -174,7 +191,7 @@ pub fn enqueue_set_shader_bindings( .binding(inverted_model_matrix.into())?, model_3d_shader_cursor .field("view") - .binding(create_view_matrix(&camera, camera_world_pos.position).into())?, + .binding(view.into())?, lighting_shader_cursor .field("view_pos") .binding(camera_world_pos.position.into())?, @@ -182,7 +199,7 @@ pub fn enqueue_set_shader_bindings( (if material_flags.use_ambient_color { &model_material.ambient } else { - &global_light.ambient + &env_lighting.ambient_color } .clone()) .into(), @@ -396,6 +413,7 @@ fn create_projection_matrix( type RenderableEntity<'a> = ( &'a Model, + Traverse<(Option<&'a EnvironmentalLighting>, With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>, Option<&'a MaterialFlags>, Option<&'a WorldPosition>, Option<&'a Scale>, |
