diff options
Diffstat (limited to 'thirdparty/embree/kernels/common/accelset.h')
-rw-r--r-- | thirdparty/embree/kernels/common/accelset.h | 142 |
1 files changed, 128 insertions, 14 deletions
diff --git a/thirdparty/embree/kernels/common/accelset.h b/thirdparty/embree/kernels/common/accelset.h index 1b67120c97..f78830e397 100644 --- a/thirdparty/embree/kernels/common/accelset.h +++ b/thirdparty/embree/kernels/common/accelset.h @@ -17,11 +17,15 @@ namespace embree struct IntersectFunctionNArguments : public RTCIntersectFunctionNArguments { Geometry* geometry; + RTCScene forward_scene; + RTCIntersectArguments* args; }; struct OccludedFunctionNArguments : public RTCOccludedFunctionNArguments { Geometry* geometry; + RTCScene forward_scene; + RTCIntersectArguments* args; }; /*! Base class for set of acceleration structures. */ @@ -138,10 +142,9 @@ namespace embree public: /*! Intersects a single ray with the scene. */ - __forceinline void intersect (RayHit& ray, unsigned int geomID, unsigned int primID, IntersectContext* context) + __forceinline bool intersect (RayHit& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context) { assert(primID < size()); - assert(intersectorN.intersect); int mask = -1; IntersectFunctionNArguments args; @@ -153,17 +156,94 @@ namespace embree args.geomID = geomID; args.primID = primID; args.geometry = this; + args.forward_scene = nullptr; + args.args = context->args; + + IntersectFuncN intersectFunc = nullptr; + intersectFunc = intersectorN.intersect; - intersectorN.intersect(&args); + if (context->getIntersectFunction()) + intersectFunc = context->getIntersectFunction(); + + assert(intersectFunc); + intersectFunc(&args); + + return mask != 0; } /*! Tests if single ray is occluded by the scene. */ - __forceinline void occluded (Ray& ray, unsigned int geomID, unsigned int primID, IntersectContext* context) + __forceinline bool occluded (Ray& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context) { assert(primID < size()); - assert(intersectorN.occluded); + + int mask = -1; + OccludedFunctionNArguments args; + args.valid = &mask; + args.geometryUserPtr = userPtr; + args.context = context->user; + args.ray = (RTCRayN*)&ray; + args.N = 1; + args.geomID = geomID; + args.primID = primID; + args.geometry = this; + args.forward_scene = nullptr; + args.args = context->args; + + OccludedFuncN occludedFunc = nullptr; + occludedFunc = intersectorN.occluded; + + if (context->getOccludedFunction()) + occludedFunc = context->getOccludedFunction(); + + assert(occludedFunc); + occludedFunc(&args); + + return mask != 0; + } + + /*! Intersects a single ray with the scene. */ + __forceinline bool intersect (RayHit& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context, RTCScene& forward_scene) + { + assert(primID < size()); int mask = -1; + IntersectFunctionNArguments args; + args.valid = &mask; + args.geometryUserPtr = userPtr; + args.context = context->user; + args.rayhit = (RTCRayHitN*)&ray; + args.N = 1; + args.geomID = geomID; + args.primID = primID; + args.geometry = this; + args.forward_scene = nullptr; + args.args = nullptr; + + typedef void (*RTCIntersectFunctionSYCL)(const void* args); + RTCIntersectFunctionSYCL intersectFunc = nullptr; + +#if EMBREE_SYCL_GEOMETRY_CALLBACK + if (context->args->feature_mask & RTC_FEATURE_FLAG_USER_GEOMETRY_CALLBACK_IN_GEOMETRY) + intersectFunc = (RTCIntersectFunctionSYCL) intersectorN.intersect; +#endif + + if (context->args->feature_mask & RTC_FEATURE_FLAG_USER_GEOMETRY_CALLBACK_IN_ARGUMENTS) + if (context->getIntersectFunction()) + intersectFunc = (RTCIntersectFunctionSYCL) context->getIntersectFunction(); + + if (intersectFunc) + intersectFunc(&args); + + forward_scene = args.forward_scene; + return mask != 0; + } + + /*! Tests if single ray is occluded by the scene. */ + __forceinline bool occluded (Ray& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context, RTCScene& forward_scene) + { + assert(primID < size()); + + int mask = -1; OccludedFunctionNArguments args; args.valid = &mask; args.geometryUserPtr = userPtr; @@ -173,16 +253,33 @@ namespace embree args.geomID = geomID; args.primID = primID; args.geometry = this; + args.forward_scene = nullptr; + args.args = nullptr; + + typedef void (*RTCOccludedFunctionSYCL)(const void* args); + RTCOccludedFunctionSYCL occludedFunc = nullptr; + +#if EMBREE_SYCL_GEOMETRY_CALLBACK + if (context->args->feature_mask & RTC_FEATURE_FLAG_USER_GEOMETRY_CALLBACK_IN_GEOMETRY) + occludedFunc = (RTCOccludedFunctionSYCL) intersectorN.occluded; +#endif + + if (context->args->feature_mask & RTC_FEATURE_FLAG_USER_GEOMETRY_CALLBACK_IN_ARGUMENTS) + if (context->getOccludedFunction()) + occludedFunc = (RTCOccludedFunctionSYCL) context->getOccludedFunction(); + + if (occludedFunc) + occludedFunc(&args); - intersectorN.occluded(&args); + forward_scene = args.forward_scene; + return mask != 0; } - + /*! Intersects a packet of K rays with the scene. */ template<int K> - __forceinline void intersect (const vbool<K>& valid, RayHitK<K>& ray, unsigned int geomID, unsigned int primID, IntersectContext* context) + __forceinline void intersect (const vbool<K>& valid, RayHitK<K>& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context) { assert(primID < size()); - assert(intersectorN.intersect); vint<K> mask = valid.mask32(); IntersectFunctionNArguments args; @@ -194,16 +291,24 @@ namespace embree args.geomID = geomID; args.primID = primID; args.geometry = this; - - intersectorN.intersect(&args); + args.forward_scene = nullptr; + args.args = context->args; + + IntersectFuncN intersectFunc = nullptr; + intersectFunc = intersectorN.intersect; + + if (context->getIntersectFunction()) + intersectFunc = context->getIntersectFunction(); + + assert(intersectFunc); + intersectFunc(&args); } /*! Tests if a packet of K rays is occluded by the scene. */ template<int K> - __forceinline void occluded (const vbool<K>& valid, RayK<K>& ray, unsigned int geomID, unsigned int primID, IntersectContext* context) + __forceinline void occluded (const vbool<K>& valid, RayK<K>& ray, unsigned int geomID, unsigned int primID, RayQueryContext* context) { assert(primID < size()); - assert(intersectorN.occluded); vint<K> mask = valid.mask32(); OccludedFunctionNArguments args; @@ -215,8 +320,17 @@ namespace embree args.geomID = geomID; args.primID = primID; args.geometry = this; + args.forward_scene = nullptr; + args.args = context->args; + + OccludedFuncN occludedFunc = nullptr; + occludedFunc = intersectorN.occluded; - intersectorN.occluded(&args); + if (context->getOccludedFunction()) + occludedFunc = context->getOccludedFunction(); + + assert(occludedFunc); + occludedFunc(&args); } public: |