use egui::{Color32, Mesh, TextureId};
use lyon_path::Path;
use lyon_tessellation::{
BuffersBuilder, FillOptions, FillTessellator, StrokeOptions, StrokeTessellator,
};
use crate::vertex::{VertexBuffers, VertexConstructor};
#[derive(Copy, Clone, Default, Debug, PartialEq)]
pub struct Mode<T> {
pub options: T,
pub color: Color32,
}
pub struct Tessellator<T> {
inner: T,
}
impl<T: Default> Default for Tessellator<T> {
fn default() -> Self {
Self {
inner: Default::default(),
}
}
}
impl Tessellator<()> {
pub fn build_mesh(buffers: VertexBuffers) -> Mesh {
Mesh {
indices: buffers.indices,
vertices: buffers.vertices,
texture_id: TextureId::default(),
}
}
}
impl Tessellator<FillTessellator> {
pub fn fill(&mut self, path: &Path, mode: Mode<FillOptions>, buffers: &mut VertexBuffers) {
let Mode { options, color } = mode;
if let Err(e) = self.inner.tessellate_path(
path,
&options,
&mut BuffersBuilder::new(buffers, VertexConstructor { color }),
) {
tracing::error!("FillTessellator error: {:?}", e);
}
}
}
impl Tessellator<StrokeTessellator> {
pub fn stroke(&mut self, path: &Path, mode: Mode<StrokeOptions>, buffers: &mut VertexBuffers) {
let Mode { options, color } = mode;
if let Err(e) = self.inner.tessellate_path(
path,
&options,
&mut BuffersBuilder::new(buffers, VertexConstructor { color }),
) {
tracing::error!("StrokeTessellator error: {:?}", e);
}
}
}