25rtDeclareVariable(Ray, ray, rtCurrentRay, );
26rtDeclareVariable(PerRayData, prd, rtPayload, );
37 if (prd.origin_UUID == patch_UUID[objID]) {
41 uint position = primitive_positions[patch_UUID[objID]];
42 if (twosided_flag[position] >= 2) {
46 float3 v0 = patch_vertices[make_uint2(0, objID)];
47 float3 v1 = patch_vertices[make_uint2(1, objID)];
48 float3 v2 = patch_vertices[make_uint2(2, objID)];
49 float3 v3 = patch_vertices[make_uint2(3, objID)];
52 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
57 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
59 if (t == t && t > 1e-8 && t < 1e8) {
61 float3 p = ray.origin + ray.direction * t;
62 float3 d = p - anchor;
64 float ddota = dot(d, a);
66 if (ddota > 0.0 && ddota < dot(a, a)) {
68 float ddotb = dot(d, b);
70 if (ddotb > 0.0 && ddotb < dot(b, b)) {
72 uint U = patch_UUID[objID];
76 uint ID = primitive_positions[U];
83 if (maskID[ID] == -1) {
84 if (rtPotentialIntersection(t)) {
85 UUID = patch_UUID[objID];
86 rtReportIntersection(0);
90 float amag = d_magnitude(a);
91 float bmag = d_magnitude(b);
92 float2 uv = make_float2(ddota / amag / amag, ddotb / bmag / bmag);
93 int2 sz = masksize[maskID[ID]];
96 ind = make_uint3(floorf(
float(sz.x - 1) * uv.x), floorf(
float(sz.y - 1) * (1.f - uv.y)), maskID[ID]);
99 float2 uvmin = uvdata[make_uint2(0, uvID[ID])];
101 duv.x = uvdata[make_uint2(1, uvID[ID])].x - uvdata[make_uint2(0, uvID[ID])].x;
102 duv.y = uvdata[make_uint2(2, uvID[ID])].y - uvdata[make_uint2(1, uvID[ID])].y;
104 ind = make_uint3(floorf(
float(sz.x - 1) * (uvmin.x + uv.x * duv.x)), floorf(
float(sz.y - 1) * (1.f - uvmin.y - uv.y * duv.y)), maskID[ID]);
105 if (ind.x >= sz.x || ind.y >= sz.y) {
110 if (rtPotentialIntersection(t)) {
111 UUID = patch_UUID[objID];
112 rtReportIntersection(0);
124 optix::Aabb *aabb = (optix::Aabb *) result;
125 float3 v0 = patch_vertices[make_uint2(0, objID)];
126 float3 v1 = patch_vertices[make_uint2(1, objID)];
127 float3 v2 = patch_vertices[make_uint2(2, objID)];
128 float3 v3 = patch_vertices[make_uint2(3, objID)];
129 float3 min = make_float3(fmin(fmin(v0.x, v1.x), fmin(v2.x, v3.x)), fmin(fmin(v0.y, v1.y), fmin(v2.y, v3.y)), fmin(fmin(v0.z, v1.z), fmin(v2.z, v3.z)));
130 float3 max = make_float3(fmax(fmax(v0.x, v1.x), fmax(v2.x, v3.x)), fmax(fmax(v0.y, v1.y), fmax(v2.y, v3.y)), fmax(fmax(v0.z, v1.z), fmax(v2.z, v3.z)));
140 if (prd.origin_UUID == triangle_UUID[objID]) {
144 uint position = primitive_positions[triangle_UUID[objID]];
145 if (twosided_flag[position] >= 2) {
149 float3 v0 = triangle_vertices[make_uint2(0, objID)];
150 float3 v1 = triangle_vertices[make_uint2(1, objID)];
151 float3 v2 = triangle_vertices[make_uint2(2, objID)];
153 float a = v0.x - v1.x, b = v0.x - v2.x, c = ray.direction.x, d = v0.x - ray.origin.x;
154 float e = v0.y - v1.y, f = v0.y - v2.y, g = ray.direction.y, h = v0.y - ray.origin.y;
155 float i = v0.z - v1.z, j = v0.z - v2.z, k = ray.direction.z, l = v0.z - ray.origin.z;
157 float m = f * k - g * j, n = h * k - g * l, p = f * l - h * j;
158 float q = g * i - e * k, s = e * j - f * i;
160 float inv_denom = 1.f / (a * m + b * q + c * s);
162 float e1 = d * m - b * n - c * p;
163 float beta = e1 * inv_denom;
167 float r = r = e * l - h * i;
168 float e2 = a * n + d * q + c * r;
169 float gamma = e2 * inv_denom;
171 if (gamma > 0.0 && beta + gamma < 1.0) {
173 float e3 = a * p - b * r + d * s;
174 float t = e3 * inv_denom;
178 uint U = triangle_UUID[objID];
181 uint ID = primitive_positions[U];
184 if (ID == UINT_MAX) {
188 if (maskID[ID] == -1) {
189 if (rtPotentialIntersection(t)) {
190 UUID = triangle_UUID[objID];
191 rtReportIntersection(0);
195 int2 sz = masksize[maskID[ID]];
197 float2 uv0 = uvdata[make_uint2(0, uvID[ID])];
198 float2 uv1 = uvdata[make_uint2(1, uvID[ID])];
199 float2 uv2 = uvdata[make_uint2(2, uvID[ID])];
201 float2 uv = uv0 + beta * (uv1 - uv0) + gamma * (uv2 - uv0);
204 uint3 ind = make_uint3(roundf(
float(sz.x - 1) * fabs(uv.x)), roundf(
float(sz.y - 1) * fabs(uv.y)), maskID[ID]);
205 if (ind.x >= sz.x || ind.y >= sz.y) {
209 if (rtPotentialIntersection(t)) {
210 UUID = triangle_UUID[objID];
211 rtReportIntersection(0);
223 optix::Aabb *aabb = (optix::Aabb *) result;
224 float3 v0 = triangle_vertices[make_uint2(0, objID)];
225 float3 v1 = triangle_vertices[make_uint2(1, objID)];
226 float3 v2 = triangle_vertices[make_uint2(2, objID)];
227 float3 mn = make_float3(fmin(fmin(v0.x, v1.x), v2.x), fmin(fmin(v0.y, v1.y), v2.y), fmin(fmin(v0.z, v1.z), v2.z));
228 float3 mx = make_float3(fmax(fmax(v0.x, v1.x), v2.x), fmax(fmax(v0.y, v1.y), v2.y), fmax(fmax(v0.z, v1.z), v2.z));
238 if (prd.origin_UUID == disk_UUID[objID]) {
242 uint position = primitive_positions[disk_UUID[objID]];
243 if (twosided_flag[position] >= 2) {
247 float3 center = make_float3(0, 0, 0);
248 float3 normal = make_float3(0, 0, 1);
250 float t = dot(center - ray.origin, normal) / dot(ray.direction, normal);
254 float3 p = ray.origin + t * ray.direction;
256 float3 r = p - center;
258 if (r.x * r.x + r.y * r.y + r.z * r.z < 1.f) {
260 if (rtPotentialIntersection(t)) {
261 UUID = disk_UUID[objID];
262 rtReportIntersection(0);
283 if (prd.origin_UUID == voxel_UUID[objID]) {
287 uint position = primitive_positions[voxel_UUID[objID]];
288 if (twosided_flag[position] >= 2) {
292 float x0 = voxel_vertices[make_uint2(0, objID)].x;
293 float y0 = voxel_vertices[make_uint2(0, objID)].y;
294 float z0 = voxel_vertices[make_uint2(0, objID)].z;
296 float x1 = voxel_vertices[make_uint2(1, objID)].x;
297 float y1 = voxel_vertices[make_uint2(1, objID)].y;
298 float z1 = voxel_vertices[make_uint2(1, objID)].z;
300 float ox = ray.origin.x;
301 float oy = ray.origin.y;
302 float oz = ray.origin.z;
303 float dx = ray.direction.x;
304 float dy = ray.direction.y;
305 float dz = ray.direction.z;
307 float tx_min, ty_min, tz_min;
308 float tx_max, ty_max, tz_max;
312 tx_min = (x0 - ox) * a;
313 tx_max = (x1 - ox) * a;
315 tx_min = (x1 - ox) * a;
316 tx_max = (x0 - ox) * a;
321 ty_min = (y0 - oy) * b;
322 ty_max = (y1 - oy) * b;
324 ty_min = (y1 - oy) * b;
325 ty_max = (y0 - oy) * b;
330 tz_min = (z0 - oz) * c;
331 tz_max = (z1 - oz) * c;
333 tz_min = (z1 - oz) * c;
334 tz_max = (z0 - oz) * c;
359 if (t0 < t1 && t0 > 1e-5) {
360 if (rtPotentialIntersection(t0)) {
361 UUID = voxel_UUID[objID];
362 rtReportIntersection(0);
382 if (prd.origin_UUID == bbox_UUID[objID]) {
387 uint position = Nprimitives + objID;
388 if (twosided_flag[position] >= 2) {
392 float3 v0 = bbox_vertices[make_uint2(0, objID)];
393 float3 v1 = bbox_vertices[make_uint2(1, objID)];
394 float3 v2 = bbox_vertices[make_uint2(2, objID)];
395 float3 v3 = bbox_vertices[make_uint2(3, objID)];
398 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
403 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
405 if (t == t && t > 1e-8 && t < 1e8) {
407 float3 p = ray.origin + ray.direction * t;
408 float3 d = p - anchor;
410 float ddota = dot(d, a);
412 if (ddota > 0.0 && ddota < dot(a, a)) {
414 float ddotb = dot(d, b);
416 if (ddotb > 0.0 && ddotb < dot(b, b)) {
418 if (rtPotentialIntersection(t)) {
419 UUID = bbox_UUID[objID];
420 rtReportIntersection(0);
430 optix::Aabb *aabb = (optix::Aabb *) result;
431 float3 v0 = bbox_vertices[make_uint2(0, objID)];
432 float3 v1 = bbox_vertices[make_uint2(1, objID)];
433 float3 v2 = bbox_vertices[make_uint2(2, objID)];
434 float3 v3 = bbox_vertices[make_uint2(3, objID)];
435 float3 min = make_float3(fmin(fmin(v0.x, v1.x), fmin(v2.x, v3.x)), fmin(fmin(v0.y, v1.y), fmin(v2.y, v3.y)), fmin(fmin(v0.z, v1.z), fmin(v2.z, v3.z)));
436 float3 max = make_float3(fmax(fmax(v0.x, v1.x), fmax(v2.x, v3.x)), fmax(fmax(v0.y, v1.y), fmax(v2.y, v3.y)), fmax(fmax(v0.z, v1.z), fmax(v2.z, v3.z)));
446 if (prd.origin_UUID == tile_UUID[objID]) {
450 uint position = primitive_positions[tile_UUID[objID]];
451 if (twosided_flag[position] >= 2) {
455 float3 v0 = tile_vertices[make_uint2(0, objID)];
456 float3 v1 = tile_vertices[make_uint2(1, objID)];
457 float3 v2 = tile_vertices[make_uint2(2, objID)];
458 float3 v3 = tile_vertices[make_uint2(3, objID)];
461 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
466 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
468 if (t == t && t > 1e-8 && t < 1e8) {
470 float3 p = ray.origin + ray.direction * t;
471 float3 d = p - anchor;
473 float ddota = dot(d, a);
475 if (ddota > 0.0 && ddota < dot(a, a)) {
477 float ddotb = dot(d, b);
479 if (ddotb > 0.0 && ddotb < dot(b, b)) {
481 float amag = d_magnitude(a);
482 float bmag = d_magnitude(b);
483 float2 uv = make_float2(ddota / amag / amag, ddotb / bmag / bmag);
486 uint U = tile_UUID[objID];
489 uint ID = primitive_positions[U];
492 if (ID == UINT_MAX) {
496 if (maskID[ID] == -1) {
497 if (rtPotentialIntersection(t)) {
499 int subpatch_x = min((
int) floorf(uv.x * object_subdivisions[ID].x), object_subdivisions[ID].x - 1);
500 int subpatch_y = min((
int) floorf(uv.y * object_subdivisions[ID].y), object_subdivisions[ID].y - 1);
501 UUID = U + subpatch_y * object_subdivisions[ID].x + subpatch_x;
502 rtReportIntersection(0);
507 int2 sz = masksize[maskID[ID]];
508 uint3 ind = make_uint3(floorf(
float(sz.x - 1) * uv.x), floorf(
float(sz.y - 1) * (1.f - uv.y)), maskID[ID]);
511 if (rtPotentialIntersection(t)) {
513 int subpatch_x = min((
int) floorf(uv.x * object_subdivisions[ID].x), object_subdivisions[ID].x - 1);
514 int subpatch_y = min((
int) floorf(uv.y * object_subdivisions[ID].y), object_subdivisions[ID].y - 1);
515 UUID = U + subpatch_y * object_subdivisions[ID].x + subpatch_x;
516 rtReportIntersection(0);
528 optix::Aabb *aabb = (optix::Aabb *) result;
529 float3 v0 = tile_vertices[make_uint2(0, objID)];
530 float3 v1 = tile_vertices[make_uint2(1, objID)];
531 float3 v2 = tile_vertices[make_uint2(2, objID)];
532 float3 v3 = tile_vertices[make_uint2(3, objID)];
533 float3 min = make_float3(fmin(fmin(v0.x, v1.x), fmin(v2.x, v3.x)), fmin(fmin(v0.y, v1.y), fmin(v2.y, v3.y)), fmin(fmin(v0.z, v1.z), fmin(v2.z, v3.z)));
534 float3 max = make_float3(fmax(fmax(v0.x, v1.x), fmax(v2.x, v3.x)), fmax(fmax(v0.y, v1.y), fmax(v2.y, v3.y)), fmax(fmax(v0.z, v1.z), fmax(v2.z, v3.z)));