rscad_core/transformations/
translate.rs1use 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> {}