| 596 | |
| 597 | template<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); |
no test coverage detected