25rtDeclareVariable(Ray, ray, rtCurrentRay, );
26rtDeclareVariable(PerRayData, prd, rtPayload, );
28rtDeclareVariable(
unsigned int, UUID, attribute UUID, );
36 if (prd.origin_UUID == patch_UUID[objID]) {
38 }
else if (twosided_flag[patch_UUID[objID]] >= 2) {
42 float3 v0 = patch_vertices[make_uint2(0, objID)];
43 float3 v1 = patch_vertices[make_uint2(1, objID)];
44 float3 v2 = patch_vertices[make_uint2(2, objID)];
45 float3 v3 = patch_vertices[make_uint2(3, objID)];
48 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
53 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
55 if (t == t && t > 1e-8 && t < 1e8) {
57 float3 p = ray.origin + ray.direction * t;
58 float3 d = p - anchor;
60 float ddota = dot(d, a);
62 if (ddota > 0.0 && ddota < dot(a, a)) {
64 float ddotb = dot(d, b);
66 if (ddotb > 0.0 && ddotb < dot(b, b)) {
68 uint U = patch_UUID[objID];
70 uint ID = objectID[U];
72 if (maskID[ID] == -1) {
73 if (rtPotentialIntersection(t)) {
74 UUID = patch_UUID[objID];
75 rtReportIntersection(0);
79 float amag = d_magnitude(a);
80 float bmag = d_magnitude(b);
81 float2 uv = make_float2(ddota / amag / amag, ddotb / bmag / bmag);
82 int2 sz = masksize[maskID[ID]];
85 ind = make_uint3(floorf(
float(sz.x - 1) * uv.x), floorf(
float(sz.y - 1) * (1.f - uv.y)), maskID[ID]);
88 float2 uvmin = uvdata[make_uint2(0, uvID[ID])];
90 duv.x = uvdata[make_uint2(1, uvID[ID])].x - uvdata[make_uint2(0, uvID[ID])].x;
91 duv.y = uvdata[make_uint2(2, uvID[ID])].y - uvdata[make_uint2(1, uvID[ID])].y;
93 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]);
94 if (ind.x >= sz.x || ind.y >= sz.y) {
95 rtPrintf(
"ERROR: texture out of bounds. uv = (%f,%f)\n", uv.x, uv.y);
99 if (rtPotentialIntersection(t)) {
100 UUID = patch_UUID[objID];
101 rtReportIntersection(0);
113 optix::Aabb *aabb = (optix::Aabb *) result;
114 float3 v0 = patch_vertices[make_uint2(0, objID)];
115 float3 v1 = patch_vertices[make_uint2(1, objID)];
116 float3 v2 = patch_vertices[make_uint2(2, objID)];
117 float3 v3 = patch_vertices[make_uint2(3, objID)];
118 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)));
119 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)));
129 if (prd.origin_UUID == triangle_UUID[objID]) {
131 }
else if (twosided_flag[triangle_UUID[objID]] >= 2) {
135 float3 v0 = triangle_vertices[make_uint2(0, objID)];
136 float3 v1 = triangle_vertices[make_uint2(1, objID)];
137 float3 v2 = triangle_vertices[make_uint2(2, objID)];
139 float a = v0.x - v1.x, b = v0.x - v2.x, c = ray.direction.x, d = v0.x - ray.origin.x;
140 float e = v0.y - v1.y, f = v0.y - v2.y, g = ray.direction.y, h = v0.y - ray.origin.y;
141 float i = v0.z - v1.z, j = v0.z - v2.z, k = ray.direction.z, l = v0.z - ray.origin.z;
143 float m = f * k - g * j, n = h * k - g * l, p = f * l - h * j;
144 float q = g * i - e * k, s = e * j - f * i;
146 float inv_denom = 1.f / (a * m + b * q + c * s);
148 float e1 = d * m - b * n - c * p;
149 float beta = e1 * inv_denom;
153 float r = r = e * l - h * i;
154 float e2 = a * n + d * q + c * r;
155 float gamma = e2 * inv_denom;
157 if (gamma > 0.0 && beta + gamma < 1.0) {
159 float e3 = a * p - b * r + d * s;
160 float t = e3 * inv_denom;
164 uint U = triangle_UUID[objID];
166 uint ID = objectID[U];
168 if (maskID[ID] == -1) {
169 if (rtPotentialIntersection(t)) {
170 UUID = triangle_UUID[objID];
171 rtReportIntersection(0);
175 int2 sz = masksize[maskID[ID]];
177 float2 uv0 = uvdata[make_uint2(0, uvID[ID])];
178 float2 uv1 = uvdata[make_uint2(1, uvID[ID])];
179 float2 uv2 = uvdata[make_uint2(2, uvID[ID])];
181 float2 uv = uv0 + beta * (uv1 - uv0) + gamma * (uv2 - uv0);
184 uint3 ind = make_uint3(roundf(
float(sz.x - 1) * fabs(uv.x)), roundf(
float(sz.y - 1) * fabs(uv.y)), maskID[ID]);
185 if (ind.x >= sz.x || ind.y >= sz.y) {
186 rtPrintf(
"ERROR: texture out of bounds. uv = (%f,%f)\n", uv.x, uv.y);
189 if (rtPotentialIntersection(t)) {
190 UUID = triangle_UUID[objID];
191 rtReportIntersection(0);
203 optix::Aabb *aabb = (optix::Aabb *) result;
204 float3 v0 = triangle_vertices[make_uint2(0, objID)];
205 float3 v1 = triangle_vertices[make_uint2(1, objID)];
206 float3 v2 = triangle_vertices[make_uint2(2, objID)];
207 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));
208 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));
218 if (prd.origin_UUID == disk_UUID[objID]) {
220 }
else if (twosided_flag[disk_UUID[objID]] >= 2) {
224 float3 center = make_float3(0, 0, 0);
225 float3 normal = make_float3(0, 0, 1);
227 float t = dot(center - ray.origin, normal) / dot(ray.direction, normal);
231 float3 p = ray.origin + t * ray.direction;
233 float3 r = p - center;
235 if (r.x * r.x + r.y * r.y + r.z * r.z < 1.f) {
237 if (rtPotentialIntersection(t)) {
238 UUID = disk_UUID[objID];
239 rtReportIntersection(0);
260 if (prd.origin_UUID == voxel_UUID[objID]) {
262 }
else if (twosided_flag[voxel_UUID[objID]] >= 2) {
266 float x0 = voxel_vertices[make_uint2(0, objID)].x;
267 float y0 = voxel_vertices[make_uint2(0, objID)].y;
268 float z0 = voxel_vertices[make_uint2(0, objID)].z;
270 float x1 = voxel_vertices[make_uint2(1, objID)].x;
271 float y1 = voxel_vertices[make_uint2(1, objID)].y;
272 float z1 = voxel_vertices[make_uint2(1, objID)].z;
274 float ox = ray.origin.x;
275 float oy = ray.origin.y;
276 float oz = ray.origin.z;
277 float dx = ray.direction.x;
278 float dy = ray.direction.y;
279 float dz = ray.direction.z;
281 float tx_min, ty_min, tz_min;
282 float tx_max, ty_max, tz_max;
286 tx_min = (x0 - ox) * a;
287 tx_max = (x1 - ox) * a;
289 tx_min = (x1 - ox) * a;
290 tx_max = (x0 - ox) * a;
295 ty_min = (y0 - oy) * b;
296 ty_max = (y1 - oy) * b;
298 ty_min = (y1 - oy) * b;
299 ty_max = (y0 - oy) * b;
304 tz_min = (z0 - oz) * c;
305 tz_max = (z1 - oz) * c;
307 tz_min = (z1 - oz) * c;
308 tz_max = (z0 - oz) * c;
333 if (t0 < t1 && t0 > 1e-5) {
334 if (rtPotentialIntersection(t0)) {
335 UUID = voxel_UUID[objID];
336 rtReportIntersection(0);
356 if (prd.origin_UUID == bbox_UUID[objID]) {
358 }
else if (twosided_flag[bbox_UUID[objID]] >= 2) {
362 float3 v0 = bbox_vertices[make_uint2(0, objID)];
363 float3 v1 = bbox_vertices[make_uint2(1, objID)];
364 float3 v2 = bbox_vertices[make_uint2(2, objID)];
365 float3 v3 = bbox_vertices[make_uint2(3, objID)];
368 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
373 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
375 if (t == t && t > 1e-8 && t < 1e8) {
377 float3 p = ray.origin + ray.direction * t;
378 float3 d = p - anchor;
380 float ddota = dot(d, a);
382 if (ddota > 0.0 && ddota < dot(a, a)) {
384 float ddotb = dot(d, b);
386 if (ddotb > 0.0 && ddotb < dot(b, b)) {
388 if (rtPotentialIntersection(t)) {
389 UUID = bbox_UUID[objID];
390 rtReportIntersection(0);
400 optix::Aabb *aabb = (optix::Aabb *) result;
401 float3 v0 = bbox_vertices[make_uint2(0, objID)];
402 float3 v1 = bbox_vertices[make_uint2(1, objID)];
403 float3 v2 = bbox_vertices[make_uint2(2, objID)];
404 float3 v3 = bbox_vertices[make_uint2(3, objID)];
405 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)));
406 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)));
416 if (prd.origin_UUID == tile_UUID[objID]) {
418 }
else if (twosided_flag[tile_UUID[objID]] >= 2) {
422 float3 v0 = tile_vertices[make_uint2(0, objID)];
423 float3 v1 = tile_vertices[make_uint2(1, objID)];
424 float3 v2 = tile_vertices[make_uint2(2, objID)];
425 float3 v3 = tile_vertices[make_uint2(3, objID)];
428 float3 normal = normalize(
cross(v1 - v0, v2 - v0));
433 float t = dot(anchor - ray.origin, normal) / dot(ray.direction, normal);
435 if (t == t && t > 1e-8 && t < 1e8) {
437 float3 p = ray.origin + ray.direction * t;
438 float3 d = p - anchor;
440 float ddota = dot(d, a);
442 if (ddota > 0.0 && ddota < dot(a, a)) {
444 float ddotb = dot(d, b);
446 if (ddotb > 0.0 && ddotb < dot(b, b)) {
448 float amag = d_magnitude(a);
449 float bmag = d_magnitude(b);
450 float2 uv = make_float2(ddota / amag / amag, ddotb / bmag / bmag);
452 uint U = tile_UUID[objID];
454 uint ID = objectID[U];
456 if (maskID[ID] == -1) {
457 if (rtPotentialIntersection(t)) {
458 UUID = U + floorf(uv.y * object_subdivisions[ID].y) * object_subdivisions[ID].x + floorf(uv.x * object_subdivisions[ID].x);
459 rtReportIntersection(0);
464 int2 sz = masksize[maskID[ID]];
465 uint3 ind = make_uint3(floorf(
float(sz.x - 1) * uv.x), floorf(
float(sz.y - 1) * (1.f - uv.y)), maskID[ID]);
468 if (rtPotentialIntersection(t)) {
469 UUID = U + floorf(uv.y * object_subdivisions[ID].y) * object_subdivisions[ID].x + floorf(uv.x * object_subdivisions[ID].x);
470 rtReportIntersection(0);
482 optix::Aabb *aabb = (optix::Aabb *) result;
483 float3 v0 = tile_vertices[make_uint2(0, objID)];
484 float3 v1 = tile_vertices[make_uint2(1, objID)];
485 float3 v2 = tile_vertices[make_uint2(2, objID)];
486 float3 v3 = tile_vertices[make_uint2(3, objID)];
487 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)));
488 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)));