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}