1use cgmath::Vector3;
2use std::iter::Iterator;
3use std::marker::PhantomData;
4use std::{f32, u32};
5
6use soa_ray::{
7 SoAHit, SoAHitIter, SoAHitIterMut, SoAHitRef, SoARay, SoARayIter, SoARayIterMut, SoARayRef,
8 SoARayRefMut,
9};
10use sys;
11use {aligned_vector, aligned_vector_init};
12
13pub struct RayN {
15 org_x: Vec<f32>,
16 org_y: Vec<f32>,
17 org_z: Vec<f32>,
18 tnear: Vec<f32>,
19 dir_x: Vec<f32>,
20 dir_y: Vec<f32>,
21 dir_z: Vec<f32>,
22 time: Vec<f32>,
23 tfar: Vec<f32>,
24 mask: Vec<::std::os::raw::c_uint>,
25 id: Vec<::std::os::raw::c_uint>,
26 flags: Vec<::std::os::raw::c_uint>,
27}
28
29impl RayN {
30 pub fn new(n: usize) -> RayN {
32 RayN {
33 org_x: aligned_vector::<f32>(n, 16),
34 org_y: aligned_vector::<f32>(n, 16),
35 org_z: aligned_vector::<f32>(n, 16),
36 tnear: aligned_vector_init::<f32>(n, 16, 0.0),
37 dir_x: aligned_vector::<f32>(n, 16),
38 dir_y: aligned_vector::<f32>(n, 16),
39 dir_z: aligned_vector::<f32>(n, 16),
40 time: aligned_vector_init::<f32>(n, 16, 0.0),
41 tfar: aligned_vector_init::<f32>(n, 16, f32::INFINITY),
42 mask: aligned_vector_init::<u32>(n, 16, u32::MAX),
43 id: aligned_vector_init::<u32>(n, 16, 0),
44 flags: aligned_vector_init::<u32>(n, 16, 0),
45 }
46 }
47 pub fn iter(&self) -> SoARayIter<RayN> {
48 SoARayIter::new(self, self.len())
49 }
50 pub fn iter_mut(&mut self) -> SoARayIterMut<RayN> {
51 let n = self.len();
52 SoARayIterMut::new(self, n)
53 }
54 pub fn len(&self) -> usize {
55 self.org_x.len()
56 }
57 pub unsafe fn as_raynp(&mut self) -> sys::RTCRayNp {
58 sys::RTCRayNp {
59 org_x: self.org_x.as_mut_ptr(),
60 org_y: self.org_y.as_mut_ptr(),
61 org_z: self.org_z.as_mut_ptr(),
62 dir_x: self.dir_x.as_mut_ptr(),
63 dir_y: self.dir_y.as_mut_ptr(),
64 dir_z: self.dir_z.as_mut_ptr(),
65 tnear: self.tnear.as_mut_ptr(),
66 tfar: self.tfar.as_mut_ptr(),
67 time: self.time.as_mut_ptr(),
68 mask: self.mask.as_mut_ptr(),
69 id: self.id.as_mut_ptr(),
70 flags: self.flags.as_mut_ptr(),
71 }
72 }
73}
74
75impl SoARay for RayN {
76 fn org(&self, i: usize) -> Vector3<f32> {
77 Vector3::new(self.org_x[i], self.org_y[i], self.org_z[i])
78 }
79 fn set_org(&mut self, i: usize, o: Vector3<f32>) {
80 self.org_x[i] = o.x;
81 self.org_y[i] = o.y;
82 self.org_z[i] = o.z;
83 }
84
85 fn dir(&self, i: usize) -> Vector3<f32> {
86 Vector3::new(self.dir_x[i], self.dir_y[i], self.dir_z[i])
87 }
88 fn set_dir(&mut self, i: usize, d: Vector3<f32>) {
89 self.dir_x[i] = d.x;
90 self.dir_y[i] = d.y;
91 self.dir_z[i] = d.z;
92 }
93
94 fn tnear(&self, i: usize) -> f32 {
95 self.tnear[i]
96 }
97 fn set_tnear(&mut self, i: usize, near: f32) {
98 self.tnear[i] = near;
99 }
100
101 fn tfar(&self, i: usize) -> f32 {
102 self.tfar[i]
103 }
104 fn set_tfar(&mut self, i: usize, far: f32) {
105 self.tfar[i] = far;
106 }
107
108 fn time(&self, i: usize) -> f32 {
109 self.time[i]
110 }
111 fn set_time(&mut self, i: usize, time: f32) {
112 self.time[i] = time;
113 }
114
115 fn mask(&self, i: usize) -> u32 {
116 self.mask[i]
117 }
118 fn set_mask(&mut self, i: usize, mask: u32) {
119 self.mask[i] = mask;
120 }
121
122 fn id(&self, i: usize) -> u32 {
123 self.id[i]
124 }
125 fn set_id(&mut self, i: usize, id: u32) {
126 self.id[i] = id;
127 }
128
129 fn flags(&self, i: usize) -> u32 {
130 self.flags[i]
131 }
132 fn set_flags(&mut self, i: usize, flags: u32) {
133 self.flags[i] = flags;
134 }
135}
136
137pub struct HitN {
138 ng_x: Vec<f32>,
139 ng_y: Vec<f32>,
140 ng_z: Vec<f32>,
141 u: Vec<f32>,
142 v: Vec<f32>,
143 prim_id: Vec<::std::os::raw::c_uint>,
144 geom_id: Vec<::std::os::raw::c_uint>,
145 inst_id: Vec<::std::os::raw::c_uint>,
146}
147
148impl HitN {
149 pub fn new(n: usize) -> HitN {
150 HitN {
151 ng_x: aligned_vector::<f32>(n, 16),
152 ng_y: aligned_vector::<f32>(n, 16),
153 ng_z: aligned_vector::<f32>(n, 16),
154 u: aligned_vector::<f32>(n, 16),
155 v: aligned_vector::<f32>(n, 16),
156 prim_id: aligned_vector_init::<u32>(n, 16, u32::MAX),
157 geom_id: aligned_vector_init::<u32>(n, 16, u32::MAX),
158 inst_id: aligned_vector_init::<u32>(n, 16, u32::MAX),
159 }
160 }
161 pub fn any_hit(&self) -> bool {
162 self.hits().fold(false, |acc, g| acc || g)
163 }
164 pub fn hits<'a>(&'a self) -> impl Iterator<Item = bool> + 'a {
165 self.geom_id.iter().map(|g| *g != u32::MAX)
166 }
167 pub fn iter(&self) -> SoAHitIter<HitN> {
168 SoAHitIter::new(self, self.len())
169 }
170 pub fn iter_hits<'a>(&'a self) -> impl Iterator<Item = SoAHitRef<HitN>> + 'a {
171 SoAHitIter::new(self, self.len()).filter(|h| h.hit())
172 }
173 pub fn len(&self) -> usize {
174 self.ng_x.len()
175 }
176 pub unsafe fn as_hitnp(&mut self) -> sys::RTCHitNp {
177 sys::RTCHitNp {
178 Ng_x: self.ng_x.as_mut_ptr(),
179 Ng_y: self.ng_y.as_mut_ptr(),
180 Ng_z: self.ng_z.as_mut_ptr(),
181 u: self.u.as_mut_ptr(),
182 v: self.v.as_mut_ptr(),
183 primID: self.prim_id.as_mut_ptr(),
184 geomID: self.geom_id.as_mut_ptr(),
185 instID: [self.inst_id.as_mut_ptr(); 1usize],
186 }
187 }
188}
189
190impl SoAHit for HitN {
191 fn normal(&self, i: usize) -> Vector3<f32> {
192 Vector3::new(self.ng_x[i], self.ng_y[i], self.ng_z[i])
193 }
194 fn set_normal(&mut self, i: usize, n: Vector3<f32>) {
195 self.ng_x[i] = n.x;
196 self.ng_y[i] = n.y;
197 self.ng_z[i] = n.z;
198 }
199
200 fn uv(&self, i: usize) -> (f32, f32) {
201 (self.u[i], self.v[i])
202 }
203 fn set_u(&mut self, i: usize, u: f32) {
204 self.u[i] = u;
205 }
206 fn set_v(&mut self, i: usize, v: f32) {
207 self.v[i] = v;
208 }
209
210 fn prim_id(&self, i: usize) -> u32 {
211 self.prim_id[i]
212 }
213 fn set_prim_id(&mut self, i: usize, id: u32) {
214 self.prim_id[i] = id;
215 }
216
217 fn geom_id(&self, i: usize) -> u32 {
218 self.geom_id[i]
219 }
220 fn set_geom_id(&mut self, i: usize, id: u32) {
221 self.geom_id[i] = id;
222 }
223
224 fn inst_id(&self, i: usize) -> u32 {
225 self.inst_id[i]
226 }
227 fn set_inst_id(&mut self, i: usize, id: u32) {
228 self.inst_id[i] = id;
229 }
230}
231
232pub struct RayHitN {
233 pub ray: RayN,
234 pub hit: HitN,
235}
236
237impl RayHitN {
238 pub fn new(ray: RayN) -> RayHitN {
239 let n = ray.len();
240 RayHitN {
241 ray: ray,
242 hit: HitN::new(n),
243 }
244 }
245 pub fn iter(&self) -> std::iter::Zip<SoARayIter<RayN>, SoAHitIter<HitN>> {
246 self.ray.iter().zip(self.hit.iter())
247 }
248 pub fn len(&self) -> usize {
249 self.ray.len()
250 }
251 pub unsafe fn as_rayhitnp(&mut self) -> sys::RTCRayHitNp {
252 sys::RTCRayHitNp {
253 ray: self.ray.as_raynp(),
254 hit: self.hit.as_hitnp(),
255 }
256 }
257}