fere_common/
vec.rs

1use crate::*;
2
3pub fn normalize_w(vec: &Vec4) -> Vec3 {
4    Vec3::new(vec.x / vec.w, vec.y / vec.w, vec.z / vec.w)
5}
6
7pub struct IteratorVec2 {
8    pub size: IVec2,
9    pub cur: IVec2,
10}
11
12pub struct IteratorVec3 {
13    pub size: IVec3,
14    pub cur: IVec3,
15}
16
17pub struct IteratorVec4 {
18    pub size: IVec4,
19    pub cur: IVec4,
20}
21
22impl IteratorVec2 {
23    pub fn new(size: IVec2) -> Self {
24        Self {
25            size,
26            cur: IVec2::new(-1, 0),
27        }
28    }
29}
30impl IteratorVec3 {
31    pub fn new(size: IVec3) -> Self {
32        Self {
33            size,
34            cur: IVec3::new(-1, 0, 0),
35        }
36    }
37}
38
39impl IteratorVec4 {
40    pub fn new(size: IVec4) -> Self {
41        Self {
42            size,
43            cur: IVec4::new(-1, 0, 0, 0),
44        }
45    }
46}
47
48impl Iterator for IteratorVec2 {
49    type Item = IVec2;
50
51    fn next(&mut self) -> Option<Self::Item> {
52        let mut up = false;
53        for i in 0..2 {
54            if self.cur[i] == self.size[i] - 1 {
55                up = true;
56                self.cur[i] = 0;
57            } else {
58                up = false;
59                self.cur[i] += 1;
60                break;
61            }
62        }
63        if up {
64            None
65        } else {
66            Some(self.cur)
67        }
68    }
69}
70
71impl Iterator for IteratorVec3 {
72    type Item = IVec3;
73
74    fn next(&mut self) -> Option<Self::Item> {
75        let mut up = false;
76        for i in 0..3 {
77            if self.cur[i] == self.size[i] - 1 {
78                up = true;
79                self.cur[i] = 0;
80            } else {
81                up = false;
82                self.cur[i] += 1;
83                break;
84            }
85        }
86        if up {
87            None
88        } else {
89            Some(self.cur)
90        }
91    }
92}
93
94impl Iterator for IteratorVec4 {
95    type Item = IVec4;
96
97    fn next(&mut self) -> Option<Self::Item> {
98        let mut up = false;
99        for i in 0..4 {
100            if self.cur[i] == self.size[i] - 1 {
101                up = true;
102                self.cur[i] = 0;
103            } else {
104                up = false;
105                self.cur[i] += 1;
106                break;
107            }
108        }
109        if up {
110            None
111        } else {
112            Some(self.cur)
113        }
114    }
115}
116
117pub struct GridAccessor2(pub IVec2);
118impl GridAccessor2 {
119    pub fn get(&self, p: &IVec2) -> usize {
120        if p.x < 0 || p.y < 0 || p.x >= self.0.x || p.y > self.0.y {
121            debug_assert!(false, "invalid grid access");
122            0
123        } else {
124            (p.x * self.0.y + p.y) as usize
125        }
126    }
127
128    pub fn size(&self) -> usize {
129        (self.0.x * self.0.y) as usize
130    }
131}
132
133pub struct GridAccessor3(pub IVec3);
134impl GridAccessor3 {
135    pub fn get(&self, p: &IVec3) -> usize {
136        if p.x < 0 || p.y < 0 || p.z < 0 || p.x >= self.0.x || p.y > self.0.y || p.z >= self.0.z {
137            panic!("invalid grid access: {:?} out of {:?}", p, self.0);
138        } else {
139            (p.x * self.0.y * self.0.z + p.y * self.0.z + p.z) as usize
140        }
141    }
142
143    pub fn size(&self) -> usize {
144        (self.0.x * self.0.y * self.0.z) as usize
145    }
146}