pbrt_r3/core/transform/
transform_set.rs1use super::transform::*;
2use crate::core::base::*;
3
4pub const MAX_TRANSFORMS: usize = 2;
5pub const START_TRANSFORM_BITS: u32 = 1 << 0; pub const END_TRANSFORM_BITS: u32 = 1 << 1; pub const ALL_TRANSFORM_BITS: u32 = (1 << 2) - 1; #[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}