summaryrefslogtreecommitdiffstats
path: root/thirdparty/embree/kernels/common/context.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree/kernels/common/context.h')
-rw-r--r--thirdparty/embree/kernels/common/context.h74
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;