| 699 | static const size_t numSceneGeomFlags = 32; |
| 700 | |
| 701 | __noinline void IntersectWithModeInternal(IntersectMode mode, IntersectVariant ivariant, RTCScene scene, RTCRayHit* rays, unsigned int N, RTCIntersectArguments* args) |
| 702 | { |
| 703 | RTCIntersectArguments _args; |
| 704 | if (!args) |
| 705 | { |
| 706 | rtcInitIntersectArguments(&_args); |
| 707 | args = &_args; |
| 708 | } |
| 709 | |
| 710 | RTCRayQueryFlags flags = ((ivariant & VARIANT_COHERENT_INCOHERENT_MASK) == VARIANT_COHERENT) ? RTC_RAY_QUERY_FLAG_COHERENT : RTC_RAY_QUERY_FLAG_INCOHERENT; |
| 711 | args->flags = (RTCRayQueryFlags) (args->flags | flags); |
| 712 | |
| 713 | switch (mode) |
| 714 | { |
| 715 | case MODE_INTERSECT_NONE: |
| 716 | break; |
| 717 | case MODE_INTERSECT1: |
| 718 | { |
| 719 | switch (ivariant & VARIANT_INTERSECT_OCCLUDED_MASK) { |
| 720 | case VARIANT_INTERSECT: for (size_t i=0; i<N; i++) rtcIntersect1(scene,&rays[i],args); break; |
| 721 | case VARIANT_OCCLUDED : for (size_t i=0; i<N; i++) rtcOccluded1 (scene,(RTCRay*)&rays[i],(RTCOccludedArguments*)args); break; |
| 722 | default: assert(false); |
| 723 | } |
| 724 | break; |
| 725 | } |
| 726 | |
| 727 | case MODE_INTERSECT4: |
| 728 | { |
| 729 | for (size_t i=0; i<N; i+=4) |
| 730 | { |
| 731 | size_t M = min(size_t(4),N-i); |
| 732 | __aligned(16) int valid[4]; |
| 733 | __aligned(16) RTCRayHit4 ray4; |
| 734 | for (size_t j=0; j<4; j++) valid[j] = (j<M && rays[i+j].ray.tnear <= rays[i+j].ray.tfar) ? -1 : 0; |
| 735 | for (size_t j=0; j<M; j++) setRay(ray4,j,rays[i+j]); |
| 736 | for (size_t j=M; j<4; j++) setRay(ray4,j,makeRay(zero,zero,pos_inf,neg_inf)); |
| 737 | switch (ivariant & VARIANT_INTERSECT_OCCLUDED_MASK) { |
| 738 | case VARIANT_INTERSECT: rtcIntersect4(valid,scene,&ray4,args); break; |
| 739 | case VARIANT_OCCLUDED : rtcOccluded4 (valid,scene,(RTCRay4*)&ray4,(RTCOccludedArguments*)args); break; |
| 740 | default: assert(false); |
| 741 | } |
| 742 | for (size_t j=0; j<M; j++) rays[i+j] = getRay(ray4,j); |
| 743 | } |
| 744 | break; |
| 745 | } |
| 746 | case MODE_INTERSECT8: |
| 747 | { |
| 748 | for (size_t i=0; i<N; i+=8) |
| 749 | { |
| 750 | size_t M = min(size_t(8),N-i); |
| 751 | __aligned(32) int valid[8]; |
| 752 | __aligned(32) RTCRayHit8 ray8; |
| 753 | for (size_t j=0; j<8; j++) valid[j] = (j<M && rays[i+j].ray.tnear <= rays[i+j].ray.tfar) ? -1 : 0; |
| 754 | for (size_t j=0; j<M; j++) setRay(ray8,j,rays[i+j]); |
| 755 | for (size_t j=M; j<8; j++) setRay(ray8,j,makeRay(zero,zero,pos_inf,neg_inf)); |
| 756 | switch (ivariant & VARIANT_INTERSECT_OCCLUDED_MASK) { |
| 757 | case VARIANT_INTERSECT: rtcIntersect8(valid,scene,&ray8,args); break; |
| 758 | case VARIANT_OCCLUDED : rtcOccluded8 (valid,scene,(RTCRay8*)&ray8,(RTCOccludedArguments*)args); break; |
no test coverage detected