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

Function IntersectWithModeInternal

tutorials/verify/rtcore_helpers.h:701–785  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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;

Callers 1

IntersectWithModeFunction · 0.85

Calls 14

rtcIntersect1Function · 0.85
rtcOccluded1Function · 0.85
setRayFunction · 0.85
makeRayFunction · 0.85
rtcIntersect4Function · 0.85
rtcOccluded4Function · 0.85
getRayFunction · 0.85
rtcIntersect8Function · 0.85
rtcOccluded8Function · 0.85
rtcIntersect16Function · 0.85
rtcOccluded16Function · 0.85

Tested by

no test coverage detected