use crate::{
core::{
pool::Handle,
visitor::{Visit, VisitResult, Visitor},
},
scene::{
graph::Graph,
light::{BaseLight, BaseLightBuilder, Light},
node::Node,
},
};
use std::ops::{Deref, DerefMut};
#[derive(Default, Debug)]
pub struct DirectionalLight {
base_light: BaseLight,
}
impl From<BaseLight> for DirectionalLight {
fn from(base_light: BaseLight) -> Self {
Self { base_light }
}
}
impl Deref for DirectionalLight {
type Target = BaseLight;
fn deref(&self) -> &Self::Target {
&self.base_light
}
}
impl DerefMut for DirectionalLight {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.base_light
}
}
impl Visit for DirectionalLight {
fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
visitor.enter_region(name)?;
self.base_light.visit("BaseLight", visitor)?;
visitor.leave_region()
}
}
impl DirectionalLight {
pub fn raw_copy(&self) -> Self {
Self {
base_light: self.base_light.raw_copy(),
}
}
}
pub struct DirectionalLightBuilder {
base_light_builder: BaseLightBuilder,
}
impl DirectionalLightBuilder {
pub fn new(base_light_builder: BaseLightBuilder) -> Self {
Self { base_light_builder }
}
pub fn build_directional_light(self) -> DirectionalLight {
DirectionalLight {
base_light: self.base_light_builder.build(),
}
}
pub fn build_node(self) -> Node {
Node::Light(Light::Directional(self.build_directional_light()))
}
pub fn build(self, graph: &mut Graph) -> Handle<Node> {
graph.add_node(self.build_node())
}
}