pbrt_r3/core/transform/
transform_set.rs

1use super::transform::*;
2use crate::core::base::*;
3
4pub const MAX_TRANSFORMS: usize = 2;
5pub const START_TRANSFORM_BITS: u32 = 1 << 0; //1
6pub const END_TRANSFORM_BITS: u32 = 1 << 1; //2
7pub const ALL_TRANSFORM_BITS: u32 = (1 << 2) - 1; //3 = 1 + 2
8
9#[derive(Debug, Default, Copy, Clone)]
10pub struct TransformSet {
11    pub t: [Transform; MAX_TRANSFORMS],
12}
13
14impl TransformSet {
15    pub fn new() -> Self {
16        let t: [Transform; MAX_TRANSFORMS] = [Transform::identity(); 2];
17        TransformSet { t }
18    }
19
20    pub fn to_transform(&self) -> Transform {
21        return self.t[0];
22    }
23
24    pub fn len(&self) -> usize {
25        return self.t.len();
26    }
27
28    pub fn is_empty(&self) -> bool {
29        return self.t.is_empty();
30    }
31
32    pub fn inverse(&self) -> Self {
33        let v: Vec<Transform> = self.t.iter().map(|t| t.inverse()).collect();
34        let it: [Transform; MAX_TRANSFORMS] = v.try_into().unwrap();
35        TransformSet { t: it }
36    }
37
38    pub fn mul_transform(&mut self, other: &Transform, mask: u32) {
39        for i in 0..MAX_TRANSFORMS {
40            let active = ((1 << i) & mask) != 0;
41            if active {
42                self.t[i] = self.t[i] * *other;
43            }
44        }
45    }
46
47    pub fn set_transform(&mut self, other: &Transform, mask: u32) {
48        for i in 0..MAX_TRANSFORMS {
49            let active = ((1 << i) & mask) != 0;
50            if active {
51                self.t[i] = *other;
52            }
53        }
54    }
55
56    pub fn set(&mut self, other: &TransformSet, mask: u32) {
57        for i in 0..MAX_TRANSFORMS {
58            let active = ((1 << i) & mask) != 0;
59            if active {
60                self.t[i] = other.t[i];
61            }
62        }
63    }
64
65    pub fn is_animated(&self) -> bool {
66        for i in 0..(MAX_TRANSFORMS - 1) {
67            if self.t[i] != self.t[i + 1] {
68                return true;
69            }
70        }
71        return false;
72    }
73}
74
75impl std::ops::Index<usize> for TransformSet {
76    type Output = Transform;
77    fn index(&self, index: usize) -> &Self::Output {
78        return &self.t[index];
79    }
80}
81
82impl std::ops::IndexMut<usize> for TransformSet {
83    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
84        return &mut self.t[index];
85    }
86}
87
88impl std::ops::Mul<TransformSet> for TransformSet {
89    type Output = TransformSet;
90    fn mul(self, t2: TransformSet) -> TransformSet {
91        let v: Vec<Transform> = self
92            .t
93            .iter()
94            .zip(t2.t.iter())
95            .map(|(a, b)| *a * *b)
96            .collect();
97        let t: [Transform; MAX_TRANSFORMS] = v.try_into().unwrap();
98        return TransformSet { t };
99    }
100}
101
102impl From<[Float; 16]> for TransformSet {
103    fn from(v: [Float; 16]) -> Self {
104        let vv = Transform::from(v);
105        let t: [Transform; MAX_TRANSFORMS] = [vv; MAX_TRANSFORMS];
106        TransformSet { t }
107    }
108}
109
110#[cfg(test)]
111mod tests {
112    use super::*;
113
114    #[test]
115    fn test_001() {
116        let mut ts = TransformSet::new();
117        assert_eq!(ts[0], Transform::identity());
118        ts[1] = Transform::translate(-10.0, 0.0, 2.0);
119        assert_ne!(ts[1], Transform::identity());
120        assert_eq!(ts[1], Transform::translate(-10.0, 0.0, 2.0));
121    }
122}