embree3_arm/
ray_stream.rs

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
13/// A ray stream stored in SoA format
14pub 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    /// Allocate a new Ray stream with room for `n` rays
31    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}