use geo::Rect;
use vello::{Scene, kurbo::Affine};
use crate::rendered_geometry::RenderedGeometry;
use super::{AreaRenderer, LineRenderer, PointRenderer};
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub enum GeometryRenderer {
Point(PointRenderer),
Line(LineRenderer),
Area(AreaRenderer),
}
impl GeometryRenderer {
pub fn draw(
&self,
scene: &mut Scene,
transform: Affine,
rendered_geometrys: &mut Vec<RenderedGeometry>,
render_rect: Option<Rect>,
) {
rendered_geometrys
.iter_mut()
.for_each(|rendered_geometry| match self {
GeometryRenderer::Point(renderer) => {
if let Some(point) = rendered_geometry.center_point(render_rect) {
renderer.draw(scene, transform, point);
}
}
GeometryRenderer::Line(renderer) => {
if let Some(lines) = rendered_geometry.lines() {
renderer.draw_multi(scene, transform, lines);
}
}
GeometryRenderer::Area(renderer) => {
if let Some(areas) = rendered_geometry.areas() {
renderer.draw_multi(scene, transform, areas);
}
}
});
}
}