fastnoise_simd/
noise_set.rs

1use 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}