41 "MetalRTIntersectionLocalPayload max_hits & num_hits bitfields are too small");
75 const float r = metal::catmull_rom(u, radius[0], radius[1], radius[2], radius[3]);
82# if defined(__METALRT_MOTION__)
83 bvh_instance_motion_push(
NULL,
object, ray, &ray_P, &ray_D, &idir);
90 const float avoidance_factor = 2.0f;
91 return t *
len(ray_D) > avoidance_factor * r;
97# if defined(__METALRT_MOTION__)
98 float time = ray->time;
120 motion_curve_keys(kg,
object, time, ka, k0, k1, kb, curve);
127# if defined(__METALRT_MOTION__)
128 bvh_instance_motion_push(
NULL,
object, ray, &ray_P, &ray_D, &idir);
134 const float4 P_curve4 = metal::catmull_rom(u, curve[0], curve[1], curve[2], curve[3]);
135 const float r_curve = P_curve4.w;
140 const float4 dPdu4 = metal::catmull_rom_derivative(u, curve[0], curve[1], curve[2], curve[3]);
146 float v =
dot(
P - P_curve, bitangent) / r_curve;
147 return clamp(
v, -1.0, 1.0f);
155 const uint visibility,
158 metal::raytracing::ray r(ray->P, ray->D, ray->tmin, ray->tmax);
159 metalrt_intersector_type metalrt_intersect;
160 metalrt_intersect.force_opacity(metal::raytracing::forced_opacity::non_opaque);
161 metalrt_intersect.assume_geometry_type(
162 metal::raytracing::geometry_type::triangle |
163 (
kernel_data.bvh.have_curves ? metal::raytracing::geometry_type::curve :
164 metal::raytracing::geometry_type::none) |
165 (
kernel_data.bvh.have_points ? metal::raytracing::geometry_type::bounding_box :
166 metal::raytracing::geometry_type::none));
168 typename metalrt_intersector_type::result_type intersection;
174#if defined(__METALRT_MOTION__)
175 intersection = metalrt_intersect.intersect(r,
176 metal_ancillaries->accel_struct,
179 metal_ancillaries->ift_default,
182 intersection = metalrt_intersect.intersect(
183 r, metal_ancillaries->accel_struct, visibility, metal_ancillaries->ift_default, payload);
186 if (intersection.type == intersection_type::none) {
187 isect->t = ray->tmax;
193 isect->object = intersection.instance_id;
194 isect->t = intersection.distance;
195 if (intersection.type == intersection_type::triangle) {
196 isect->prim = intersection.primitive_id + intersection.user_instance_id;
197 isect->type =
kernel_data_fetch(objects, intersection.instance_id).primitive_type;
198 isect->u = intersection.triangle_barycentric_coord.x;
199 isect->v = intersection.triangle_barycentric_coord.y;
202 else if (
kernel_data.bvh.have_curves && intersection.type == intersection_type::curve) {
203 int prim = intersection.primitive_id + intersection.user_instance_id;
205 isect->prim = segment.prim;
206 isect->type = segment.type;
207 isect->u = intersection.curve_parameter;
210 isect->v = curve_ribbon_v(kg,
211 intersection.curve_parameter,
212 intersection.distance,
214 intersection.instance_id,
224 else if (
kernel_data.bvh.have_points && intersection.type == intersection_type::bounding_box) {
225 const int object = intersection.instance_id;
226 const uint prim = intersection.primitive_id + intersection.user_instance_id;
231# if defined(__METALRT_MOTION__)
232 bvh_instance_motion_push(
NULL,
object, ray, &r.origin, &r.direction, &idir);
239 if (!point_intersect(
NULL,
252 isect->t = ray->tmax;
266 const uint visibility)
268 metal::raytracing::ray r(ray->P, ray->D, ray->tmin, ray->tmax);
269 metalrt_intersector_type metalrt_intersect;
270 metalrt_intersect.force_opacity(metal::raytracing::forced_opacity::non_opaque);
271 metalrt_intersect.assume_geometry_type(
272 metal::raytracing::geometry_type::triangle |
273 (
kernel_data.bvh.have_curves ? metal::raytracing::geometry_type::curve :
274 metal::raytracing::geometry_type::none) |
275 (
kernel_data.bvh.have_points ? metal::raytracing::geometry_type::bounding_box :
276 metal::raytracing::geometry_type::none));
278 typename metalrt_intersector_type::result_type intersection;
280 metalrt_intersect.accept_any_intersection(
true);
283 payload.
self = ray->self;
285#if defined(__METALRT_MOTION__)
286 intersection = metalrt_intersect.intersect(r,
287 metal_ancillaries->accel_struct,
290 metal_ancillaries->ift_shadow,
293 intersection = metalrt_intersect.intersect(
294 r, metal_ancillaries->accel_struct, visibility, metal_ancillaries->ift_shadow, payload);
296 return (intersection.type != intersection_type::none);
300template<
bool single_hit = false>
310 metal::raytracing::ray r(ray->P, ray->D, ray->tmin, ray->tmax);
312# if defined(__METALRT_MOTION__)
313 metalrt_intersector_type metalrt_intersect;
314 typename metalrt_intersector_type::result_type
intersection;
316 metalrt_blas_intersector_type metalrt_intersect;
317 typename metalrt_blas_intersector_type::result_type
intersection;
327 metalrt_intersect.assume_geometry_type(metal::raytracing::geometry_type::triangle);
331 payload.
self_prim = ray->self.prim - primitive_id_offset;
335 metalrt_intersect.force_opacity((ray->self.prim ==
PRIM_NONE) ?
336 metal::raytracing::forced_opacity::opaque :
337 metal::raytracing::forced_opacity::non_opaque);
339# if defined(__METALRT_MOTION__)
341 metal_ancillaries->accel_struct,
344 metal_ancillaries->ift_local_single_hit_mblur,
349 metal_ancillaries->blas_accel_structs[local_object].blas,
350 metal_ancillaries->ift_local_single_hit,
355 local_isect->num_hits = 0;
362 local_isect->num_hits = 1;
363 local_isect->hits[0].prim = prim;
364 local_isect->hits[0].type = prim_type;
365 local_isect->hits[0].object = local_object;
366 local_isect->hits[0].u =
intersection.triangle_barycentric_coord.x;
367 local_isect->hits[0].v =
intersection.triangle_barycentric_coord.y;
374 local_isect->Ng[0] =
normalize(
cross(tri_b - tri_a, tri_c - tri_a));
379 payload.
self_prim = ray->self.prim - primitive_id_offset;
387 metalrt_intersect.force_opacity(metal::raytracing::forced_opacity::non_opaque);
389# if defined(__METALRT_MOTION__)
391 metal_ancillaries->accel_struct,
394 metal_ancillaries->ift_local_mblur,
399 metal_ancillaries->blas_accel_structs[local_object].blas,
400 metal_ancillaries->ift_local,
414 const int num_hits = payload.
num_hits;
420 local_isect->num_hits = num_hits;
421 for (
int hit = 0; hit < num_hits; hit++) {
422 uint prim = payload.
hit_prim[hit] + primitive_id_offset;
423 local_isect->hits[hit].prim = prim;
424 local_isect->hits[hit].t = payload.
hit_t[hit];
425 local_isect->hits[hit].u = payload.
hit_u[hit];
426 local_isect->hits[hit].v = payload.
hit_v[hit];
427 local_isect->hits[hit].object = local_object;
428 local_isect->hits[hit].type = prim_type;
434 local_isect->Ng[hit] =
normalize(
cross(tri_b - tri_a, tri_c - tri_a));
442#ifdef __SHADOW_RECORD_ALL__
451 metal::raytracing::ray r(ray->P, ray->D, ray->tmin, ray->tmax);
452 metalrt_intersector_type metalrt_intersect;
453 metalrt_intersect.force_opacity(metal::raytracing::forced_opacity::non_opaque);
454 metalrt_intersect.assume_geometry_type(
455 metal::raytracing::geometry_type::triangle |
456 (
kernel_data.bvh.have_curves ? metal::raytracing::geometry_type::curve :
457 metal::raytracing::geometry_type::none) |
458 (
kernel_data.bvh.have_points ? metal::raytracing::geometry_type::bounding_box :
459 metal::raytracing::geometry_type::none));
462 payload.
self = ray->self;
470 typename metalrt_intersector_type::result_type
intersection;
472# if defined(__METALRT_MOTION__)
474 metal_ancillaries->accel_struct,
477 metal_ancillaries->ift_shadow_all,
481 r, metal_ancillaries->accel_struct, visibility, metal_ancillaries->ift_shadow_all, payload);
495 const uint visibility)
497 metal::raytracing::ray r(ray->P, ray->D, ray->tmin, ray->tmax);
498 metalrt_intersector_type metalrt_intersect;
499 metalrt_intersect.force_opacity(metal::raytracing::forced_opacity::non_opaque);
500 metalrt_intersect.set_geometry_cull_mode(metal::raytracing::geometry_cull_mode::bounding_box |
501 metal::raytracing::geometry_cull_mode::curve);
502 metalrt_intersect.assume_geometry_type(
503 metal::raytracing::geometry_type::triangle |
504 (
kernel_data.bvh.have_curves ? metal::raytracing::geometry_type::curve :
505 metal::raytracing::geometry_type::none) |
506 (
kernel_data.bvh.have_points ? metal::raytracing::geometry_type::bounding_box :
507 metal::raytracing::geometry_type::none));
510 payload.
self = ray->self;
512 typename metalrt_intersector_type::result_type
intersection;
514# if defined(__METALRT_MOTION__)
516 metal_ancillaries->accel_struct,
519 metal_ancillaries->ift_volume,
523 r, metal_ancillaries->accel_struct, visibility, metal_ancillaries->ift_volume, payload);
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define kernel_assert(cond)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_forceinline
#define CCL_NAMESPACE_END
#define ccl_device_intersect
ccl_device_inline void bvh_instance_push(KernelGlobals kg, int object, ccl_private const Ray *ray, ccl_private float3 *P, ccl_private float3 *dir, ccl_private float3 *idir)
#define PRIMITIVE_UNPACK_SEGMENT(type)
@ SD_OBJECT_TRANSFORM_APPLIED
ccl_device_inline float cross(const float2 a, const float2 b)
Intersection< segment > intersection
VecBase< float, 4 > float4
IntegratorShadowStateCPU *ccl_restrict IntegratorShadowState
ccl_device_inline float3 float4_to_float3(const float4 a)
ccl_device_inline int clamp(int a, int mn, int mx)