summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/lib.rs1
-rw-r--r--engine/src/lighting.rs36
-rw-r--r--engine/src/rendering/main_render_pass.rs5
-rw-r--r--engine/src/rendering/shader/default.rs44
-rw-r--r--engine/src/scene.rs8
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;