use crate::diagnostics::LookupError;
use crate::{GeometryHandle, MaterialHandle, ModelHandle};
use super::{MeshNode, ModelNode, NodeKey, NodeKind, Scene, Transform};
#[must_use = "mesh builders do nothing until add() is called"]
pub struct MeshBuilder<'scene> {
scene: &'scene mut Scene,
parent: NodeKey,
transform: Transform,
geometry: GeometryHandle,
material: MaterialHandle,
}
#[must_use = "model builders do nothing until add() is called"]
pub struct ModelBuilder<'scene> {
scene: &'scene mut Scene,
parent: NodeKey,
transform: Transform,
model: ModelHandle,
}
impl<'scene> MeshBuilder<'scene> {
pub(super) fn new(
scene: &'scene mut Scene,
parent: NodeKey,
geometry: GeometryHandle,
material: MaterialHandle,
) -> Self {
Self {
scene,
parent,
transform: Transform::default(),
geometry,
material,
}
}
}
impl<'scene> ModelBuilder<'scene> {
pub(super) fn new(scene: &'scene mut Scene, parent: NodeKey, model: ModelHandle) -> Self {
Self {
scene,
parent,
transform: Transform::default(),
model,
}
}
}
impl MeshBuilder<'_> {
pub fn parent(mut self, parent: NodeKey) -> Self {
self.parent = parent;
self
}
pub fn transform(mut self, transform: Transform) -> Self {
self.transform = transform;
self
}
pub fn add(self) -> Result<NodeKey, LookupError> {
self.scene.insert_node(
self.parent,
NodeKind::Mesh(MeshNode {
geometry: self.geometry,
material: self.material,
}),
self.transform,
)
}
}
impl ModelBuilder<'_> {
pub fn parent(mut self, parent: NodeKey) -> Self {
self.parent = parent;
self
}
pub fn transform(mut self, transform: Transform) -> Self {
self.transform = transform;
self
}
pub fn add(self) -> Result<NodeKey, LookupError> {
self.scene.insert_node(
self.parent,
NodeKind::Model(ModelNode { model: self.model }),
self.transform,
)
}
}