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 | |
| parent | 7b0edcfc6a07ff4d64e602f2b68d93fedc8b826d (diff) | |
feat(engine): add scenes
| -rw-r--r-- | engine/src/lib.rs | 1 | ||||
| -rw-r--r-- | engine/src/lighting.rs | 36 | ||||
| -rw-r--r-- | engine/src/rendering/main_render_pass.rs | 5 | ||||
| -rw-r--r-- | engine/src/rendering/shader/default.rs | 44 | ||||
| -rw-r--r-- | engine/src/scene.rs | 8 |
5 files changed, 71 insertions, 23 deletions
diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 7181543..0d9f531 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -22,6 +22,7 @@ pub mod material; pub mod math; pub mod mesh; pub mod model; +pub mod scene; pub mod projection; pub mod reflection; pub mod rendering; diff --git a/engine/src/lighting.rs b/engine/src/lighting.rs index abe3d56..eee6afc 100644 --- a/engine/src/lighting.rs +++ b/engine/src/lighting.rs @@ -1,7 +1,7 @@ use crate::builder; use crate::color::{Color, Rgb}; use crate::data_types::vector::Vec3; -use crate::ecs::{Component, Sole}; +use crate::ecs::Component; use crate::reflection::Reflection; builder! { @@ -91,21 +91,37 @@ impl DirectionalLight } builder! { -/// Global light properties. -#[builder(name = GlobalLightBuilder, derives = (Debug, Clone, Default))] -#[derive(Debug, Clone, Default, Sole)] +#[builder(name = EnvironmentalBuilder, derives = (Debug, Clone))] +#[derive(Debug, Clone, Component, Reflection)] #[non_exhaustive] -pub struct GlobalLight +pub struct Environmental { - pub ambient: Color<f32>, + pub ambient_color: Color<f32>, } } -impl GlobalLight +impl Environmental { - #[must_use] - pub fn builder() -> GlobalLightBuilder + pub fn builder() -> EnvironmentalBuilder + { + EnvironmentalBuilder::default() + } +} + +impl Default for Environmental +{ + fn default() -> Self { - GlobalLightBuilder::default() + Self::builder().build() + } +} + +impl Default for EnvironmentalBuilder +{ + fn default() -> Self + { + Self { + ambient_color: Color::Rgb(Rgb { r: 0.2, g: 0.2, b: 0.2 }) + } } } diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index d9132ef..b318f1a 100644 --- a/engine/src/rendering/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -1,3 +1,6 @@ +use ecs::pair::ChildOf; +use ecs::query::term::{Traverse, TraverseUp}; + use crate::asset::Assets; use crate::draw_flags::{DrawFlags, NoDraw, PolygonModeConfig}; use crate::ecs::query::term::{With, Without}; @@ -27,11 +30,13 @@ use crate::rendering::{ SurfaceSpec, TargetWindow, }; +use crate::scene::{Active as ActiveScene, Scene}; use crate::texture::{Texture, WHITE_1X1_ASSET_LABEL as TEXTURE_WHITE_1X1_ASSET_LABEL}; use crate::windowing::window::Window; type RenderableEntity<'a> = ( &'a Model, + Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>, Option<&'a DrawFlags>, Option<&'a Shader>, Option<&'a mut PendingShaderBindings>, 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>, diff --git a/engine/src/scene.rs b/engine/src/scene.rs new file mode 100644 index 0000000..18a25d2 --- /dev/null +++ b/engine/src/scene.rs @@ -0,0 +1,8 @@ +use crate::reflection::Reflection; +use crate::ecs::Component; + +#[derive(Debug, Clone, Component, Reflection)] +pub struct Scene; + +#[derive(Debug, Clone, Copy, Component, Reflection)] +pub struct Active; |
