MCPcopy Create free account
hub / github.com/RenderKit/embree / trav_loop

Function trav_loop

kernels/sycl/rthwif_embree.cpp:598–664  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

596
597template<typename Ray>
598__forceinline void trav_loop(intel_ray_query_t& query, Ray& ray, Scene* scene, sycl::private_ptr<RayQueryContext> context, const RTCFeatureFlags feature_mask)
599{
600 Scenes scenes(scene);
601 while (!intel_is_traversal_done(query))
602 {
603 intel_candidate_type_t candidate = intel_get_hit_candidate(query, intel_hit_type_potential_hit);
604
605 const unsigned int bvh_level = intel_get_hit_bvh_level( query, intel_hit_type_potential_hit );
606 const float3 org = intel_get_ray_origin ( query, bvh_level );
607 const float3 dir = intel_get_ray_direction( query, bvh_level );
608 const float t = intel_get_hit_distance(query, intel_hit_type_potential_hit);
609 const float2 uv = intel_get_hit_barycentrics (query, intel_hit_type_potential_hit);
610 const unsigned int geomID = intel_get_hit_geometry_id(query, intel_hit_type_potential_hit);
611 const unsigned int primID = intel_get_hit_primitive_id(query, intel_hit_type_potential_hit);
612
613 ray.org = Vec3ff(org.x(), org.y(), org.z(), ray.tnear());
614 ray.dir = Vec3ff(dir.x(), dir.y(), dir.z(), ray.time ());
615 ray.tfar = intel_get_hit_distance(query, intel_hit_type_committed_hit);
616
617#if RTC_MAX_INSTANCE_LEVEL_COUNT > 1
618 context->user->instStackSize = bvh_level;
619 Scene* scene = scenes.get(bvh_level);
620#else
621 const unsigned int instID = intel_get_hit_instance_id(query, intel_hit_type_potential_hit);
622
623 /* assume software instancing mode by default (required for rtcForwardRay) */
624 Scene* scene = scenes.get(bvh_level);
625
626 /* if we are in hardware instancing mode and we need to read the scene from the instance */
627 if (bvh_level > 0 && instID != RTC_INVALID_GEOMETRY_ID) {
628 Instance* inst = scenes.get(0)->get<Instance>(instID);
629 scene = (Scene*) inst->object;
630 context->user->instID[0] = instID;
631 }
632 else if (bvh_level == 0)
633 context->user->instID[0] = RTC_INVALID_GEOMETRY_ID;
634
635#endif
636 context->scene = scene;
637 Geometry* geom = scene->get(geomID);
638
639 /* perform ray masking */
640#if defined(EMBREE_RAY_MASK)
641 if (ray.mask & geom->mask)
642#endif
643 {
644 if (candidate == intel_candidate_type_procedural)
645 {
646 if (intersect_primitive(query,ray,scenes,geom,context,geomID,primID,feature_mask))
647 if (commit_potential_hit (query, ray))
648 break; // shadow rays break at first hit
649
650 }
651 else // if (candidate == TRIANGLE)
652 {
653 ray.tfar = t;
654 Vec3f Ng = intel_get_hit_triangle_normal(query, intel_hit_type_potential_hit);
655 Hit hit(context->user,geomID,primID,Vec2f(uv.x(),uv.y()),Ng);

Callers 2

rtcIntersectRTHWFunction · 0.85
rtcOccludedRTHWFunction · 0.85

Calls 15

intel_is_traversal_doneFunction · 0.85
intel_get_hit_candidateFunction · 0.85
intel_get_hit_bvh_levelFunction · 0.85
intel_get_ray_originFunction · 0.85
intel_get_ray_directionFunction · 0.85
intel_get_hit_distanceFunction · 0.85
intersect_primitiveFunction · 0.85
commit_potential_hitFunction · 0.85

Tested by

no test coverage detected