use crate::builder; use crate::color::{Color, Rgb}; use crate::data_types::vector::Vec3; use crate::ecs::Component; use crate::reflection::Reflection; builder! { #[builder(name = PointLightBuilder, derives = (Debug, Clone))] #[derive(Debug, Clone, Component, Reflection)] #[non_exhaustive] pub struct PointLight { /// Position in local space. pub local_position: Vec3, pub diffuse: Color, pub specular: Color, pub attenuation_params: AttenuationParams, } } impl PointLight { #[must_use] pub fn builder() -> PointLightBuilder { PointLightBuilder::default() } } impl Default for PointLight { fn default() -> Self { Self { local_position: Vec3::default(), diffuse: Color::Rgb(Rgb { r: 0.5, g: 0.5, b: 0.5 }), specular: Color::Rgb(Rgb::::white()), attenuation_params: AttenuationParams::default(), } } } impl Default for PointLightBuilder { fn default() -> Self { PointLight::default().into() } } /// Parameters for light [attenuation](https://en.wikipedia.org/wiki/Attenuation). #[derive(Debug, Clone, Reflection)] pub struct AttenuationParams { pub constant: f32, pub linear: f32, pub quadratic: f32, } impl Default for AttenuationParams { fn default() -> Self { Self { constant: 1.0, linear: 0.0, quadratic: 0.0, } } } builder! { #[builder(name = DirectionalLightBuilder, derives = (Debug, Default, Clone))] #[derive(Debug, Default, Clone, Component, Reflection)] #[non_exhaustive] pub struct DirectionalLight { pub diffuse: Color, pub specular: Color, pub direction: Vec3, } } impl DirectionalLight { #[must_use] pub fn builder() -> DirectionalLightBuilder { DirectionalLightBuilder::default() } } builder! { #[builder(name = EnvironmentalBuilder, derives = (Debug, Clone))] #[derive(Debug, Clone, Component, Reflection)] #[non_exhaustive] pub struct Environmental { pub ambient_color: Color, } } impl Environmental { pub fn builder() -> EnvironmentalBuilder { EnvironmentalBuilder::default() } } impl Default for Environmental { fn default() -> Self { 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 }) } } }