use dyn_any::DynAny; use glam::DVec2; use kurbo::Point; /// Represents different ways of calculating the centroid. #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] #[widget(Radio)] pub enum CentroidType { /// The center of mass for the area of a solid shape's interior, as if made out of an infinitely flat material. #[default] Area, /// The center of mass for the arc length of a curved shape's perimeter, as if made out of an infinitely thin wire. Length, } pub trait AsU64 { fn as_u64(&self) -> u64; } impl AsU64 for u32 { fn as_u64(&self) -> u64 { *self as u64 } } impl AsU64 for u64 { fn as_u64(&self) -> u64 { *self } } impl AsU64 for f64 { fn as_u64(&self) -> u64 { *self as u64 } } pub trait AsI64 { fn as_i64(&self) -> i64; } impl AsI64 for u32 { fn as_i64(&self) -> i64 { *self as i64 } } impl AsI64 for u64 { fn as_i64(&self) -> i64 { *self as i64 } } impl AsI64 for f64 { fn as_i64(&self) -> i64 { *self as i64 } } #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] #[widget(Radio)] pub enum GridType { #[default] Rectangular, Isometric, } #[repr(C)] #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] #[widget(Radio)] pub enum ArcType { #[default] Open, Closed, PieSlice, } #[repr(C)] #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] #[widget(Radio)] pub enum MergeByDistanceAlgorithm { #[default] Spatial, Topological, } #[repr(C)] #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] #[widget(Radio)] pub enum PointSpacingType { #[default] /// The desired spacing distance between points. Separation, /// The exact number of points to span the path. Quantity, } pub fn point_to_dvec2(point: Point) -> DVec2 { DVec2 { x: point.x, y: point.y } } pub fn dvec2_to_point(value: DVec2) -> Point { Point { x: value.x, y: value.y } }