Skip to main content

rscad_core/transformations/
translate.rs

1use crate::prelude_::*;
2use glam::DVec3;
3
4#[derive(Clone, Copy, Debug, Default, PartialEq)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[cfg_attr(feature = "reflect", derive(bevy_reflect::Reflect))]
7pub struct Translate<T: Object> {
8    pub object: T,
9    pub translation: DVec3,
10}
11
12impl<O: Object> Translate<O> {
13    pub fn new<X: Number, Y: Number, Z: Number>(object: O, x: X, y: Y, z: Z) -> Self {
14        Self {
15            object,
16            translation: DVec3::new(x.to_f64(), y.to_f64(), z.to_f64()),
17        }
18    }
19}
20
21pub trait TranslateObject: Object {
22    fn translate<T: Number>(self, x: T, y: T, z: T) -> Translate<Self>
23    where
24        Self: Sized,
25    {
26        Translate::new(self, x, y, z)
27    }
28    fn translate_x<T: Number>(self, x: T) -> Translate<Self>
29    where
30        Self: Sized,
31    {
32        Translate::new(self, x, 0, 0)
33    }
34    fn translate_y<T: Number>(self, y: T) -> Translate<Self>
35    where
36        Self: Sized,
37    {
38        Translate::new(self, 0, y, 0)
39    }
40    fn translate_z<T: Number>(self, z: T) -> Translate<Self>
41    where
42        Self: Sized,
43    {
44        Translate::new(self, 0, 0, z)
45    }
46    fn translate_xy<T: Number>(self, x: T, y: T) -> Translate<Self>
47    where
48        Self: Sized,
49    {
50        Translate::new(self, x, y, 0)
51    }
52    fn translate_xz<T: Number>(self, x: T, z: T) -> Translate<Self>
53    where
54        Self: Sized,
55    {
56        Translate::new(self, x, 0, z)
57    }
58    fn translate_yz<T: Number>(self, y: T, z: T) -> Translate<Self>
59    where
60        Self: Sized,
61    {
62        Translate::new(self, 0, y, z)
63    }
64
65    fn translate_vector(self, vector: DVec3) -> Translate<Self>
66    where
67        Self: Sized,
68    {
69        self.translate(vector.x, vector.y, vector.z)
70    }
71}
72
73impl<T: Object> TranslateObject for T {}
74
75impl<T: Object> Object for Translate<T> {}