embree_rs/
ray_stream.rs

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
11/// A ray stream stored in SoA format
12pub 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    /// Allocate a new Ray stream with room for `n` rays
29    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