use crate::{
core::{
inspect::{Inspect, PropertyInfo},
pool::Handle,
visitor::{Visit, VisitResult, Visitor},
},
scene::{
graph::Graph,
light::{BaseLight, BaseLightBuilder, Light},
node::Node,
},
};
use std::ops::{Deref, DerefMut};
#[derive(Debug, Inspect)]
pub struct PointLight {
base_light: BaseLight,
#[inspect(min_value = 0.0, step = 0.001)]
shadow_bias: f32,
#[inspect(min_value = 0.0, step = 0.1)]
radius: f32,
}
impl Deref for PointLight {
type Target = BaseLight;
fn deref(&self) -> &Self::Target {
&self.base_light
}
}
impl DerefMut for PointLight {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.base_light
}
}
impl PointLight {
#[inline]
pub fn set_radius(&mut self, radius: f32) {
self.radius = radius.abs();
}
#[inline]
pub fn radius(&self) -> f32 {
self.radius
}
pub fn set_shadow_bias(&mut self, bias: f32) {
self.shadow_bias = bias;
}
pub fn shadow_bias(&self) -> f32 {
self.shadow_bias
}
pub fn raw_copy(&self) -> Self {
Self {
base_light: self.base_light.raw_copy(),
radius: self.radius,
shadow_bias: self.shadow_bias,
}
}
}
impl Visit for PointLight {
fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
visitor.enter_region(name)?;
self.base_light.visit("BaseLight", visitor)?;
self.radius.visit("Radius", visitor)?;
self.shadow_bias.visit("ShadowBias", visitor)?;
visitor.leave_region()
}
}
impl Default for PointLight {
fn default() -> Self {
Self {
base_light: Default::default(),
shadow_bias: 0.025,
radius: 10.0,
}
}
}
pub struct PointLightBuilder {
base_light_builder: BaseLightBuilder,
shadow_bias: f32,
radius: f32,
}
impl PointLightBuilder {
pub fn new(base_light_builder: BaseLightBuilder) -> Self {
Self {
base_light_builder,
shadow_bias: 0.025,
radius: 10.0,
}
}
pub fn with_radius(mut self, radius: f32) -> Self {
self.radius = radius;
self
}
pub fn with_shadow_bias(mut self, bias: f32) -> Self {
self.shadow_bias = bias;
self
}
pub fn build_point_light(self) -> PointLight {
PointLight {
base_light: self.base_light_builder.build(),
radius: self.radius,
shadow_bias: self.shadow_bias,
}
}
pub fn build_node(self) -> Node {
Node::Light(Light::Point(self.build_point_light()))
}
pub fn build(self, graph: &mut Graph) -> Handle<Node> {
graph.add_node(self.build_node())
}
}