pub mod bbox;
pub mod impls;
pub mod interpolate;
pub mod primitive;
pub mod vector;
pub mod vector_point;
use crate::Face;
pub use bbox::*;
pub use interpolate::*;
pub use primitive::*;
use serde::{Deserialize, Serialize};
pub use vector::*;
pub use vector_point::*;
pub trait GetXY {
fn x(&self) -> f64;
fn y(&self) -> f64;
fn xy(&self) -> (f64, f64) {
(self.x(), self.y())
}
}
pub trait GetZ {
fn z(&self) -> Option<f64>;
}
pub trait GetM<M> {
fn m(&self) -> Option<&M>;
}
pub trait GetXYZ: GetXY + GetZ {}
impl<T> GetXYZ for T where T: GetXY + GetZ {}
pub trait GetXYM<M>: GetXY + GetM<M> {}
impl<T, M> GetXYM<M> for T where T: GetXY + GetM<M> {}
pub trait GetXYZM<M>: GetXY + GetZ + GetM<M> {}
impl<T, M> GetXYZM<M> for T where T: GetXY + GetZ + GetM<M> {}
pub trait SetXY {
fn set_x(&mut self, x: f64);
fn set_y(&mut self, y: f64);
fn set_xy(&mut self, x: f64, y: f64) {
self.set_x(x);
self.set_y(y);
}
}
pub trait SetZ {
fn set_z(&mut self, z: f64);
}
pub trait SetM<M> {
fn set_m(&mut self, m: M);
}
pub trait SetXYZ: SetXY + SetZ {
fn set_xyz(&mut self, x: f64, y: f64, z: f64) {
self.set_xy(x, y);
self.set_z(z);
}
}
impl<T> SetXYZ for T where T: SetXY + SetZ {}
pub trait SetXYM<M>: SetXY + SetM<M> {
fn set_xym(&mut self, x: f64, y: f64, m: M) {
self.set_xy(x, y);
self.set_m(m);
}
}
impl<T, M> SetXYM<M> for T where T: SetXY + SetM<M> {}
pub trait SetXYZM<M>: SetXY + SetZ + SetM<M> {
fn set_xyzm(&mut self, x: f64, y: f64, z: f64, m: M) {
self.set_xy(x, y);
self.set_z(z);
self.set_m(m);
}
}
impl<T, M> SetXYZM<M> for T where T: SetXY + SetZ + SetM<M> {}
pub trait NewXY {
fn new_xy(x: f64, y: f64) -> Self;
}
pub trait NewXYM<M> {
fn new_xym(x: f64, y: f64, m: M) -> Self;
}
pub trait NewXYZ {
fn new_xyz(x: f64, y: f64, z: f64) -> Self;
}
pub trait NewXYZM<M> {
fn new_xyzm(x: f64, y: f64, z: f64, m: M) -> Self;
}
pub trait FullXY: GetXYZ + SetXY + NewXY + Clone + PartialEq + Ord {}
impl<T> FullXY for T where T: GetXYZ + SetXY + NewXY + Clone + PartialEq + Ord {}
pub trait FullXYM<M>: GetXYZM<M> + SetXYM<M> + NewXYM<M> + Clone + PartialEq + Ord {}
impl<T, M> FullXYM<M> for T where T: GetXYZM<M> + SetXYM<M> + NewXYM<M> + Clone + PartialEq + Ord {}
pub trait FullXYZ: GetXYZ + SetXYZ + NewXYZ + Clone + PartialEq + Ord {}
impl<T> FullXYZ for T where T: GetXYZ + SetXYZ + NewXYZ + Clone + PartialEq + Ord {}
pub trait FullXYZM<M>: GetXYZM<M> + SetXYZM<M> + NewXYZM<M> + Clone + PartialEq + Ord {}
impl<T, M> FullXYZM<M> for T where T: GetXYZM<M> + SetXYZM<M> + NewXYZM<M> + Clone + PartialEq + Ord {}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Axis {
X = 0,
Y = 1,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Default)]
pub struct STPoint<M> {
pub face: Face,
pub s: f64,
pub t: f64,
pub z: Option<f64>,
pub m: Option<M>,
}