diff options
Diffstat (limited to 'thirdparty/embree/kernels/common/context.h')
-rw-r--r-- | thirdparty/embree/kernels/common/context.h | 74 |
1 files changed, 58 insertions, 16 deletions
diff --git a/thirdparty/embree/kernels/common/context.h b/thirdparty/embree/kernels/common/context.h index ccd88bdeac..936d03e54d 100644 --- a/thirdparty/embree/kernels/common/context.h +++ b/thirdparty/embree/kernels/common/context.h @@ -11,35 +11,62 @@ namespace embree { class Scene; - struct IntersectContext + struct RayQueryContext { public: - __forceinline IntersectContext(Scene* scene, RTCIntersectContext* user_context) - : scene(scene), user(user_context) {} + + __forceinline RayQueryContext(Scene* scene, RTCRayQueryContext* user_context, RTCIntersectArguments* args) + : scene(scene), user(user_context), args(args) {} + + __forceinline RayQueryContext(Scene* scene, RTCRayQueryContext* user_context, RTCOccludedArguments* args) + : scene(scene), user(user_context), args((RTCIntersectArguments*)args) {} __forceinline bool hasContextFilter() const { - return user->filter != nullptr; + return args->filter != nullptr; + } + + RTCFilterFunctionN getFilter() const { + return args->filter; + } + + RTCIntersectFunctionN getIntersectFunction() const { + return args->intersect; + } + + RTCOccludedFunctionN getOccludedFunction() const { + return (RTCOccludedFunctionN) args->intersect; } __forceinline bool isCoherent() const { - return embree::isCoherent(user->flags); + return embree::isCoherent(args->flags); } __forceinline bool isIncoherent() const { - return embree::isIncoherent(user->flags); + return embree::isIncoherent(args->flags); } - + + __forceinline bool enforceArgumentFilterFunction() const { + return args->flags & RTC_RAY_QUERY_FLAG_INVOKE_ARGUMENT_FILTER; + } + +#if RTC_MIN_WIDTH + __forceinline float getMinWidthDistanceFactor() const { + return args->minWidthDistanceFactor; + } +#endif + public: - Scene* scene; - RTCIntersectContext* user; + Scene* scene = nullptr; + RTCRayQueryContext* user = nullptr; + RTCIntersectArguments* args = nullptr; }; template<int M, typename Geometry> - __forceinline Vec4vf<M> enlargeRadiusToMinWidth(const IntersectContext* context, const Geometry* geom, const Vec3vf<M>& ray_org, const Vec4vf<M>& v) + __forceinline Vec4vf<M> enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3vf<M>& ray_org, const Vec4vf<M>& v) { #if RTC_MIN_WIDTH const vfloat<M> d = length(Vec3vf<M>(v) - ray_org); - const vfloat<M> r = clamp(context->user->minWidthDistanceFactor*d, v.w, geom->maxRadiusScale*v.w); + const vfloat<M> r = clamp(context->getMinWidthDistanceFactor()*d, v.w, geom->maxRadiusScale*v.w); return Vec4vf<M>(v.x,v.y,v.z,r); #else return v; @@ -47,16 +74,21 @@ namespace embree } template<typename Geometry> - __forceinline Vec3ff enlargeRadiusToMinWidth(const IntersectContext* context, const Geometry* geom, const Vec3fa& ray_org, const Vec3ff& v) + __forceinline Vec3ff enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3fa& ray_org, const Vec3ff& v) { #if RTC_MIN_WIDTH const float d = length(Vec3fa(v) - ray_org); - const float r = clamp(context->user->minWidthDistanceFactor*d, v.w, geom->maxRadiusScale*v.w); + const float r = clamp(context->getMinWidthDistanceFactor()*d, v.w, geom->maxRadiusScale*v.w); return Vec3ff(v.x,v.y,v.z,r); #else return v; #endif } + + template<typename Geometry> + __forceinline Vec3ff enlargeRadiusToMinWidth(const RayQueryContext* context, const Geometry* geom, const Vec3fa& ray_org, const Vec4f& v) { + return enlargeRadiusToMinWidth(context,geom,ray_org,Vec3ff(v.x,v.y,v.z,v.w)); + } enum PointQueryType { @@ -66,7 +98,7 @@ namespace embree }; typedef bool (*PointQueryFunction)(struct RTCPointQueryFunctionArguments* args); - + struct PointQueryContext { public: @@ -78,6 +110,7 @@ namespace embree float similarityScale, void* userPtr) : scene(scene) + , tstate(nullptr) , query_ws(query_ws) , query_type(query_type) , func(func) @@ -88,16 +121,24 @@ namespace embree , geomID(RTC_INVALID_GEOMETRY_ID) , query_radius(query_ws->radius) { + update(); + } + + public: + __forceinline void update() + { if (query_type == POINT_QUERY_TYPE_AABB) { assert(similarityScale == 0.f); updateAABB(); } + else{ + query_radius = Vec3fa(query_ws->radius * similarityScale); + } if (userContext->instStackSize == 0) { assert(similarityScale == 1.f); } } - public: __forceinline void updateAABB() { if (likely(query_ws->radius == (float)inf || userContext->instStackSize == 0)) { @@ -113,12 +154,13 @@ namespace embree public: Scene* scene; + void* tstate; PointQuery* query_ws; // the original world space point query PointQueryType query_type; PointQueryFunction func; RTCPointQueryContext* userContext; - const float similarityScale; + float similarityScale; void* userPtr; |