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