1 | // Copyright 2009-2021 Intel Corporation |
2 | // SPDX-License-Identifier: Apache-2.0 |
3 | |
4 | #pragma once |
5 | |
6 | #include "rtcore_common.h" |
7 | |
8 | RTC_NAMESPACE_BEGIN |
9 | |
10 | /* Ray structure for a single ray */ |
11 | struct RTC_ALIGN(16) RTCRay |
12 | { |
13 | float org_x; // x coordinate of ray origin |
14 | float org_y; // y coordinate of ray origin |
15 | float org_z; // z coordinate of ray origin |
16 | float tnear; // start of ray segment |
17 | |
18 | float dir_x; // x coordinate of ray direction |
19 | float dir_y; // y coordinate of ray direction |
20 | float dir_z; // z coordinate of ray direction |
21 | float time; // time of this ray for motion blur |
22 | |
23 | float tfar; // end of ray segment (set to hit distance) |
24 | unsigned int mask; // ray mask |
25 | unsigned int id; // ray ID |
26 | unsigned int flags; // ray flags |
27 | }; |
28 | |
29 | /* Hit structure for a single ray */ |
30 | struct RTC_ALIGN(16) RTCHit |
31 | { |
32 | float Ng_x; // x coordinate of geometry normal |
33 | float Ng_y; // y coordinate of geometry normal |
34 | float Ng_z; // z coordinate of geometry normal |
35 | |
36 | float u; // barycentric u coordinate of hit |
37 | float v; // barycentric v coordinate of hit |
38 | |
39 | unsigned int primID; // primitive ID |
40 | unsigned int geomID; // geometry ID |
41 | unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT]; // instance ID |
42 | }; |
43 | |
44 | /* Combined ray/hit structure for a single ray */ |
45 | struct RTCRayHit |
46 | { |
47 | struct RTCRay ray; |
48 | struct RTCHit hit; |
49 | }; |
50 | |
51 | /* Ray structure for a packet of 4 rays */ |
52 | struct RTC_ALIGN(16) RTCRay4 |
53 | { |
54 | float org_x[4]; |
55 | float org_y[4]; |
56 | float org_z[4]; |
57 | float tnear[4]; |
58 | |
59 | float dir_x[4]; |
60 | float dir_y[4]; |
61 | float dir_z[4]; |
62 | float time[4]; |
63 | |
64 | float tfar[4]; |
65 | unsigned int mask[4]; |
66 | unsigned int id[4]; |
67 | unsigned int flags[4]; |
68 | }; |
69 | |
70 | /* Hit structure for a packet of 4 rays */ |
71 | struct RTC_ALIGN(16) RTCHit4 |
72 | { |
73 | float Ng_x[4]; |
74 | float Ng_y[4]; |
75 | float Ng_z[4]; |
76 | |
77 | float u[4]; |
78 | float v[4]; |
79 | |
80 | unsigned int primID[4]; |
81 | unsigned int geomID[4]; |
82 | unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT][4]; |
83 | }; |
84 | |
85 | /* Combined ray/hit structure for a packet of 4 rays */ |
86 | struct RTCRayHit4 |
87 | { |
88 | struct RTCRay4 ray; |
89 | struct RTCHit4 hit; |
90 | }; |
91 | |
92 | /* Ray structure for a packet of 8 rays */ |
93 | struct RTC_ALIGN(32) RTCRay8 |
94 | { |
95 | float org_x[8]; |
96 | float org_y[8]; |
97 | float org_z[8]; |
98 | float tnear[8]; |
99 | |
100 | float dir_x[8]; |
101 | float dir_y[8]; |
102 | float dir_z[8]; |
103 | float time[8]; |
104 | |
105 | float tfar[8]; |
106 | unsigned int mask[8]; |
107 | unsigned int id[8]; |
108 | unsigned int flags[8]; |
109 | }; |
110 | |
111 | /* Hit structure for a packet of 8 rays */ |
112 | struct RTC_ALIGN(32) RTCHit8 |
113 | { |
114 | float Ng_x[8]; |
115 | float Ng_y[8]; |
116 | float Ng_z[8]; |
117 | |
118 | float u[8]; |
119 | float v[8]; |
120 | |
121 | unsigned int primID[8]; |
122 | unsigned int geomID[8]; |
123 | unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT][8]; |
124 | }; |
125 | |
126 | /* Combined ray/hit structure for a packet of 8 rays */ |
127 | struct RTCRayHit8 |
128 | { |
129 | struct RTCRay8 ray; |
130 | struct RTCHit8 hit; |
131 | }; |
132 | |
133 | /* Ray structure for a packet of 16 rays */ |
134 | struct RTC_ALIGN(64) RTCRay16 |
135 | { |
136 | float org_x[16]; |
137 | float org_y[16]; |
138 | float org_z[16]; |
139 | float tnear[16]; |
140 | |
141 | float dir_x[16]; |
142 | float dir_y[16]; |
143 | float dir_z[16]; |
144 | float time[16]; |
145 | |
146 | float tfar[16]; |
147 | unsigned int mask[16]; |
148 | unsigned int id[16]; |
149 | unsigned int flags[16]; |
150 | }; |
151 | |
152 | /* Hit structure for a packet of 16 rays */ |
153 | struct RTC_ALIGN(64) RTCHit16 |
154 | { |
155 | float Ng_x[16]; |
156 | float Ng_y[16]; |
157 | float Ng_z[16]; |
158 | |
159 | float u[16]; |
160 | float v[16]; |
161 | |
162 | unsigned int primID[16]; |
163 | unsigned int geomID[16]; |
164 | unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT][16]; |
165 | }; |
166 | |
167 | /* Combined ray/hit structure for a packet of 16 rays */ |
168 | struct RTCRayHit16 |
169 | { |
170 | struct RTCRay16 ray; |
171 | struct RTCHit16 hit; |
172 | }; |
173 | |
174 | /* Ray structure for a packet/stream of N rays in pointer SOA layout */ |
175 | struct RTCRayNp |
176 | { |
177 | float* org_x; |
178 | float* org_y; |
179 | float* org_z; |
180 | float* tnear; |
181 | |
182 | float* dir_x; |
183 | float* dir_y; |
184 | float* dir_z; |
185 | float* time; |
186 | |
187 | float* tfar; |
188 | unsigned int* mask; |
189 | unsigned int* id; |
190 | unsigned int* flags; |
191 | }; |
192 | |
193 | /* Hit structure for a packet/stream of N rays in pointer SOA layout */ |
194 | struct RTCHitNp |
195 | { |
196 | float* Ng_x; |
197 | float* Ng_y; |
198 | float* Ng_z; |
199 | |
200 | float* u; |
201 | float* v; |
202 | |
203 | unsigned int* primID; |
204 | unsigned int* geomID; |
205 | unsigned int* instID[RTC_MAX_INSTANCE_LEVEL_COUNT]; |
206 | }; |
207 | |
208 | /* Combined ray/hit structure for a packet/stream of N rays in pointer SOA layout */ |
209 | struct RTCRayHitNp |
210 | { |
211 | struct RTCRayNp ray; |
212 | struct RTCHitNp hit; |
213 | }; |
214 | |
215 | struct RTCRayN; |
216 | struct RTCHitN; |
217 | struct RTCRayHitN; |
218 | |
219 | #if defined(__cplusplus) |
220 | |
221 | /* Helper functions to access ray packets of runtime size N */ |
222 | RTC_FORCEINLINE float& RTCRayN_org_x(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[0*N+i]; } |
223 | RTC_FORCEINLINE float& RTCRayN_org_y(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[1*N+i]; } |
224 | RTC_FORCEINLINE float& RTCRayN_org_z(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[2*N+i]; } |
225 | RTC_FORCEINLINE float& RTCRayN_tnear(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[3*N+i]; } |
226 | |
227 | RTC_FORCEINLINE float& RTCRayN_dir_x(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[4*N+i]; } |
228 | RTC_FORCEINLINE float& RTCRayN_dir_y(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[5*N+i]; } |
229 | RTC_FORCEINLINE float& RTCRayN_dir_z(RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[6*N+i]; } |
230 | RTC_FORCEINLINE float& RTCRayN_time (RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[7*N+i]; } |
231 | |
232 | RTC_FORCEINLINE float& RTCRayN_tfar (RTCRayN* ray, unsigned int N, unsigned int i) { return ((float*)ray)[8*N+i]; } |
233 | RTC_FORCEINLINE unsigned int& RTCRayN_mask (RTCRayN* ray, unsigned int N, unsigned int i) { return ((unsigned*)ray)[9*N+i]; } |
234 | RTC_FORCEINLINE unsigned int& RTCRayN_id (RTCRayN* ray, unsigned int N, unsigned int i) { return ((unsigned*)ray)[10*N+i]; } |
235 | RTC_FORCEINLINE unsigned int& RTCRayN_flags(RTCRayN* ray, unsigned int N, unsigned int i) { return ((unsigned*)ray)[11*N+i]; } |
236 | |
237 | /* Helper functions to access hit packets of runtime size N */ |
238 | RTC_FORCEINLINE float& RTCHitN_Ng_x(RTCHitN* hit, unsigned int N, unsigned int i) { return ((float*)hit)[0*N+i]; } |
239 | RTC_FORCEINLINE float& RTCHitN_Ng_y(RTCHitN* hit, unsigned int N, unsigned int i) { return ((float*)hit)[1*N+i]; } |
240 | RTC_FORCEINLINE float& RTCHitN_Ng_z(RTCHitN* hit, unsigned int N, unsigned int i) { return ((float*)hit)[2*N+i]; } |
241 | |
242 | RTC_FORCEINLINE float& RTCHitN_u(RTCHitN* hit, unsigned int N, unsigned int i) { return ((float*)hit)[3*N+i]; } |
243 | RTC_FORCEINLINE float& RTCHitN_v(RTCHitN* hit, unsigned int N, unsigned int i) { return ((float*)hit)[4*N+i]; } |
244 | |
245 | RTC_FORCEINLINE unsigned int& RTCHitN_primID(RTCHitN* hit, unsigned int N, unsigned int i) { return ((unsigned*)hit)[5*N+i]; } |
246 | RTC_FORCEINLINE unsigned int& RTCHitN_geomID(RTCHitN* hit, unsigned int N, unsigned int i) { return ((unsigned*)hit)[6*N+i]; } |
247 | RTC_FORCEINLINE unsigned int& RTCHitN_instID(RTCHitN* hit, unsigned int N, unsigned int i, unsigned int l) { return ((unsigned*)hit)[7*N+i+N*l]; } |
248 | |
249 | /* Helper functions to extract RTCRayN and RTCHitN from RTCRayHitN */ |
250 | RTC_FORCEINLINE RTCRayN* RTCRayHitN_RayN(RTCRayHitN* rayhit, unsigned int N) { return (RTCRayN*)&((float*)rayhit)[0*N]; } |
251 | RTC_FORCEINLINE RTCHitN* RTCRayHitN_HitN(RTCRayHitN* rayhit, unsigned int N) { return (RTCHitN*)&((float*)rayhit)[12*N]; } |
252 | |
253 | /* Helper structure for a ray packet of compile-time size N */ |
254 | template<int N> |
255 | struct RTCRayNt |
256 | { |
257 | float org_x[N]; |
258 | float org_y[N]; |
259 | float org_z[N]; |
260 | float tnear[N]; |
261 | |
262 | float dir_x[N]; |
263 | float dir_y[N]; |
264 | float dir_z[N]; |
265 | float time[N]; |
266 | |
267 | float tfar[N]; |
268 | unsigned int mask[N]; |
269 | unsigned int id[N]; |
270 | unsigned int flags[N]; |
271 | }; |
272 | |
273 | /* Helper structure for a hit packet of compile-time size N */ |
274 | template<int N> |
275 | struct RTCHitNt |
276 | { |
277 | float Ng_x[N]; |
278 | float Ng_y[N]; |
279 | float Ng_z[N]; |
280 | |
281 | float u[N]; |
282 | float v[N]; |
283 | |
284 | unsigned int primID[N]; |
285 | unsigned int geomID[N]; |
286 | unsigned int instID[RTC_MAX_INSTANCE_LEVEL_COUNT][N]; |
287 | }; |
288 | |
289 | /* Helper structure for a combined ray/hit packet of compile-time size N */ |
290 | template<int N> |
291 | struct RTCRayHitNt |
292 | { |
293 | RTCRayNt<N> ray; |
294 | RTCHitNt<N> hit; |
295 | }; |
296 | |
297 | RTC_FORCEINLINE RTCRay rtcGetRayFromRayN(RTCRayN* rayN, unsigned int N, unsigned int i) |
298 | { |
299 | RTCRay ray; |
300 | ray.org_x = RTCRayN_org_x(rayN,N,i); |
301 | ray.org_y = RTCRayN_org_y(rayN,N,i); |
302 | ray.org_z = RTCRayN_org_z(rayN,N,i); |
303 | ray.tnear = RTCRayN_tnear(rayN,N,i); |
304 | ray.dir_x = RTCRayN_dir_x(rayN,N,i); |
305 | ray.dir_y = RTCRayN_dir_y(rayN,N,i); |
306 | ray.dir_z = RTCRayN_dir_z(rayN,N,i); |
307 | ray.time = RTCRayN_time(rayN,N,i); |
308 | ray.tfar = RTCRayN_tfar(rayN,N,i); |
309 | ray.mask = RTCRayN_mask(rayN,N,i); |
310 | ray.id = RTCRayN_id(rayN,N,i); |
311 | ray.flags = RTCRayN_flags(rayN,N,i); |
312 | return ray; |
313 | } |
314 | |
315 | RTC_FORCEINLINE RTCHit rtcGetHitFromHitN(RTCHitN* hitN, unsigned int N, unsigned int i) |
316 | { |
317 | RTCHit hit; |
318 | hit.Ng_x = RTCHitN_Ng_x(hitN,N,i); |
319 | hit.Ng_y = RTCHitN_Ng_y(hitN,N,i); |
320 | hit.Ng_z = RTCHitN_Ng_z(hitN,N,i); |
321 | hit.u = RTCHitN_u(hitN,N,i); |
322 | hit.v = RTCHitN_v(hitN,N,i); |
323 | hit.primID = RTCHitN_primID(hitN,N,i); |
324 | hit.geomID = RTCHitN_geomID(hitN,N,i); |
325 | for (unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++) |
326 | hit.instID[l] = RTCHitN_instID(hitN,N,i,l); |
327 | return hit; |
328 | } |
329 | |
330 | RTC_FORCEINLINE void rtcCopyHitToHitN(RTCHitN* hitN, const RTCHit* hit, unsigned int N, unsigned int i) |
331 | { |
332 | RTCHitN_Ng_x(hitN,N,i) = hit->Ng_x; |
333 | RTCHitN_Ng_y(hitN,N,i) = hit->Ng_y; |
334 | RTCHitN_Ng_z(hitN,N,i) = hit->Ng_z; |
335 | RTCHitN_u(hitN,N,i) = hit->u; |
336 | RTCHitN_v(hitN,N,i) = hit->v; |
337 | RTCHitN_primID(hitN,N,i) = hit->primID; |
338 | RTCHitN_geomID(hitN,N,i) = hit->geomID; |
339 | for (unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++) |
340 | RTCHitN_instID(hitN,N,i,l) = hit->instID[l]; |
341 | } |
342 | |
343 | RTC_FORCEINLINE RTCRayHit rtcGetRayHitFromRayHitN(RTCRayHitN* rayhitN, unsigned int N, unsigned int i) |
344 | { |
345 | RTCRayHit rh; |
346 | |
347 | RTCRayN* ray = RTCRayHitN_RayN(rayhitN,N); |
348 | rh.ray.org_x = RTCRayN_org_x(ray,N,i); |
349 | rh.ray.org_y = RTCRayN_org_y(ray,N,i); |
350 | rh.ray.org_z = RTCRayN_org_z(ray,N,i); |
351 | rh.ray.tnear = RTCRayN_tnear(ray,N,i); |
352 | rh.ray.dir_x = RTCRayN_dir_x(ray,N,i); |
353 | rh.ray.dir_y = RTCRayN_dir_y(ray,N,i); |
354 | rh.ray.dir_z = RTCRayN_dir_z(ray,N,i); |
355 | rh.ray.time = RTCRayN_time(ray,N,i); |
356 | rh.ray.tfar = RTCRayN_tfar(ray,N,i); |
357 | rh.ray.mask = RTCRayN_mask(ray,N,i); |
358 | rh.ray.id = RTCRayN_id(ray,N,i); |
359 | rh.ray.flags = RTCRayN_flags(ray,N,i); |
360 | |
361 | RTCHitN* hit = RTCRayHitN_HitN(rayhitN,N); |
362 | rh.hit.Ng_x = RTCHitN_Ng_x(hit,N,i); |
363 | rh.hit.Ng_y = RTCHitN_Ng_y(hit,N,i); |
364 | rh.hit.Ng_z = RTCHitN_Ng_z(hit,N,i); |
365 | rh.hit.u = RTCHitN_u(hit,N,i); |
366 | rh.hit.v = RTCHitN_v(hit,N,i); |
367 | rh.hit.primID = RTCHitN_primID(hit,N,i); |
368 | rh.hit.geomID = RTCHitN_geomID(hit,N,i); |
369 | for (unsigned int l = 0; l < RTC_MAX_INSTANCE_LEVEL_COUNT; l++) |
370 | rh.hit.instID[l] = RTCHitN_instID(hit,N,i,l); |
371 | |
372 | return rh; |
373 | } |
374 | |
375 | #endif |
376 | |
377 | RTC_NAMESPACE_END |
378 | |
379 | |