fastnoise_simd/
noise_set.rs1use fastnoise_simd_bindings as binds;
2use std::iter::Iterator;
3
4pub struct NoiseSet {
5 pub(crate) inner: *mut f32,
6 pub(crate) x_start: i32,
7 pub(crate) y_start: i32,
8 pub(crate) z_start: i32,
9 pub(crate) x_size: i32,
10 pub(crate) y_size: i32,
11 pub(crate) z_size: i32,
12}
13
14impl Drop for NoiseSet {
15 fn drop(&mut self) {
16 unsafe {
17 binds::FastNoiseSIMD::FreeNoiseSet(self.inner);
18 }
19 }
20}
21
22impl NoiseSet {
23 pub fn empty(x_size: i32, y_size: i32, z_size: i32) -> Self {
24 let inner = unsafe {
25 binds::FastNoiseSIMD::GetEmptySet(x_size * y_size * z_size)
26 };
27
28 NoiseSet {
29 inner,
30 x_start: 0,
31 y_start: 0,
32 z_start: 0,
33 x_size: x_size,
34 y_size: y_size,
35 z_size: z_size,
36 }
37 }
38
39 pub fn iter(&self) -> NoiseSetIter<'_> {
40 NoiseSetIter {
41 index: 0,
42 length: self.x_size as isize * self.y_size as isize * self.z_size as isize,
43 inner: self
44 }
45 }
46
47 pub fn iter_mut(&mut self) -> NoiseSetIterMut<'_> {
48 NoiseSetIterMut {
49 index: 0,
50 length: self.x_size as isize * self.y_size as isize * self.z_size as isize,
51 inner: self
52 }
53 }
54
55 pub fn enumerated_iter(&self) -> NoiseSetIterEnumerated<'_> {
56 NoiseSetIterEnumerated {
57 x: self.x_start,
58 y: self.y_start,
59 z: self.z_start,
60 index: 0,
61 inner: self
62 }
63 }
64
65 pub fn enumerated_iter_mut(&mut self) -> NoiseSetIterMutEnumerated<'_> {
66 NoiseSetIterMutEnumerated {
67 x: self.x_start,
68 y: self.y_start,
69 z: self.z_start,
70 index: 0,
71 inner: self
72 }
73 }
74
75 pub fn as_vec(&self) -> Vec<f32> {
76 let length = self.x_size as isize * self.y_size as isize * self.z_size as isize;
77 let mut out = Vec::with_capacity(length as usize);
78
79 for i in 0..length {
80 unsafe {
81 out.push(*(self.inner.offset(i)).clone());
82 }
83 }
84
85 out
86 }
87
88 pub fn as_nested_vecs(&self) -> Vec<Vec<Vec<f32>>> {
89 let mut x_out = Vec::with_capacity(self.x_size as usize);
90 let mut i = 0;
91
92 for _ in 0..self.x_size {
93 let mut y_out = Vec::with_capacity(self.y_size as usize);
94
95 for _ in 0..self.y_size {
96 let mut z_out = Vec::with_capacity(self.z_size as usize);
97
98 for _ in 0..self.z_size {
99 unsafe {
100 z_out.push(*(self.inner.offset(i)).clone());
101 i += 1;
102 }
103 }
104
105 y_out.push(z_out);
106 }
107
108 x_out.push(y_out);
109 }
110
111 x_out
112 }
113}
114
115pub struct NoiseSetIter<'a> {
116 index: isize,
117 length: isize,
118 inner: &'a NoiseSet,
119}
120
121impl<'a> Iterator for NoiseSetIter<'a> {
122 type Item = &'a f32;
123
124 #[inline]
125 fn next(&mut self) -> Option<&'a f32> {
126 if self.index == self.length {
127 None
128 } else {
129 let out = unsafe {
130 Some(&*(self.inner.inner.offset(self.index)))
131 };
132
133 self.index += 1;
134 out
135 }
136 }
137
138 #[inline]
139 fn size_hint(&self) -> (usize, Option<usize>) {
140 (self.length as usize, Some(self.length as usize))
141 }
142}
143
144pub struct NoiseSetIterMut<'a> {
145 index: isize,
146 length: isize,
147 inner: &'a mut NoiseSet,
148}
149
150impl<'a> Iterator for NoiseSetIterMut<'a> {
151 type Item = &'a mut f32;
152
153 #[inline]
154 fn next(&mut self) -> Option<&'a mut f32> {
155 if self.index == self.length {
156 None
157 } else {
158 let out = unsafe {
159 Some(&mut *(self.inner.inner.offset(self.index)))
160 };
161
162 self.index += 1;
163 out
164 }
165 }
166
167 #[inline]
168 fn size_hint(&self) -> (usize, Option<usize>) {
169 (self.length as usize, Some(self.length as usize))
170 }
171}
172
173pub struct NoiseSetIterEnumerated<'a> {
174 x: i32,
175 y: i32,
176 z: i32,
177 index: isize,
178 inner: &'a NoiseSet,
179}
180
181impl<'a> Iterator for NoiseSetIterEnumerated<'a> {
182 type Item = (i32, i32, i32, &'a f32);
183
184 #[inline]
185 fn next(&mut self) -> Option<(i32, i32, i32, &'a f32)> {
186 if self.x == self.inner.x_size + self.inner.x_start {
187 None
188 } else {
189 let out = unsafe {
190 Some((
191 self.x,
192 self.y,
193 self.z,
194 &*(self.inner.inner.offset(self.index))
195 ))
196 };
197
198 self.z += 1;
199 self.index += 1;
200
201 if self.z == self.inner.z_size + self.inner.z_start {
202 self.z = self.inner.z_start;
203 self.y += 1;
204
205 if self.y == self.inner.y_size + self.inner.y_start {
206 self.y = self.inner.y_start;
207 self.x += 1;
208 }
209 }
210
211 out
212 }
213 }
214
215 #[inline]
216 fn size_hint(&self) -> (usize, Option<usize>) {
217 let length = self.inner.x_size as usize
218 * self.inner.y_size as usize
219 * self.inner.z_size as usize;
220 (length, Some(length))
221 }
222}
223
224pub struct NoiseSetIterMutEnumerated<'a> {
225 x: i32,
226 y: i32,
227 z: i32,
228 index: isize,
229 inner: &'a mut NoiseSet,
230}
231
232impl<'a> Iterator for NoiseSetIterMutEnumerated<'a> {
233 type Item = (i32, i32, i32, &'a mut f32);
234
235 #[inline]
236 fn next(&mut self) -> Option<(i32, i32, i32, &'a mut f32)> {
237 if self.x == self.inner.x_size + self.inner.x_start {
238 None
239 } else {
240 let out = unsafe {
241 Some((
242 self.x,
243 self.y,
244 self.z,
245 &mut *(self.inner.inner.offset(self.index))
246 ))
247 };
248
249 self.z += 1;
250 self.index += 1;
251
252 if self.z == self.inner.z_size + self.inner.z_start {
253 self.z = self.inner.z_start;
254 self.y += 1;
255
256 if self.y == self.inner.y_size + self.inner.y_start {
257 self.y = self.inner.y_start;
258 self.x += 1;
259 }
260 }
261
262 out
263 }
264 }
265
266 #[inline]
267 fn size_hint(&self) -> (usize, Option<usize>) {
268 let length = self.inner.x_size as usize
269 * self.inner.y_size as usize
270 * self.inner.z_size as usize;
271 (length, Some(length))
272 }
273}