use super::*;
pub trait ParamSet<P: RangedParam>: ParamHolder {}
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Debug, Copy, Clone)]
pub struct ParamSet3d<P: RangedParam> {
pub x: P,
pub y: P,
pub z: P,
}
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
#[derive(Debug, Copy, Clone)]
pub struct ParamSet2d<P: RangedParam> {
pub x: P,
pub y: P,
}
impl<P: RangedParam> ParamSet<P> for ParamSet3d<P> {}
impl<P: RangedParam> ParamSet<P> for ParamSet2d<P> {}
impl<P: RangedParam> ParamHolder for ParamSet3d<P> {
fn param_count(&self) -> usize {
3
}
fn get_param(&mut self, index: usize) -> &mut RangedParam {
match index % 3 {
0 => &mut self.x,
1 => &mut self.y,
2 => &mut self.z,
_ => panic!("out of bounds"),
}
}
}
impl<P: RangedParam> ParamHolder for ParamSet2d<P> {
fn param_count(&self) -> usize {
2
}
fn get_param(&mut self, index: usize) -> &mut RangedParam {
match index % 2 {
0 => &mut self.x,
1 => &mut self.y,
_ => panic!("out of bounds"),
}
}
}
impl<P: RangedParam> ParamSet3d<P> {
pub fn new(x: P, y: P, z: P) -> Self {
Self { x, y, z }
}
pub fn components_scaled(&self) -> (Param, Param, Param) {
(
self.x.get_scaled(),
self.y.get_scaled(),
self.z.get_scaled(),
)
}
}
impl<P: RangedParam> ParamSet2d<P> {
pub fn new(x: P, y: P) -> Self {
Self { x, y }
}
pub fn components_scaled(&self) -> (Param, Param) {
(self.x.get_scaled(), self.y.get_scaled())
}
}