use glam::Vec3;
use viewport_lib::{LabelItem, MeshData};
use crate::coordinate::CoordinateSystem;
use crate::domain::{DataBounds, Domain};
use crate::resolution::Resolution;
use crate::style::PlotStyle;
pub struct GlyphInstance {
pub position: Vec3,
pub vector: Vec3,
pub raw_vector: Vec3,
}
pub struct PlotComponent {
pub geometry: PlotGeometry,
pub style: PlotStyle,
}
pub enum PlotGeometry {
Surface(MeshData),
Polyline {
positions: Vec<Vec3>,
strip_lengths: Vec<u32>,
scalars: Option<Vec<f32>>,
},
Points {
positions: Vec<Vec3>,
scalars: Option<Vec<f32>>,
},
Glyphs(Vec<GlyphInstance>),
Streamtube {
positions: Vec<Vec3>,
strip_lengths: Vec<u32>,
radius: f32,
},
Volume {
data: Vec<f32>,
dims: [u32; 3],
origin: [f32; 3],
spacing: [f32; 3],
},
Labels(Vec<LabelItem>),
Composite(Vec<PlotComponent>),
}
pub trait PlotObject: Send + Sync {
fn coordinate_system(&self) -> CoordinateSystem;
fn natural_bounds(&self) -> Option<DataBounds>;
fn generate(&self, domain: &Domain, resolution: Resolution) -> PlotGeometry;
fn style(&self) -> &PlotStyle;
fn resolution(&self) -> Resolution {
Resolution::default()
}
fn domain_override(&self) -> Option<&Domain> {
None
}
}