use bevy::transform::components::Transform;
use lyon_tessellation::path::path::Builder;
use crate::{
draw::DrawMode,
entity::{Path, ShapeBundle},
};
pub trait Geometry {
fn add_geometry(&self, b: &mut Builder);
}
pub struct GeometryBuilder(Builder);
impl GeometryBuilder {
#[must_use]
pub fn new() -> Self {
Self(Builder::new())
}
#[allow(clippy::should_implement_trait)]
#[must_use]
pub fn add(mut self, shape: &impl Geometry) -> Self {
shape.add_geometry(&mut self.0);
self
}
#[must_use]
pub fn build(self, mode: DrawMode, transform: Transform) -> ShapeBundle {
ShapeBundle {
path: Path(self.0.build()),
mode,
transform,
..ShapeBundle::default()
}
}
pub fn build_as(shape: &impl Geometry, mode: DrawMode, transform: Transform) -> ShapeBundle {
Self::new().add(shape).build(mode, transform)
}
}
impl Default for GeometryBuilder {
fn default() -> Self {
Self::new()
}
}