summaryrefslogtreecommitdiffstats
path: root/thirdparty/embree/kernels/geometry
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree/kernels/geometry')
-rw-r--r--thirdparty/embree/kernels/geometry/coneline_intersector.h4
-rw-r--r--thirdparty/embree/kernels/geometry/conelinei_intersector.h16
-rw-r--r--thirdparty/embree/kernels/geometry/curveNi_intersector.h113
-rw-r--r--thirdparty/embree/kernels/geometry/curveNi_mb_intersector.h49
-rw-r--r--thirdparty/embree/kernels/geometry/curveNv_intersector.h8
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector.h12
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector_distance.h65
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector_oriented.h78
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector_ribbon.h143
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector_sweep.h169
-rw-r--r--thirdparty/embree/kernels/geometry/curve_intersector_virtual.h54
-rw-r--r--thirdparty/embree/kernels/geometry/disc_intersector.h59
-rw-r--r--thirdparty/embree/kernels/geometry/disci_intersector.h32
-rw-r--r--thirdparty/embree/kernels/geometry/filter.h83
-rw-r--r--thirdparty/embree/kernels/geometry/filter_sycl.h109
-rw-r--r--thirdparty/embree/kernels/geometry/grid_intersector.h16
-rw-r--r--thirdparty/embree/kernels/geometry/grid_soa_intersector1.h16
-rw-r--r--thirdparty/embree/kernels/geometry/grid_soa_intersector_packet.h28
-rw-r--r--thirdparty/embree/kernels/geometry/instance_array.h85
-rw-r--r--thirdparty/embree/kernels/geometry/instance_array_intersector.h85
-rw-r--r--thirdparty/embree/kernels/geometry/instance_intersector.h24
-rw-r--r--thirdparty/embree/kernels/geometry/intersector_epilog.h88
-rw-r--r--thirdparty/embree/kernels/geometry/intersector_epilog_sycl.h207
-rw-r--r--thirdparty/embree/kernels/geometry/intersector_iterators.h31
-rw-r--r--thirdparty/embree/kernels/geometry/line_intersector.h4
-rw-r--r--thirdparty/embree/kernels/geometry/linei.h6
-rw-r--r--thirdparty/embree/kernels/geometry/linei_intersector.h16
-rw-r--r--thirdparty/embree/kernels/geometry/object.h11
-rw-r--r--thirdparty/embree/kernels/geometry/object_intersector.h50
-rw-r--r--thirdparty/embree/kernels/geometry/pointi.h24
-rw-r--r--thirdparty/embree/kernels/geometry/primitive.h4
-rw-r--r--thirdparty/embree/kernels/geometry/primitive4.cpp21
-rw-r--r--thirdparty/embree/kernels/geometry/quad_intersector_moeller.h16
-rw-r--r--thirdparty/embree/kernels/geometry/quad_intersector_pluecker.h16
-rw-r--r--thirdparty/embree/kernels/geometry/quadi_intersector.h48
-rw-r--r--thirdparty/embree/kernels/geometry/quadv_intersector.h24
-rw-r--r--thirdparty/embree/kernels/geometry/roundline_intersector.h4
-rw-r--r--thirdparty/embree/kernels/geometry/roundlinei_intersector.h16
-rw-r--r--thirdparty/embree/kernels/geometry/sphere_intersector.h68
-rw-r--r--thirdparty/embree/kernels/geometry/spherei_intersector.h16
-rw-r--r--thirdparty/embree/kernels/geometry/subdivpatch1_intersector.h40
-rw-r--r--thirdparty/embree/kernels/geometry/subgrid.h11
-rw-r--r--thirdparty/embree/kernels/geometry/subgrid_intersector.h48
-rw-r--r--thirdparty/embree/kernels/geometry/subgrid_intersector_moeller.h16
-rw-r--r--thirdparty/embree/kernels/geometry/subgrid_intersector_pluecker.h16
-rw-r--r--thirdparty/embree/kernels/geometry/subgrid_mb_intersector.h24
-rw-r--r--thirdparty/embree/kernels/geometry/triangle_intersector.h12
-rw-r--r--thirdparty/embree/kernels/geometry/triangle_intersector_moeller.h16
-rw-r--r--thirdparty/embree/kernels/geometry/triangle_intersector_pluecker.h4
-rw-r--r--thirdparty/embree/kernels/geometry/triangle_intersector_woop.h2
-rw-r--r--thirdparty/embree/kernels/geometry/trianglei_intersector.h48
-rw-r--r--thirdparty/embree/kernels/geometry/trianglev_intersector.h28
-rw-r--r--thirdparty/embree/kernels/geometry/trianglev_mb.h25
-rw-r--r--thirdparty/embree/kernels/geometry/trianglev_mb_intersector.h24
54 files changed, 1587 insertions, 645 deletions
diff --git a/thirdparty/embree/kernels/geometry/coneline_intersector.h b/thirdparty/embree/kernels/geometry/coneline_intersector.h
index 90f3792eff..696ea41ebc 100644
--- a/thirdparty/embree/kernels/geometry/coneline_intersector.h
+++ b/thirdparty/embree/kernels/geometry/coneline_intersector.h
@@ -159,7 +159,7 @@ namespace embree
template<typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
@@ -190,7 +190,7 @@ namespace embree
template<typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
diff --git a/thirdparty/embree/kernels/geometry/conelinei_intersector.h b/thirdparty/embree/kernels/geometry/conelinei_intersector.h
index 6a985ebcad..c919fe9f7b 100644
--- a/thirdparty/embree/kernels/geometry/conelinei_intersector.h
+++ b/thirdparty/embree/kernels/geometry/conelinei_intersector.h
@@ -16,7 +16,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -27,7 +27,7 @@ namespace embree
ConeCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,cL,cR,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -51,7 +51,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -62,7 +62,7 @@ namespace embree
ConeCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,cL,cR,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -86,7 +86,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -97,7 +97,7 @@ namespace embree
ConeCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,cL,cR,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -115,7 +115,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -126,7 +126,7 @@ namespace embree
ConeCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,cL,cR,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
diff --git a/thirdparty/embree/kernels/geometry/curveNi_intersector.h b/thirdparty/embree/kernels/geometry/curveNi_intersector.h
index c0b66515c1..137ec06d0c 100644
--- a/thirdparty/embree/kernels/geometry/curveNi_intersector.h
+++ b/thirdparty/embree/kernels/geometry/curveNi_intersector.h
@@ -5,6 +5,12 @@
#include "curveNi.h"
+#include "roundline_intersector.h"
+#include "coneline_intersector.h"
+#include "curve_intersector_ribbon.h"
+#include "curve_intersector_oriented.h"
+#include "curve_intersector_sweep.h"
+
namespace embree
{
namespace isa
@@ -20,9 +26,14 @@ namespace embree
static __forceinline vbool<M> intersect(Ray& ray, const Primitive& prim, vfloat<M>& tNear_o)
{
const size_t N = prim.N;
+#if defined(EMBREE_SYCL_SUPPORT) && defined(__SYCL_DEVICE_ONLY__)
+ const Vec3fa offset = *prim.offset(N);
+ const float scale = *prim.scale(N);
+#else
const vfloat4 offset_scale = vfloat4::loadu(prim.offset(N));
const Vec3fa offset = Vec3fa(offset_scale);
const Vec3fa scale = Vec3fa(shuffle<3,3,3,3>(offset_scale));
+#endif
const Vec3fa org1 = (ray.org-offset)*scale;
const Vec3fa dir1 = ray.dir*scale;
@@ -50,7 +61,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -84,7 +95,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -121,7 +132,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_n(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_n(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -157,7 +168,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_n(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_n(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -196,7 +207,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_h(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_h(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -217,7 +228,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_h(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_h(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -241,7 +252,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_hn(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_hn(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -262,7 +273,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_hn(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_hn(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -297,10 +308,14 @@ namespace embree
static __forceinline vbool<M> intersect(RayK<K>& ray, const size_t k, const Primitive& prim, vfloat<M>& tNear_o)
{
const size_t N = prim.N;
+#if defined(EMBREE_SYCL_SUPPORT) && defined(__SYCL_DEVICE_ONLY__)
+ const Vec3fa offset = *prim.offset(N);
+ const float scale = *prim.scale(N);
+#else
const vfloat4 offset_scale = vfloat4::loadu(prim.offset(N));
const Vec3fa offset = Vec3fa(offset_scale);
const Vec3fa scale = Vec3fa(shuffle<3,3,3,3>(offset_scale));
-
+#endif
const Vec3fa ray_org(ray.org.x[k],ray.org.y[k],ray.org.z[k]);
const Vec3fa ray_dir(ray.dir.x[k],ray.dir.y[k],ray.dir.z[k]);
const Vec3fa org1 = (ray_org-offset)*scale;
@@ -330,7 +345,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -364,7 +379,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -401,7 +416,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_n(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_n(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -437,7 +452,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_n(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_n(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -476,7 +491,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_h(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_h(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -497,7 +512,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_h(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_h(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -521,7 +536,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_hn(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_hn(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -542,7 +557,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_hn(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_hn(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -565,5 +580,69 @@ namespace embree
return false;
}
};
+
+ __forceinline void convert_to_bezier(const Geometry::GType gtype,
+ Vec3ff& v0, Vec3ff& v1, Vec3ff& v2, Vec3ff& v3,
+ Vec3fa& n0, Vec3fa& n1, Vec3fa& n2, Vec3fa& n3)
+ {
+ const Geometry::GType basis = (Geometry::GType)(gtype & Geometry::GTY_BASIS_MASK);
+ const Geometry::GType stype = (Geometry::GType)(gtype & Geometry::GTY_SUBTYPE_MASK);
+
+ if (basis == Geometry::GTY_BASIS_BSPLINE) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(BSplineCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_HERMITE) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(HermiteCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_CATMULL_ROM) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(CatmullRomCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+
+ if (stype == Geometry::GTY_SUBTYPE_ORIENTED_CURVE)
+ {
+ if (basis == Geometry::GTY_BASIS_BSPLINE) {
+ BezierCurveT<Vec3fa> bezier;
+ convert(BSplineCurveT<Vec3fa>(n0,n1,n2,n3),bezier);
+ n0 = bezier.v0; n1 = bezier.v1; n2 = bezier.v2; n3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_HERMITE) {
+ BezierCurveT<Vec3fa> bezier;
+ convert(HermiteCurveT<Vec3fa>(n0,n1,n2,n3),bezier);
+ n0 = bezier.v0; n1 = bezier.v1; n2 = bezier.v2; n3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_CATMULL_ROM) {
+ BezierCurveT<Vec3fa> bezier;
+ convert(CatmullRomCurveT<Vec3fa>(n0,n1,n2,n3),bezier);
+ n0 = bezier.v0; n1 = bezier.v1; n2 = bezier.v2; n3 = bezier.v3;
+ }
+ }
+ }
+
+ __forceinline void convert_to_bezier(const Geometry::GType gtype, Vec3ff& v0, Vec3ff& v1, Vec3ff& v2, Vec3ff& v3)
+ {
+ const Geometry::GType basis = (Geometry::GType)(gtype & Geometry::GTY_BASIS_MASK);
+
+ if (basis == Geometry::GTY_BASIS_BSPLINE) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(BSplineCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_HERMITE) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(HermiteCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+ else if (basis == Geometry::GTY_BASIS_CATMULL_ROM) {
+ BezierCurveT<Vec3ff> bezier;
+ convert(CatmullRomCurveT<Vec3ff>(v0,v1,v2,v3),bezier);
+ v0 = bezier.v0; v1 = bezier.v1; v2 = bezier.v2; v3 = bezier.v3;
+ }
+ }
}
}
diff --git a/thirdparty/embree/kernels/geometry/curveNi_mb_intersector.h b/thirdparty/embree/kernels/geometry/curveNi_mb_intersector.h
index bab796b33b..4c14c2f004 100644
--- a/thirdparty/embree/kernels/geometry/curveNi_mb_intersector.h
+++ b/thirdparty/embree/kernels/geometry/curveNi_mb_intersector.h
@@ -6,6 +6,12 @@
#include "curveNi_mb.h"
#include "../subdiv/linear_bezier_patch.h"
+#include "roundline_intersector.h"
+#include "coneline_intersector.h"
+#include "curve_intersector_ribbon.h"
+#include "curve_intersector_oriented.h"
+#include "curve_intersector_sweep.h"
+
namespace embree
{
namespace isa
@@ -21,9 +27,14 @@ namespace embree
static __forceinline vbool<M> intersect(Ray& ray, const Primitive& prim, vfloat<M>& tNear_o)
{
const size_t N = prim.N;
+#if __SYCL_DEVICE_ONLY__
+ const Vec3f offset = *prim.offset(N);
+ const float scale = *prim.scale(N);
+#else
const vfloat4 offset_scale = vfloat4::loadu(prim.offset(N));
const Vec3fa offset = Vec3fa(offset_scale);
const Vec3fa scale = Vec3fa(shuffle<3,3,3,3>(offset_scale));
+#endif
const Vec3fa org1 = (ray.org-offset)*scale;
const Vec3fa dir1 = ray.dir*scale;
@@ -73,7 +84,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -95,7 +106,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -120,7 +131,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_n(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_n(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -141,7 +152,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_n(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_n(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -166,7 +177,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_h(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_h(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -187,7 +198,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_h(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_h(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -211,7 +222,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_hn(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_hn(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -232,7 +243,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_hn(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_hn(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,prim,tNear);
@@ -267,10 +278,14 @@ namespace embree
static __forceinline vbool<M> intersect(RayK<K>& ray, const size_t k, const Primitive& prim, vfloat<M>& tNear_o)
{
const size_t N = prim.N;
+#if __SYCL_DEVICE_ONLY__
+ const Vec3f offset = *prim.offset(N);
+ const float scale = *prim.scale(N);
+#else
const vfloat4 offset_scale = vfloat4::loadu(prim.offset(N));
const Vec3fa offset = Vec3fa(offset_scale);
const Vec3fa scale = Vec3fa(shuffle<3,3,3,3>(offset_scale));
-
+#endif
const Vec3fa ray_org(ray.org.x[k],ray.org.y[k],ray.org.z[k]);
const Vec3fa ray_dir(ray.dir.x[k],ray.dir.y[k],ray.dir.z[k]);
const Vec3fa org1 = (ray_org-offset)*scale;
@@ -322,7 +337,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
@@ -345,7 +360,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -370,7 +385,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_n(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_n(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
@@ -393,7 +408,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_n(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_n(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -419,7 +434,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_h(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_h(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
@@ -441,7 +456,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_h(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_h(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
@@ -465,7 +480,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_hn(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_hn(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
@@ -488,7 +503,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_hn(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_hn(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = intersect(ray,k,prim,tNear);
diff --git a/thirdparty/embree/kernels/geometry/curveNv_intersector.h b/thirdparty/embree/kernels/geometry/curveNv_intersector.h
index 2742725aec..cfbd1a029c 100644
--- a/thirdparty/embree/kernels/geometry/curveNv_intersector.h
+++ b/thirdparty/embree/kernels/geometry/curveNv_intersector.h
@@ -17,7 +17,7 @@ namespace embree
typedef CurvePrecalculations1 Precalculations;
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = CurveNiIntersector1<M>::intersect(ray,prim,tNear);
@@ -54,7 +54,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = CurveNiIntersector1<M>::intersect(ray,prim,tNear);
@@ -101,7 +101,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
template<typename Intersector, typename Epilog>
- static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect_t(Precalculations& pre, RayHitK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = CurveNiIntersectorK<M,K>::intersect(ray,k,prim,tNear);
@@ -138,7 +138,7 @@ namespace embree
}
template<typename Intersector, typename Epilog>
- static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded_t(Precalculations& pre, RayK<K>& ray, const size_t k, RayQueryContext* context, const Primitive& prim)
{
vfloat<M> tNear;
vbool<M> valid = CurveNiIntersectorK<M,K>::intersect(ray,k,prim,tNear);
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector.h b/thirdparty/embree/kernels/geometry/curve_intersector.h
index 1e8ac26125..a258befb5e 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector.h
@@ -24,7 +24,7 @@ namespace embree
typedef CurvePrecalculations1 Precalculations;
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -34,7 +34,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -50,7 +50,7 @@ namespace embree
typedef unsigned char Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -60,7 +60,7 @@ namespace embree
while (mask) leafIntersector.intersect<K>(&pre,&ray,bscf(mask),context,prim);
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -76,7 +76,7 @@ namespace embree
return valid_o;
}
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -85,7 +85,7 @@ namespace embree
leafIntersector.intersect<K>(&pre,&ray,k,context,prim);
}
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector_distance.h b/thirdparty/embree/kernels/geometry/curve_intersector_distance.h
index 748a9511a5..80e1760289 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector_distance.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector_distance.h
@@ -45,15 +45,56 @@ namespace embree
vfloat<M> vv;
vfloat<M> vt;
};
-
+
template<typename NativeCurve3fa>
+ struct DistanceCurveHit<NativeCurve3fa,1>
+ {
+ enum { M = 1 };
+
+ __forceinline DistanceCurveHit() {}
+
+ __forceinline DistanceCurveHit(const vbool<M>& valid, const vfloat<M>& U, const vfloat<M>& V, const vfloat<M>& T, const int i, const int N,
+ const NativeCurve3fa& curve3D)
+ : U(U), V(V), T(T), i(i), N(N), curve3D(curve3D), valid(valid) {}
+
+ __forceinline void finalize()
+ {
+ vu = (vfloat<M>(step)+U+vfloat<M>(float(i)))*(1.0f/float(N));
+ vv = V;
+ vt = T;
+ }
+
+ __forceinline Vec2f uv () const { return Vec2f(vu,vv); }
+ __forceinline float t () const { return vt; }
+ __forceinline Vec3fa Ng() const { return curve3D.eval_du(vu); }
+
+ public:
+ vfloat<M> U;
+ vfloat<M> V;
+ vfloat<M> T;
+ int i, N;
+ NativeCurve3fa curve3D;
+
+ public:
+ vbool<M> valid;
+ vfloat<M> vu;
+ vfloat<M> vv;
+ vfloat<M> vt;
+ };
+
+ template<typename NativeCurve3fa, int W = VSIZEX>
struct DistanceCurve1Intersector1
{
+ using vboolx = vbool<W>;
+ using vintx = vint<W>;
+ using vfloatx = vfloat<W>;
+ using Vec4vfx = Vec4vf<W>;
+
template<typename Epilog>
- __forceinline bool intersect(const CurvePrecalculations1& pre,Ray& ray,
- IntersectContext* context,
+ __forceinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
- const Vec3fa& v0, const Vec3fa& v1, const Vec3fa& v2, const Vec3fa& v3,
+ const Vec3ff& v0, const Vec3ff& v1, const Vec3ff& v2, const Vec3ff& v3,
const Epilog& epilog)
{
const int N = geom->tessellationRate;
@@ -65,8 +106,8 @@ namespace embree
/* evaluate the bezier curve */
vboolx valid = vfloatx(step) < vfloatx(float(N));
- const Vec4vfx p0 = curve2D.template eval0<VSIZEX>(0,N);
- const Vec4vfx p1 = curve2D.template eval1<VSIZEX>(0,N);
+ const Vec4vfx p0 = curve2D.template eval0<W>(0,N);
+ const Vec4vfx p1 = curve2D.template eval1<W>(0,N);
/* approximative intersection with cone */
const Vec4vfx v = p1-p0;
@@ -86,19 +127,19 @@ namespace embree
/* update hit information */
bool ishit = false;
if (unlikely(any(valid))) {
- DistanceCurveHit<NativeCurve3fa,VSIZEX> hit(valid,u,0.0f,t,0,N,curve3D);
+ DistanceCurveHit<NativeCurve3fa,W> hit(valid,u,0.0f,t,0,N,curve3D);
ishit = ishit | epilog(valid,hit);
}
- if (unlikely(VSIZEX < N))
+ if (unlikely(W < N))
{
/* process SIMD-size many segments per iteration */
- for (int i=VSIZEX; i<N; i+=VSIZEX)
+ for (int i=W; i<N; i+=W)
{
/* evaluate the bezier curve */
vboolx valid = vintx(i)+vintx(step) < vintx(N);
- const Vec4vfx p0 = curve2D.template eval0<VSIZEX>(i,N);
- const Vec4vfx p1 = curve2D.template eval1<VSIZEX>(i,N);
+ const Vec4vfx p0 = curve2D.template eval0<W>(i,N);
+ const Vec4vfx p1 = curve2D.template eval1<W>(i,N);
/* approximative intersection with cone */
const Vec4vfx v = p1-p0;
@@ -117,7 +158,7 @@ namespace embree
/* update hit information */
if (unlikely(any(valid))) {
- DistanceCurveHit<NativeCurve3fa,VSIZEX> hit(valid,u,0.0f,t,i,N,curve3D);
+ DistanceCurveHit<NativeCurve3fa,W> hit(valid,u,0.0f,t,i,N,curve3D);
ishit = ishit | epilog(valid,hit);
}
}
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector_oriented.h b/thirdparty/embree/kernels/geometry/curve_intersector_oriented.h
index 75532f5ae0..cdab06ea5e 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector_oriented.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector_oriented.h
@@ -14,7 +14,7 @@ namespace embree
{
namespace isa
{
- template<typename Ray, typename Epilog>
+ template<typename Ray, typename Epilog, int N = VSIZEX-1, int V = VSIZEX>
struct TensorLinearCubicBezierSurfaceIntersector
{
const LinearSpace3fa& ray_space;
@@ -235,7 +235,7 @@ namespace embree
if (!clip_v(cu,cv)) return;
return solve_newton_raphson(cu,cv);
}
-
+
__forceinline void solve_newton_raphson_recursion(BBox1f cu, BBox1f cv)
{
unsigned int sptr = 0;
@@ -259,8 +259,8 @@ namespace embree
if (mask) sptr++; // there are still items on the stack
/* process next element recurse into each hit curve segment */
- const float u0 = float(i+0)*(1.0f/(VSIZEX-1));
- const float u1 = float(i+1)*(1.0f/(VSIZEX-1));
+ const float u0 = float(i+0)*(1.0f/(N));
+ const float u1 = float(i+1)*(1.0f/(N));
const BBox1f cui(lerp(cu.lower,cu.upper,u0),lerp(cu.lower,cu.upper,u1));
cu = cui;
}
@@ -280,28 +280,37 @@ namespace embree
#endif
entry:
-
- /* split the curve into VSIZEX-1 segments in u-direction */
- vboolx valid = true;
- TensorLinearCubicBezierSurface<Vec2vfx> subcurves = curve2d.clip_v(cv).vsplit_u(valid,cu);
-
- /* slabs test in u-direction */
- Vec2vfx ndv = cross(subcurves.axis_v());
- BBox<vfloatx> boundsv = subcurves.vxfm(ndv).bounds();
- valid &= boundsv.lower <= eps;
- valid &= boundsv.upper >= -eps;
- if (none(valid)) continue;
-
- /* slabs test in v-direction */
- Vec2vfx ndu = cross(subcurves.axis_u());
- BBox<vfloatx> boundsu = subcurves.vxfm(ndu).bounds();
- valid &= boundsu.lower <= eps;
- valid &= boundsu.upper >= -eps;
- if (none(valid)) continue;
+
+ /* split the curve into N segments in u-direction */
+ unsigned int mask = 0;
+ for (int i=0; i<N;)
+ {
+ int i0 = i;
+ vbool<V> valid = true;
+ TensorLinearCubicBezierSurface<Vec2vf<V>> subcurves = curve2d.clip_v(cv).template vsplit_u<V>(valid,cu,i,N);
+
+ /* slabs test in u-direction */
+ Vec2vf<V> ndv = cross(subcurves.axis_v());
+ BBox<vfloat<V>> boundsv = subcurves.template vxfm<V>(ndv).bounds();
+ valid &= boundsv.lower <= eps;
+ valid &= boundsv.upper >= -eps;
+ if (none(valid)) continue;
+
+ /* slabs test in v-direction */
+ Vec2vf<V> ndu = cross(subcurves.axis_u());
+ BBox<vfloat<V>> boundsu = subcurves.template vxfm<V>(ndu).bounds();
+ valid &= boundsu.lower <= eps;
+ valid &= boundsu.upper >= -eps;
+ if (none(valid)) continue;
+
+ mask |= movemask(valid) << i0;
+ }
+
+ if (!mask) continue;
/* push valid segments to stack */
assert(sptr < stack_size);
- mask_stack [sptr] = movemask(valid);
+ mask_stack [sptr] = mask;
cu_stack [sptr] = cu;
cv_stack [sptr] = cv;
sptr++;
@@ -318,7 +327,7 @@ namespace embree
};
- template<template<typename Ty> class SourceCurve>
+ template<template<typename Ty> class SourceCurve, int N = VSIZEX-1, int V = VSIZEX>
struct OrientedCurve1Intersector1
{
//template<typename Ty> using Curve = SourceCurve<Ty>;
@@ -329,33 +338,32 @@ namespace embree
__forceinline OrientedCurve1Intersector1(const Ray& ray, const void* ptr) {}
- template<typename Epilog>
- __noinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
- IntersectContext* context,
+ template<typename Ray, typename Epilog>
+ __forceinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0i, const Vec3ff& v1i, const Vec3ff& v2i, const Vec3ff& v3i,
const Vec3fa& n0i, const Vec3fa& n1i, const Vec3fa& n2i, const Vec3fa& n3i,
const Epilog& epilog) const
{
STAT3(normal.trav_prims,1,1,1);
-
SourceCurve3ff ccurve(v0i,v1i,v2i,v3i);
SourceCurve3fa ncurve(n0i,n1i,n2i,n3i);
ccurve = enlargeRadiusToMinWidth(context,geom,ray.org,ccurve);
TensorLinearCubicBezierSurface3fa curve = TensorLinearCubicBezierSurface3fa::fromCenterAndNormalCurve(ccurve,ncurve);
//return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog>(pre.ray_space,ray,curve,epilog).solve_bezier_clipping();
- return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog>(pre.ray_space,ray,curve,epilog).solve_newton_raphson_main();
+ return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog,N,V>(pre.ray_space,ray,curve,epilog).solve_newton_raphson_main();
}
- template<typename Epilog>
- __noinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
- IntersectContext* context,
+ template<typename Ray, typename Epilog>
+ __forceinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const TensorLinearCubicBezierSurface3fa& curve, const Epilog& epilog) const
{
STAT3(normal.trav_prims,1,1,1);
//return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog>(pre.ray_space,ray,curve,epilog).solve_bezier_clipping();
- return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog>(pre.ray_space,ray,curve,epilog).solve_newton_raphson_main();
+ return TensorLinearCubicBezierSurfaceIntersector<Ray,Epilog,N,V>(pre.ray_space,ray,curve,epilog).solve_newton_raphson_main();
}
};
@@ -384,7 +392,7 @@ namespace embree
template<typename Epilog>
__forceinline bool intersect(const CurvePrecalculationsK<K>& pre, RayK<K>& vray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0i, const Vec3ff& v1i, const Vec3ff& v2i, const Vec3ff& v3i,
const Vec3fa& n0i, const Vec3fa& n1i, const Vec3fa& n2i, const Vec3fa& n3i,
@@ -402,7 +410,7 @@ namespace embree
template<typename Epilog>
__forceinline bool intersect(const CurvePrecalculationsK<K>& pre, RayK<K>& vray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const TensorLinearCubicBezierSurface3fa& curve,
const Epilog& epilog)
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector_ribbon.h b/thirdparty/embree/kernels/geometry/curve_intersector_ribbon.h
index c3272e99fd..423fd5b08d 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector_ribbon.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector_ribbon.h
@@ -53,21 +53,23 @@ namespace embree
};
/* calculate squared distance of point p0 to line p1->p2 */
- __forceinline std::pair<vfloatx,vfloatx> sqr_point_line_distance(const Vec2vfx& p0, const Vec2vfx& p1, const Vec2vfx& p2)
+ template<int M>
+ __forceinline std::pair<vfloat<M>,vfloat<M>> sqr_point_line_distance(const Vec2vf<M>& p0, const Vec2vf<M>& p1, const Vec2vf<M>& p2)
{
- const vfloatx num = det(p2-p1,p1-p0);
- const vfloatx den2 = dot(p2-p1,p2-p1);
+ const vfloat<M> num = det(p2-p1,p1-p0);
+ const vfloat<M> den2 = dot(p2-p1,p2-p1);
return std::make_pair(num*num,den2);
}
/* performs culling against a cylinder */
- __forceinline vboolx cylinder_culling_test(const Vec2vfx& p0, const Vec2vfx& p1, const Vec2vfx& p2, const vfloatx& r)
+ template<int M>
+ __forceinline vbool<M> cylinder_culling_test(const Vec2vf<M>& p0, const Vec2vf<M>& p1, const Vec2vf<M>& p2, const vfloat<M>& r)
{
- const std::pair<vfloatx,vfloatx> d = sqr_point_line_distance(p0,p1,p2);
+ const std::pair<vfloat<M>,vfloat<M>> d = sqr_point_line_distance<M>(p0,p1,p2);
return d.first <= r*r*d.second;
}
- template<typename NativeCurve3ff, typename Epilog>
+ template<int M = VSIZEX, typename NativeCurve3ff, typename Epilog>
__forceinline bool intersect_ribbon(const Vec3fa& ray_org, const Vec3fa& ray_dir, const float ray_tnear, const float& ray_tfar,
const LinearSpace3fa& ray_space, const float& depth_scale,
const NativeCurve3ff& curve3D, const int N,
@@ -76,89 +78,96 @@ namespace embree
/* transform control points into ray space */
const NativeCurve3ff curve2D = curve3D.xfm_pr(ray_space,ray_org);
float eps = 4.0f*float(ulp)*reduce_max(max(abs(curve2D.v0),abs(curve2D.v1),abs(curve2D.v2),abs(curve2D.v3)));
-
- /* evaluate the bezier curve */
+
+ int i=0;
bool ishit = false;
- vboolx valid = vfloatx(step) < vfloatx(float(N));
- const Vec4vfx p0 = curve2D.template eval0<VSIZEX>(0,N);
- const Vec4vfx p1 = curve2D.template eval1<VSIZEX>(0,N);
- valid &= cylinder_culling_test(zero,Vec2vfx(p0.x,p0.y),Vec2vfx(p1.x,p1.y),max(p0.w,p1.w));
- if (any(valid))
+#if !defined(__SYCL_DEVICE_ONLY__)
{
- Vec3vfx dp0dt = curve2D.template derivative0<VSIZEX>(0,N);
- Vec3vfx dp1dt = curve2D.template derivative1<VSIZEX>(0,N);
- dp0dt = select(reduce_max(abs(dp0dt)) < vfloatx(eps),Vec3vfx(p1-p0),dp0dt);
- dp1dt = select(reduce_max(abs(dp1dt)) < vfloatx(eps),Vec3vfx(p1-p0),dp1dt);
- const Vec3vfx n0(dp0dt.y,-dp0dt.x,0.0f);
- const Vec3vfx n1(dp1dt.y,-dp1dt.x,0.0f);
- const Vec3vfx nn0 = normalize(n0);
- const Vec3vfx nn1 = normalize(n1);
- const Vec3vfx lp0 = madd(p0.w,nn0,Vec3vfx(p0));
- const Vec3vfx lp1 = madd(p1.w,nn1,Vec3vfx(p1));
- const Vec3vfx up0 = nmadd(p0.w,nn0,Vec3vfx(p0));
- const Vec3vfx up1 = nmadd(p1.w,nn1,Vec3vfx(p1));
+ /* evaluate the bezier curve */
+ vbool<M> valid = vfloat<M>(step) < vfloat<M>(float(N));
+ const Vec4vf<M> p0 = curve2D.template eval0<M>(0,N);
+ const Vec4vf<M> p1 = curve2D.template eval1<M>(0,N);
+ valid &= cylinder_culling_test<M>(zero,Vec2vf<M>(p0.x,p0.y),Vec2vf<M>(p1.x,p1.y),max(p0.w,p1.w));
- vfloatx vu,vv,vt;
- vboolx valid0 = intersect_quad_backface_culling<VSIZEX>(valid,zero,Vec3fa(0,0,1),ray_tnear,ray_tfar,lp0,lp1,up1,up0,vu,vv,vt);
-
- if (any(valid0))
+ if (any(valid))
{
- /* ignore self intersections */
- if (EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR != 0.0f) {
- vfloatx r = lerp(p0.w, p1.w, vu);
- valid0 &= vt > float(EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR)*r*depth_scale;
- }
+ Vec3vf<M> dp0dt = curve2D.template derivative0<M>(0,N);
+ Vec3vf<M> dp1dt = curve2D.template derivative1<M>(0,N);
+ dp0dt = select(reduce_max(abs(dp0dt)) < vfloat<M>(eps),Vec3vf<M>(p1-p0),dp0dt);
+ dp1dt = select(reduce_max(abs(dp1dt)) < vfloat<M>(eps),Vec3vf<M>(p1-p0),dp1dt);
+ const Vec3vf<M> n0(dp0dt.y,-dp0dt.x,0.0f);
+ const Vec3vf<M> n1(dp1dt.y,-dp1dt.x,0.0f);
+ const Vec3vf<M> nn0 = normalize(n0);
+ const Vec3vf<M> nn1 = normalize(n1);
+ const Vec3vf<M> lp0 = madd(p0.w,nn0,Vec3vf<M>(p0));
+ const Vec3vf<M> lp1 = madd(p1.w,nn1,Vec3vf<M>(p1));
+ const Vec3vf<M> up0 = nmadd(p0.w,nn0,Vec3vf<M>(p0));
+ const Vec3vf<M> up1 = nmadd(p1.w,nn1,Vec3vf<M>(p1));
+
+ vfloat<M> vu,vv,vt;
+ vbool<M> valid0 = intersect_quad_backface_culling<M>(valid,zero,Vec3fa(0,0,1),ray_tnear,ray_tfar,lp0,lp1,up1,up0,vu,vv,vt);
if (any(valid0))
{
- vv = madd(2.0f,vv,vfloatx(-1.0f));
- RibbonHit<NativeCurve3ff,VSIZEX> bhit(valid0,vu,vv,vt,0,N,curve3D);
- ishit |= epilog(bhit.valid,bhit);
+ /* ignore self intersections */
+ if (EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR != 0.0f) {
+ vfloat<M> r = lerp(p0.w, p1.w, vu);
+ valid0 &= vt > float(EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR)*r*depth_scale;
+ }
+
+ if (any(valid0))
+ {
+ vv = madd(2.0f,vv,vfloat<M>(-1.0f));
+ RibbonHit<NativeCurve3ff,M> bhit(valid0,vu,vv,vt,0,N,curve3D);
+ ishit |= epilog(bhit.valid,bhit);
+ }
}
}
+ i += M;
}
- if (unlikely(VSIZEX < N))
+ if (unlikely(i < N))
+#endif
{
/* process SIMD-size many segments per iteration */
- for (int i=VSIZEX; i<N; i+=VSIZEX)
+ for (; i<N; i+=M)
{
/* evaluate the bezier curve */
- vboolx valid = vintx(i)+vintx(step) < vintx(N);
- const Vec4vfx p0 = curve2D.template eval0<VSIZEX>(i,N);
- const Vec4vfx p1 = curve2D.template eval1<VSIZEX>(i,N);
- valid &= cylinder_culling_test(zero,Vec2vfx(p0.x,p0.y),Vec2vfx(p1.x,p1.y),max(p0.w,p1.w));
+ vbool<M> valid = vint<M>(i)+vint<M>(step) < vint<M>(N);
+ const Vec4vf<M> p0 = curve2D.template eval0<M>(i,N);
+ const Vec4vf<M> p1 = curve2D.template eval1<M>(i,N);
+ valid &= cylinder_culling_test<M>(zero,Vec2vf<M>(p0.x,p0.y),Vec2vf<M>(p1.x,p1.y),max(p0.w,p1.w));
if (none(valid)) continue;
- Vec3vfx dp0dt = curve2D.template derivative0<VSIZEX>(i,N);
- Vec3vfx dp1dt = curve2D.template derivative1<VSIZEX>(i,N);
- dp0dt = select(reduce_max(abs(dp0dt)) < vfloatx(eps),Vec3vfx(p1-p0),dp0dt);
- dp1dt = select(reduce_max(abs(dp1dt)) < vfloatx(eps),Vec3vfx(p1-p0),dp1dt);
- const Vec3vfx n0(dp0dt.y,-dp0dt.x,0.0f);
- const Vec3vfx n1(dp1dt.y,-dp1dt.x,0.0f);
- const Vec3vfx nn0 = normalize(n0);
- const Vec3vfx nn1 = normalize(n1);
- const Vec3vfx lp0 = madd(p0.w,nn0,Vec3vfx(p0));
- const Vec3vfx lp1 = madd(p1.w,nn1,Vec3vfx(p1));
- const Vec3vfx up0 = nmadd(p0.w,nn0,Vec3vfx(p0));
- const Vec3vfx up1 = nmadd(p1.w,nn1,Vec3vfx(p1));
+ Vec3vf<M> dp0dt = curve2D.template derivative0<M>(i,N);
+ Vec3vf<M> dp1dt = curve2D.template derivative1<M>(i,N);
+ dp0dt = select(reduce_max(abs(dp0dt)) < vfloat<M>(eps),Vec3vf<M>(p1-p0),dp0dt);
+ dp1dt = select(reduce_max(abs(dp1dt)) < vfloat<M>(eps),Vec3vf<M>(p1-p0),dp1dt);
+ const Vec3vf<M> n0(dp0dt.y,-dp0dt.x,0.0f);
+ const Vec3vf<M> n1(dp1dt.y,-dp1dt.x,0.0f);
+ const Vec3vf<M> nn0 = normalize(n0);
+ const Vec3vf<M> nn1 = normalize(n1);
+ const Vec3vf<M> lp0 = madd(p0.w,nn0,Vec3vf<M>(p0));
+ const Vec3vf<M> lp1 = madd(p1.w,nn1,Vec3vf<M>(p1));
+ const Vec3vf<M> up0 = nmadd(p0.w,nn0,Vec3vf<M>(p0));
+ const Vec3vf<M> up1 = nmadd(p1.w,nn1,Vec3vf<M>(p1));
- vfloatx vu,vv,vt;
- vboolx valid0 = intersect_quad_backface_culling<VSIZEX>(valid,zero,Vec3fa(0,0,1),ray_tnear,ray_tfar,lp0,lp1,up1,up0,vu,vv,vt);
+ vfloat<M> vu,vv,vt;
+ vbool<M> valid0 = intersect_quad_backface_culling<M>(valid,zero,Vec3fa(0,0,1),ray_tnear,ray_tfar,lp0,lp1,up1,up0,vu,vv,vt);
if (any(valid0))
{
/* ignore self intersections */
if (EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR != 0.0f) {
- vfloatx r = lerp(p0.w, p1.w, vu);
+ vfloat<M> r = lerp(p0.w, p1.w, vu);
valid0 &= vt > float(EMBREE_CURVE_SELF_INTERSECTION_AVOIDANCE_FACTOR)*r*depth_scale;
}
if (any(valid0))
{
- vv = madd(2.0f,vv,vfloatx(-1.0f));
- RibbonHit<NativeCurve3ff,VSIZEX> bhit(valid0,vu,vv,vt,i,N,curve3D);
+ vv = madd(2.0f,vv,vfloat<M>(-1.0f));
+ RibbonHit<NativeCurve3ff,M> bhit(valid0,vu,vv,vt,i,N,curve3D);
ishit |= epilog(bhit.valid,bhit);
}
}
@@ -167,14 +176,14 @@ namespace embree
return ishit;
}
- template<template<typename Ty> class NativeCurve>
+ template<template<typename Ty> class NativeCurve, int M = VSIZEX>
struct RibbonCurve1Intersector1
{
typedef NativeCurve<Vec3ff> NativeCurve3ff;
- template<typename Epilog>
+ template<typename Ray, typename Epilog>
__forceinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0, const Vec3ff& v1, const Vec3ff& v2, const Vec3ff& v3,
const Epilog& epilog)
@@ -182,21 +191,21 @@ namespace embree
const int N = geom->tessellationRate;
NativeCurve3ff curve(v0,v1,v2,v3);
curve = enlargeRadiusToMinWidth(context,geom,ray.org,curve);
- return intersect_ribbon<NativeCurve3ff>(ray.org,ray.dir,ray.tnear(),ray.tfar,
+ return intersect_ribbon<M,NativeCurve3ff>(ray.org,ray.dir,ray.tnear(),ray.tfar,
pre.ray_space,pre.depth_scale,
curve,N,
epilog);
}
};
- template<template<typename Ty> class NativeCurve, int K>
+ template<template<typename Ty> class NativeCurve, int K, int M = VSIZEX>
struct RibbonCurve1IntersectorK
{
typedef NativeCurve<Vec3ff> NativeCurve3ff;
template<typename Epilog>
__forceinline bool intersect(const CurvePrecalculationsK<K>& pre, RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0, const Vec3ff& v1, const Vec3ff& v2, const Vec3ff& v3,
const Epilog& epilog)
@@ -206,7 +215,7 @@ namespace embree
const Vec3fa ray_dir(ray.dir.x[k],ray.dir.y[k],ray.dir.z[k]);
NativeCurve3ff curve(v0,v1,v2,v3);
curve = enlargeRadiusToMinWidth(context,geom,ray_org,curve);
- return intersect_ribbon<NativeCurve3ff>(ray_org,ray_dir,ray.tnear()[k],ray.tfar[k],
+ return intersect_ribbon<M,NativeCurve3ff>(ray_org,ray_dir,ray.tnear()[k],ray.tfar[k],
pre.ray_space[k],pre.depth_scale[k],
curve,N,
epilog);
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector_sweep.h b/thirdparty/embree/kernels/geometry/curve_intersector_sweep.h
index ed827d583f..5581822551 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector_sweep.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector_sweep.h
@@ -14,7 +14,9 @@ namespace embree
namespace isa
{
static const size_t numJacobianIterations = 5;
-#if defined(__AVX__)
+#if defined(EMBREE_SYCL_SUPPORT) && defined(__SYCL_DEVICE_ONLY__)
+ static const size_t numBezierSubdivisions = 2;
+#elif defined(__AVX__)
static const size_t numBezierSubdivisions = 2;
#else
static const size_t numBezierSubdivisions = 3;
@@ -132,10 +134,15 @@ namespace embree
return false;
}
+#if !defined(__SYCL_DEVICE_ONLY__)
+
template<typename NativeCurve3ff, typename Ray, typename Epilog>
- bool intersect_bezier_recursive_jacobian(const Ray& ray, const float dt, const NativeCurve3ff& curve,
- float u0, float u1, unsigned int depth, const Epilog& epilog)
+ __forceinline bool intersect_bezier_recursive_jacobian(const Ray& ray, const float dt, const NativeCurve3ff& curve, const Epilog& epilog)
{
+ float u0 = 0.0f;
+ float u1 = 1.0f;
+ unsigned int depth = 1;
+
#if defined(__AVX__)
enum { VSIZEX_ = 8 };
typedef vbool8 vboolx; // maximally 8-wide to work around KNL issues
@@ -147,8 +154,6 @@ namespace embree
typedef vint4 vintx;
typedef vfloat4 vfloatx;
#endif
- typedef Vec3<vfloatx> Vec3vfx;
- typedef Vec4<vfloatx> Vec4vfx;
unsigned int maxDepth = numBezierSubdivisions;
bool found = false;
@@ -295,14 +300,156 @@ namespace embree
return found;
}
+#else
+
+ template<typename NativeCurve3ff, typename Ray, typename Epilog>
+ __forceinline bool intersect_bezier_recursive_jacobian(const Ray& ray, const float dt, const NativeCurve3ff& curve, const Epilog& epilog)
+ {
+ const Vec3fa org = zero;
+ const Vec3fa dir = ray.dir;
+ const unsigned int max_depth = 7;
+
+ bool found = false;
+
+ struct ShortStack
+ {
+ /* pushes both children */
+ __forceinline void push() {
+ depth++;
+ }
+
+ /* pops next node */
+ __forceinline void pop() {
+ short_stack += (1<<(31-depth));
+ depth = 31-bsf(short_stack);
+ }
+
+ unsigned int depth = 0;
+ unsigned int short_stack = 0;
+ };
+
+ ShortStack stack;
+
+ do
+ {
+ const float u0 = (stack.short_stack+0*(1<<(31-stack.depth)))/float(0x80000000);
+ const float u1 = (stack.short_stack+1*(1<<(31-stack.depth)))/float(0x80000000);
+
+ /* subdivide bezier curve */
+ Vec3ff P0, dP0du; curve.eval(u0,P0,dP0du); dP0du = dP0du * (u1-u0);
+ Vec3ff P3, dP3du; curve.eval(u1,P3,dP3du); dP3du = dP3du * (u1-u0);
+ const Vec3ff P1 = P0 + dP0du*(1.0f/3.0f);
+ const Vec3ff P2 = P3 - dP3du*(1.0f/3.0f);
+
+ /* check if curve is well behaved, by checking deviation of tangents from straight line */
+ const Vec3ff W = Vec3ff(P3-P0,0.0f);
+ const Vec3ff dQ0 = abs(3.0f*(P1-P0) - W);
+ const Vec3ff dQ1 = abs(3.0f*(P2-P1) - W);
+ const Vec3ff dQ2 = abs(3.0f*(P3-P2) - W);
+ const Vec3ff max_dQ = max(dQ0,dQ1,dQ2);
+ const float m = max(max_dQ.x,max_dQ.y,max_dQ.z); //,max_dQ.w);
+ const float l = length(Vec3f(W));
+ const bool well_behaved = m < 0.2f*l;
+
+ if (!well_behaved && stack.depth < max_depth) {
+ stack.push();
+ continue;
+ }
+
+ /* calculate bounding cylinders */
+ const float rr1 = sqr_point_to_line_distance(Vec3f(dP0du),Vec3f(P3-P0));
+ const float rr2 = sqr_point_to_line_distance(Vec3f(dP3du),Vec3f(P3-P0));
+ const float maxr12 = sqrt(max(rr1,rr2));
+ const float one_plus_ulp = 1.0f+2.0f*float(ulp);
+ const float one_minus_ulp = 1.0f-2.0f*float(ulp);
+ float r_outer = max(P0.w,P1.w,P2.w,P3.w)+maxr12;
+ float r_inner = min(P0.w,P1.w,P2.w,P3.w)-maxr12;
+ r_outer = one_plus_ulp*r_outer;
+ r_inner = max(0.0f,one_minus_ulp*r_inner);
+ const Cylinder cylinder_outer(Vec3f(P0),Vec3f(P3),r_outer);
+ const Cylinder cylinder_inner(Vec3f(P0),Vec3f(P3),r_inner);
+
+ /* intersect with outer cylinder */
+ BBox<float> tc_outer; float u_outer0; Vec3fa Ng_outer0; float u_outer1; Vec3fa Ng_outer1;
+ if (!cylinder_outer.intersect(org,dir,tc_outer,u_outer0,Ng_outer0,u_outer1,Ng_outer1))
+ {
+ stack.pop();
+ continue;
+ }
+
+ /* intersect with cap-planes */
+ BBox<float> tp(ray.tnear()-dt,ray.tfar-dt);
+ tp = embree::intersect(tp,tc_outer);
+ BBox<float> h0 = HalfPlane(Vec3f(P0),+Vec3f(dP0du)).intersect(org,dir);
+ tp = embree::intersect(tp,h0);
+ BBox<float> h1 = HalfPlane(Vec3f(P3),-Vec3f(dP3du)).intersect(org,dir);
+ tp = embree::intersect(tp,h1);
+ if (tp.lower > tp.upper)
+ {
+ stack.pop();
+ continue;
+ }
+
+ bool valid = true;
+
+ /* clamp and correct u parameter */
+ u_outer0 = clamp(u_outer0,float(0.0f),float(1.0f));
+ u_outer1 = clamp(u_outer1,float(0.0f),float(1.0f));
+ u_outer0 = lerp(u0,u1,u_outer0);
+ u_outer1 = lerp(u0,u1,u_outer1);
+
+ /* intersect with inner cylinder */
+ BBox<float> tc_inner;
+ float u_inner0 = zero; Vec3fa Ng_inner0 = zero; float u_inner1 = zero; Vec3fa Ng_inner1 = zero;
+ const bool valid_inner = cylinder_inner.intersect(org,dir,tc_inner,u_inner0,Ng_inner0,u_inner1,Ng_inner1);
+
+ /* subtract the inner interval from the current hit interval */
+ BBox<float> tp0, tp1;
+ subtract(tp,tc_inner,tp0,tp1);
+ bool valid0 = valid & (tp0.lower <= tp0.upper);
+ bool valid1 = valid & (tp1.lower <= tp1.upper);
+ if (!(valid0 | valid1))
+ {
+ stack.pop();
+ continue;
+ }
+
+ /* at the unstable area we subdivide deeper */
+ const bool unstable0 = valid0 && ((!valid_inner) | (abs(dot(Vec3fa(ray.dir),Ng_inner0)) < 0.3f));
+ const bool unstable1 = valid1 && ((!valid_inner) | (abs(dot(Vec3fa(ray.dir),Ng_inner1)) < 0.3f));
+
+ if ((unstable0 | unstable1) && (stack.depth < max_depth)) {
+ stack.push();
+ continue;
+ }
+
+ if (valid0)
+ found |= intersect_bezier_iterative_jacobian(ray,dt,curve,u_outer0,tp0.lower,epilog);
+
+ /* the far hit cannot be closer, thus skip if we hit entry already */
+ valid1 &= tp1.lower+dt <= ray.tfar;
+
+ /* iterate over second hit */
+ if (valid1)
+ found |= intersect_bezier_iterative_jacobian(ray,dt,curve,u_outer1,tp1.upper,epilog);
+
+ stack.pop();
+
+ } while (stack.short_stack != 0x80000000);
+
+ return found;
+ }
+
+#endif
+
template<template<typename Ty> class NativeCurve>
struct SweepCurve1Intersector1
{
typedef NativeCurve<Vec3ff> NativeCurve3ff;
- template<typename Epilog>
- __noinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
- IntersectContext* context,
+ template<typename Ray, typename Epilog>
+ __forceinline bool intersect(const CurvePrecalculations1& pre, Ray& ray,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0, const Vec3ff& v1, const Vec3ff& v2, const Vec3ff& v3,
const Epilog& epilog)
@@ -315,7 +462,7 @@ namespace embree
const float dt = dot(curve0.center()-ray.org,ray.dir)*rcp(dot(ray.dir,ray.dir));
const Vec3ff ref(madd(Vec3fa(dt),ray.dir,ray.org),0.0f);
const NativeCurve3ff curve1 = curve0-ref;
- return intersect_bezier_recursive_jacobian(ray,dt,curve1,0.0f,1.0f,1,epilog);
+ return intersect_bezier_recursive_jacobian(ray,dt,curve1,epilog);
}
};
@@ -343,7 +490,7 @@ namespace embree
template<typename Epilog>
__forceinline bool intersect(const CurvePrecalculationsK<K>& pre, RayK<K>& vray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const CurveGeometry* geom, const unsigned int primID,
const Vec3ff& v0, const Vec3ff& v1, const Vec3ff& v2, const Vec3ff& v3,
const Epilog& epilog)
@@ -357,7 +504,7 @@ namespace embree
const float dt = dot(curve0.center()-ray.org,ray.dir)*rcp(dot(ray.dir,ray.dir));
const Vec3ff ref(madd(Vec3fa(dt),ray.dir,ray.org),0.0f);
const NativeCurve3ff curve1 = curve0-ref;
- return intersect_bezier_recursive_jacobian(ray,dt,curve1,0.0f,1.0f,1,epilog);
+ return intersect_bezier_recursive_jacobian(ray,dt,curve1,epilog);
}
};
}
diff --git a/thirdparty/embree/kernels/geometry/curve_intersector_virtual.h b/thirdparty/embree/kernels/geometry/curve_intersector_virtual.h
index cffa8e46ad..cbdcadac0c 100644
--- a/thirdparty/embree/kernels/geometry/curve_intersector_virtual.h
+++ b/thirdparty/embree/kernels/geometry/curve_intersector_virtual.h
@@ -5,7 +5,7 @@
#include "primitive.h"
#include "../subdiv/bezier_curve.h"
-#include "../common/primref.h"
+#include "../builders/primref.h"
#include "curve_intersector_precalculations.h"
#include "../bvh/node_intersector1.h"
#include "../bvh/node_intersector_packet.h"
@@ -37,28 +37,28 @@ namespace embree
{
struct VirtualCurveIntersector
{
- typedef void (*Intersect1Ty)(void* pre, void* ray, IntersectContext* context, const void* primitive);
- typedef bool (*Occluded1Ty )(void* pre, void* ray, IntersectContext* context, const void* primitive);
+ typedef void (*Intersect1Ty)(void* pre, void* ray, RayQueryContext* context, const void* primitive);
+ typedef bool (*Occluded1Ty )(void* pre, void* ray, RayQueryContext* context, const void* primitive);
- typedef void (*Intersect4Ty)(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
- typedef bool (*Occluded4Ty) (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
+ typedef void (*Intersect4Ty)(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
+ typedef bool (*Occluded4Ty) (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
- typedef void (*Intersect8Ty)(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
- typedef bool (*Occluded8Ty) (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
+ typedef void (*Intersect8Ty)(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
+ typedef bool (*Occluded8Ty) (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
- typedef void (*Intersect16Ty)(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
- typedef bool (*Occluded16Ty) (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
+ typedef void (*Intersect16Ty)(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
+ typedef bool (*Occluded16Ty) (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
public:
struct Intersectors
{
Intersectors() {} // WARNING: Do not zero initialize this, as we otherwise get problems with thread unsafe local static variable initialization (e.g. on VS2013) in curve_intersector_virtual.cpp.
- template<int K> void intersect(void* pre, void* ray, IntersectContext* context, const void* primitive);
- template<int K> bool occluded (void* pre, void* ray, IntersectContext* context, const void* primitive);
+ template<int K> void intersect(void* pre, void* ray, RayQueryContext* context, const void* primitive);
+ template<int K> bool occluded (void* pre, void* ray, RayQueryContext* context, const void* primitive);
- template<int K> void intersect(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
- template<int K> bool occluded (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive);
+ template<int K> void intersect(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
+ template<int K> bool occluded (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive);
public:
Intersect1Ty intersect1;
@@ -74,20 +74,20 @@ namespace embree
Intersectors vtbl[Geometry::GTY_END];
};
- template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<1> (void* pre, void* ray, IntersectContext* context, const void* primitive) { assert(intersect1); intersect1(pre,ray,context,primitive); }
- template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<1> (void* pre, void* ray, IntersectContext* context, const void* primitive) { assert(occluded1); return occluded1(pre,ray,context,primitive); }
+ template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<1> (void* pre, void* ray, RayQueryContext* context, const void* primitive) { assert(intersect1); intersect1(pre,ray,context,primitive); }
+ template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<1> (void* pre, void* ray, RayQueryContext* context, const void* primitive) { assert(occluded1); return occluded1(pre,ray,context,primitive); }
- template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<4>(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(intersect4); intersect4(pre,ray,k,context,primitive); }
- template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<4> (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(occluded4); return occluded4(pre,ray,k,context,primitive); }
+ template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<4>(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(intersect4); intersect4(pre,ray,k,context,primitive); }
+ template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<4> (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(occluded4); return occluded4(pre,ray,k,context,primitive); }
#if defined(__AVX__)
- template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<8>(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(intersect8); intersect8(pre,ray,k,context,primitive); }
- template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<8> (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(occluded8); return occluded8(pre,ray,k,context,primitive); }
+ template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<8>(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(intersect8); intersect8(pre,ray,k,context,primitive); }
+ template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<8> (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(occluded8); return occluded8(pre,ray,k,context,primitive); }
#endif
#if defined(__AVX512F__)
- template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<16>(void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(intersect16); intersect16(pre,ray,k,context,primitive); }
- template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<16> (void* pre, void* ray, size_t k, IntersectContext* context, const void* primitive) { assert(occluded16); return occluded16(pre,ray,k,context,primitive); }
+ template<> __forceinline void VirtualCurveIntersector::Intersectors::intersect<16>(void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(intersect16); intersect16(pre,ray,k,context,primitive); }
+ template<> __forceinline bool VirtualCurveIntersector::Intersectors::occluded<16> (void* pre, void* ray, size_t k, RayQueryContext* context, const void* primitive) { assert(occluded16); return occluded16(pre,ray,k,context,primitive); }
#endif
namespace isa
@@ -98,7 +98,7 @@ namespace embree
typedef CurvePrecalculations1 Precalculations;
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -108,7 +108,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -125,7 +125,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -136,7 +136,7 @@ namespace embree
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -153,7 +153,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
@@ -163,7 +163,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
assert(num == 1);
RTCGeometryType ty = (RTCGeometryType)(*prim);
diff --git a/thirdparty/embree/kernels/geometry/disc_intersector.h b/thirdparty/embree/kernels/geometry/disc_intersector.h
index ec6fa9c4f3..2997d36202 100644
--- a/thirdparty/embree/kernels/geometry/disc_intersector.h
+++ b/thirdparty/embree/kernels/geometry/disc_intersector.h
@@ -23,18 +23,24 @@ namespace embree
__forceinline void finalize() {}
- __forceinline Vec2f uv(const size_t i) const
- {
+ __forceinline Vec2f uv(const size_t i) const {
return Vec2f(vu[i], vv[i]);
}
- __forceinline float t(const size_t i) const
- {
+ __forceinline Vec2vf<M> uv() const {
+ return Vec2vf<M>(vu, vv);
+ }
+ __forceinline float t(const size_t i) const {
return vt[i];
}
- __forceinline Vec3fa Ng(const size_t i) const
- {
+ __forceinline vfloat<M> t() const {
+ return vt;
+ }
+ __forceinline Vec3fa Ng(const size_t i) const {
return Vec3fa(vNg.x[i], vNg.y[i], vNg.z[i]);
}
+ __forceinline Vec3vf<M> Ng() const {
+ return vNg;
+ }
public:
vfloat<M> vu;
@@ -43,16 +49,45 @@ namespace embree
Vec3vf<M> vNg;
};
+ template<>
+ struct DiscIntersectorHitM<1>
+ {
+ __forceinline DiscIntersectorHitM() {}
+
+ __forceinline DiscIntersectorHitM(const float& u, const float& v, const float& t, const Vec3fa& Ng)
+ : vu(u), vv(v), vt(t), vNg(Ng) {}
+
+ __forceinline void finalize() {}
+
+ __forceinline Vec2f uv() const {
+ return Vec2f(vu, vv);
+ }
+
+ __forceinline float t() const {
+ return vt;
+ }
+
+ __forceinline Vec3fa Ng() const {
+ return vNg;
+ }
+
+ public:
+ float vu;
+ float vv;
+ float vt;
+ Vec3fa vNg;
+ };
+
template<int M>
struct DiscIntersector1
{
typedef CurvePrecalculations1 Precalculations;
- template<typename Epilog>
+ template<typename Ray, typename Epilog>
static __forceinline bool intersect(
const vbool<M>& valid_i,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Points* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i,
@@ -97,10 +132,10 @@ namespace embree
return epilog(valid, hit);
}
- template<typename Epilog>
+ template<typename Ray, typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Points* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i,
@@ -145,7 +180,7 @@ namespace embree
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray,
size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const Points* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i,
@@ -194,7 +229,7 @@ namespace embree
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray,
size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const Points* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i,
diff --git a/thirdparty/embree/kernels/geometry/disci_intersector.h b/thirdparty/embree/kernels/geometry/disci_intersector.h
index bb9d396f6e..1ae4a66330 100644
--- a/thirdparty/embree/kernels/geometry/disci_intersector.h
+++ b/thirdparty/embree/kernels/geometry/disci_intersector.h
@@ -19,7 +19,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -32,7 +32,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -52,7 +52,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -65,7 +65,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -84,7 +84,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -96,7 +96,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -115,7 +115,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -127,7 +127,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -146,7 +146,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -160,7 +160,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -181,7 +181,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -195,7 +195,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -215,7 +215,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -228,7 +228,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -248,7 +248,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
@@ -261,7 +261,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& Disc)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& Disc)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(Disc.geomID());
diff --git a/thirdparty/embree/kernels/geometry/filter.h b/thirdparty/embree/kernels/geometry/filter.h
index d64320bf78..773c2bfeb8 100644
--- a/thirdparty/embree/kernels/geometry/filter.h
+++ b/thirdparty/embree/kernels/geometry/filter.h
@@ -12,20 +12,20 @@ namespace embree
{
namespace isa
{
- __forceinline bool runIntersectionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, IntersectContext* context)
+ __forceinline bool runIntersectionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
if (geometry->intersectionFilterN)
{
- assert(context->scene->hasGeometryFilterFunction());
geometry->intersectionFilterN(args);
if (args->valid[0] == 0)
return false;
}
-
- if (context->user->filter) {
- assert(context->scene->hasContextFilterFunction());
- context->user->filter(args);
+
+ if (context->getFilter())
+ {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ context->getFilter()(args);
if (args->valid[0] == 0)
return false;
@@ -35,7 +35,7 @@ namespace embree
return true;
}
- __forceinline bool runIntersectionFilter1(const Geometry* const geometry, RayHit& ray, IntersectContext* context, Hit& hit)
+ __forceinline bool runIntersectionFilter1(const Geometry* const geometry, RayHit& ray, RayQueryContext* context, Hit& hit)
{
RTCFilterFunctionNArguments args;
int mask = -1;
@@ -48,39 +48,29 @@ namespace embree
return runIntersectionFilter1Helper(&args,geometry,context);
}
- __forceinline void reportIntersection1(IntersectFunctionNArguments* args, const RTCFilterFunctionNArguments* filter_args)
- {
-#if defined(EMBREE_FILTER_FUNCTION)
- if (args->geometry->intersectionFilterN)
- args->geometry->intersectionFilterN(filter_args);
-
- if (args->context->filter)
- args->context->filter(filter_args);
-#endif
- }
-
- __forceinline bool runOcclusionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, IntersectContext* context)
+ __forceinline bool runOcclusionFilter1Helper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
if (geometry->occlusionFilterN)
{
- assert(context->scene->hasGeometryFilterFunction());
geometry->occlusionFilterN(args);
if (args->valid[0] == 0)
return false;
}
-
- if (context->user->filter) {
- assert(context->scene->hasContextFilterFunction());
- context->user->filter(args);
+
+ if (context->getFilter())
+ {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ context->getFilter()(args);
if (args->valid[0] == 0)
return false;
}
+
return true;
}
- __forceinline bool runOcclusionFilter1(const Geometry* const geometry, Ray& ray, IntersectContext* context, Hit& hit)
+ __forceinline bool runOcclusionFilter1(const Geometry* const geometry, Ray& ray, RayQueryContext* context, Hit& hit)
{
RTCFilterFunctionNArguments args;
int mask = -1;
@@ -93,33 +83,19 @@ namespace embree
return runOcclusionFilter1Helper(&args,geometry,context);
}
- __forceinline void reportOcclusion1(OccludedFunctionNArguments* args, const RTCFilterFunctionNArguments* filter_args)
- {
-#if defined(EMBREE_FILTER_FUNCTION)
- if (args->geometry->occlusionFilterN)
- args->geometry->occlusionFilterN(filter_args);
-
- if (args->context->filter)
- args->context->filter(filter_args);
-#endif
- }
-
template<int K>
- __forceinline vbool<K> runIntersectionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, IntersectContext* context)
+ __forceinline vbool<K> runIntersectionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
vint<K>* mask = (vint<K>*) args->valid;
if (geometry->intersectionFilterN)
- {
- assert(context->scene->hasGeometryFilterFunction());
geometry->intersectionFilterN(args);
- }
-
+
vbool<K> valid_o = *mask != vint<K>(zero);
if (none(valid_o)) return valid_o;
- if (context->user->filter) {
- assert(context->scene->hasContextFilterFunction());
- context->user->filter(args);
+ if (context->getFilter()) {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ context->getFilter()(args);
}
valid_o = *mask != vint<K>(zero);
@@ -130,7 +106,7 @@ namespace embree
}
template<int K>
- __forceinline vbool<K> runIntersectionFilter(const vbool<K>& valid, const Geometry* const geometry, RayHitK<K>& ray, IntersectContext* context, HitK<K>& hit)
+ __forceinline vbool<K> runIntersectionFilter(const vbool<K>& valid, const Geometry* const geometry, RayHitK<K>& ray, RayQueryContext* context, HitK<K>& hit)
{
RTCFilterFunctionNArguments args;
vint<K> mask = valid.mask32();
@@ -144,24 +120,19 @@ namespace embree
}
template<int K>
- __forceinline vbool<K> runOcclusionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, IntersectContext* context)
+ __forceinline vbool<K> runOcclusionFilterHelper(RTCFilterFunctionNArguments* args, const Geometry* const geometry, RayQueryContext* context)
{
vint<K>* mask = (vint<K>*) args->valid;
if (geometry->occlusionFilterN)
- {
- assert(context->scene->hasGeometryFilterFunction());
geometry->occlusionFilterN(args);
- }
-
- vbool<K> valid_o = *mask != vint<K>(zero);
+ vbool<K> valid_o = *mask != vint<K>(zero);
if (none(valid_o)) return valid_o;
- if (context->user->filter) {
- assert(context->scene->hasContextFilterFunction());
- context->user->filter(args);
+ if (context->getFilter()) {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ context->getFilter()(args);
}
-
valid_o = *mask != vint<K>(zero);
RayK<K>* ray = (RayK<K>*) args->ray;
@@ -170,7 +141,7 @@ namespace embree
}
template<int K>
- __forceinline vbool<K> runOcclusionFilter(const vbool<K>& valid, const Geometry* const geometry, RayK<K>& ray, IntersectContext* context, HitK<K>& hit)
+ __forceinline vbool<K> runOcclusionFilter(const vbool<K>& valid, const Geometry* const geometry, RayK<K>& ray, RayQueryContext* context, HitK<K>& hit)
{
RTCFilterFunctionNArguments args;
vint<K> mask = valid.mask32();
diff --git a/thirdparty/embree/kernels/geometry/filter_sycl.h b/thirdparty/embree/kernels/geometry/filter_sycl.h
new file mode 100644
index 0000000000..00f333134b
--- /dev/null
+++ b/thirdparty/embree/kernels/geometry/filter_sycl.h
@@ -0,0 +1,109 @@
+// Copyright 2009-2021 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "../common/geometry.h"
+#include "../common/ray.h"
+#include "../common/hit.h"
+#include "../common/context.h"
+
+namespace embree
+{
+ __forceinline bool runIntersectionFilter1Helper(RTCFilterFunctionNArguments* args, int& mask, const Geometry* const geometry, RayQueryContext* context)
+ {
+ typedef void (*RTCFilterFunctionSYCL)(const void* args);
+ const RTCFeatureFlags feature_mask MAYBE_UNUSED = context->args->feature_mask;
+
+#if EMBREE_SYCL_GEOMETRY_CALLBACK
+ if (feature_mask & RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_GEOMETRY)
+ {
+ RTCFilterFunctionSYCL gfilter = (RTCFilterFunctionSYCL) geometry->intersectionFilterN;
+ if (gfilter)
+ {
+ gfilter(args);
+
+ if (mask == 0)
+ return false;
+ }
+ }
+#endif
+
+ if (feature_mask & RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS)
+ {
+ RTCFilterFunctionSYCL cfilter = (RTCFilterFunctionSYCL) context->args->filter;
+ if (cfilter)
+ {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ cfilter(args);
+
+ if (mask == 0)
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ __forceinline bool runOcclusionFilter1Helper(RTCFilterFunctionNArguments* args, int& mask, const Geometry* const geometry, RayQueryContext* context)
+ {
+ typedef void (*RTCFilterFunctionSYCL)(const void* args);
+ const RTCFeatureFlags feature_mask MAYBE_UNUSED = context->args->feature_mask;
+
+#if EMBREE_SYCL_GEOMETRY_CALLBACK
+ if (feature_mask & RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_GEOMETRY)
+ {
+ RTCFilterFunctionSYCL gfilter = (RTCFilterFunctionSYCL) geometry->occlusionFilterN;
+ if (gfilter)
+ {
+ gfilter(args);
+
+ if (mask == 0)
+ return false;
+ }
+ }
+#endif
+
+ if (feature_mask & RTC_FEATURE_FLAG_FILTER_FUNCTION_IN_ARGUMENTS)
+ {
+ RTCFilterFunctionSYCL cfilter = (RTCFilterFunctionSYCL) context->args->filter;
+ if (cfilter)
+ {
+ if (context->enforceArgumentFilterFunction() || geometry->hasArgumentFilterFunctions())
+ cfilter(args);
+
+ if (mask == 0)
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ __forceinline bool runIntersectionFilter1SYCL(Geometry* geometry, RayHit& ray, sycl::private_ptr<RayQueryContext> context, Hit& hit)
+ {
+ RTCFilterFunctionNArguments args;
+ int mask = -1;
+ args.valid = &mask;
+ args.geometryUserPtr = geometry->userPtr;
+ args.context = context->user;
+ args.ray = (RTCRayN*) &ray;
+ args.hit = (RTCHitN*) &hit;
+ args.N = 1;
+ return runIntersectionFilter1Helper(&args,mask,geometry,context);
+ }
+
+
+ __forceinline bool runIntersectionFilter1SYCL(Geometry* geometry, Ray& ray, sycl::private_ptr<RayQueryContext> context, Hit& hit)
+ {
+ RTCFilterFunctionNArguments args;
+ int mask = -1;
+ args.valid = &mask;
+ args.geometryUserPtr = geometry->userPtr;
+ args.context = context->user;
+ args.ray = (RTCRayN*) &ray;
+ args.hit = (RTCHitN*) &hit;
+ args.N = 1;
+ return runOcclusionFilter1Helper(&args,mask,geometry,context);
+ }
+}
diff --git a/thirdparty/embree/kernels/geometry/grid_intersector.h b/thirdparty/embree/kernels/geometry/grid_intersector.h
index 9c59cef119..9837205445 100644
--- a/thirdparty/embree/kernels/geometry/grid_intersector.h
+++ b/thirdparty/embree/kernels/geometry/grid_intersector.h
@@ -35,20 +35,20 @@ namespace embree
typedef Grid1Precalculations<GridSOAIntersector1::Precalculations> Precalculations;
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersector1::intersect(pre,ray,context,prim,lazy_node);
}
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
intersect(pre,ray,context,prim,ty,lazy_node);
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersector1::occluded(pre,ray,context,prim,lazy_node);
}
- static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
+ static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, size_t& lazy_node) {
return occluded(pre,ray,context,prim,ty,lazy_node);
}
@@ -70,22 +70,22 @@ namespace embree
typedef SubdivPatch1PrecalculationsK<K,typename GridSOAIntersectorK<K>::Precalculations> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, size_t& lazy_node)
{
GridSOAIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
}
diff --git a/thirdparty/embree/kernels/geometry/grid_soa_intersector1.h b/thirdparty/embree/kernels/geometry/grid_soa_intersector1.h
index 8fbf0d4bdf..6d56bd0404 100644
--- a/thirdparty/embree/kernels/geometry/grid_soa_intersector1.h
+++ b/thirdparty/embree/kernels/geometry/grid_soa_intersector1.h
@@ -30,7 +30,7 @@ namespace embree
template<typename Loader>
static __forceinline void intersect(RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -50,7 +50,7 @@ namespace embree
template<typename Loader>
static __forceinline bool occluded(Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -71,7 +71,7 @@ namespace embree
}
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
@@ -87,7 +87,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
@@ -112,7 +112,7 @@ namespace embree
template<typename Loader>
static __forceinline void intersect(RayHit& ray, const float ftime,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -142,7 +142,7 @@ namespace embree
template<typename Loader>
static __forceinline bool occluded(Ray& ray, const float ftime,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -171,7 +171,7 @@ namespace embree
}
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
@@ -187,7 +187,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline bool occluded(Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
diff --git a/thirdparty/embree/kernels/geometry/grid_soa_intersector_packet.h b/thirdparty/embree/kernels/geometry/grid_soa_intersector_packet.h
index 14cacab5fe..5e5a24b7dd 100644
--- a/thirdparty/embree/kernels/geometry/grid_soa_intersector_packet.h
+++ b/thirdparty/embree/kernels/geometry/grid_soa_intersector_packet.h
@@ -79,7 +79,7 @@ namespace embree
};
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t dim_offset = pre.grid->dim_offset;
const size_t line_offset = pre.grid->width;
@@ -110,7 +110,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t dim_offset = pre.grid->dim_offset;
const size_t line_offset = pre.grid->width;
@@ -146,7 +146,7 @@ namespace embree
template<typename Loader>
static __forceinline void intersect(RayHitK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -163,7 +163,7 @@ namespace embree
template<typename Loader>
static __forceinline bool occluded(RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -179,7 +179,7 @@ namespace embree
}
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
@@ -194,7 +194,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t line_offset = pre.grid->width;
const size_t lines = pre.grid->height;
@@ -219,7 +219,7 @@ namespace embree
typedef typename GridSOAIntersectorK<K>::Precalculations Precalculations;
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
vfloat<K> vftime;
vint<K> vitime = getTimeSegment<K>(ray.time(), vfloat<K>((float)(pre.grid->time_steps-1)), vftime);
@@ -235,7 +235,7 @@ namespace embree
}
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, const vfloat<K>& ftime, int itime, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, const vfloat<K>& ftime, int itime, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t grid_offset = pre.grid->gridBytes >> 2;
const size_t dim_offset = pre.grid->dim_offset;
@@ -279,7 +279,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
vfloat<K> vftime;
vint<K> vitime = getTimeSegment<K>(ray.time(), vfloat<K>((float)(pre.grid->time_steps-1)), vftime);
@@ -297,7 +297,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, const vfloat<K>& ftime, int itime, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, const vfloat<K>& ftime, int itime, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
const size_t grid_offset = pre.grid->gridBytes >> 2;
const size_t dim_offset = pre.grid->dim_offset;
@@ -347,7 +347,7 @@ namespace embree
template<typename Loader>
static __forceinline void intersect(RayHitK<K>& ray, size_t k,
const float ftime,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -376,7 +376,7 @@ namespace embree
template<typename Loader>
static __forceinline bool occluded(RayK<K>& ray, size_t k,
const float ftime,
- IntersectContext* context,
+ RayQueryContext* context,
const float* const grid_x,
const size_t line_offset,
const size_t lines,
@@ -403,7 +403,7 @@ namespace embree
}
/*! Intersect a ray with the primitive. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
float ftime;
int itime = getTimeSegment(ray.time()[k], float(pre.grid->time_steps-1), ftime);
@@ -422,7 +422,7 @@ namespace embree
}
/*! Test if the ray is occluded by the primitive */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
float ftime;
int itime = getTimeSegment(ray.time()[k], float(pre.grid->time_steps-1), ftime);
diff --git a/thirdparty/embree/kernels/geometry/instance_array.h b/thirdparty/embree/kernels/geometry/instance_array.h
new file mode 100644
index 0000000000..fdbe79b3a8
--- /dev/null
+++ b/thirdparty/embree/kernels/geometry/instance_array.h
@@ -0,0 +1,85 @@
+// Copyright 2009-2021 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "primitive.h"
+#include "../common/scene_instance_array.h"
+
+namespace embree
+{
+ //template<int M>
+ struct InstanceArrayPrimitive
+ {
+ struct Type : public PrimitiveType
+ {
+ const char* name() const;
+ size_t sizeActive(const char* This) const;
+ size_t sizeTotal(const char* This) const;
+ size_t getBytes(const char* This) const;
+ };
+ static Type type;
+
+ public:
+
+ /* primitive supports multiple time segments */
+ static const bool singleTimeSegment = false;
+
+ /* Returns maximum number of stored primitives */
+ static __forceinline size_t max_size() { return 1; }
+
+ /* Returns required number of primitive blocks for N primitives */
+ static __forceinline size_t blocks(size_t N) { return N; }
+
+ public:
+
+ InstanceArrayPrimitive (const uint32_t geomID, const uint32_t primID)
+ : primID_(primID)
+ , instID_(geomID)
+ {}
+
+ __forceinline bool valid() const {
+ return primID_ != -1;
+ }
+
+ void fill(const PrimRef* prims, size_t& i, size_t end, Scene* scene)
+ {
+ assert(end-i == 1);
+ const PrimRef& prim = prims[i]; i++;
+ const unsigned int geomID = prim.geomID();
+ const unsigned int primID = prim.primID();
+ new (this) InstanceArrayPrimitive(geomID, primID);
+ }
+
+ __forceinline LBBox3fa fillMB(const PrimRef* prims, size_t& i, size_t end, Scene* scene, size_t itime)
+ {
+ assert(end-i == 1);
+ const PrimRef& prim = prims[i]; i++;
+ const unsigned int geomID = prim.geomID();
+ const size_t primID = prim.primID();
+ new (this) InstanceArrayPrimitive(geomID, primID);
+ const InstanceArray* instanceArray = scene->get<InstanceArray>(geomID);
+ return instanceArray->linearBounds(primID,itime);
+ }
+
+ __forceinline LBBox3fa fillMB(const PrimRefMB* prims, size_t& i, size_t end, Scene* scene, const BBox1f time_range)
+ {
+ assert(end-i == 1);
+ const PrimRefMB& prim = prims[i]; i++;
+ const unsigned int geomID = prim.geomID();
+ const size_t primID = prim.primID();
+ new (this) InstanceArrayPrimitive(geomID, primID);
+ const InstanceArray* instanceArray = scene->get<InstanceArray>(geomID);
+ return instanceArray->linearBounds(primID,time_range);
+ }
+
+ /* Updates the primitive */
+ __forceinline BBox3fa update(InstanceArray* instanceArray) {
+ return instanceArray->bounds(0);
+ }
+
+ public:
+ unsigned int primID_;
+ unsigned int instID_;
+ };
+}
diff --git a/thirdparty/embree/kernels/geometry/instance_array_intersector.h b/thirdparty/embree/kernels/geometry/instance_array_intersector.h
new file mode 100644
index 0000000000..c32c8b4cde
--- /dev/null
+++ b/thirdparty/embree/kernels/geometry/instance_array_intersector.h
@@ -0,0 +1,85 @@
+// Copyright 2009-2021 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "instance_array.h"
+#include "../common/ray.h"
+#include "../common/point_query.h"
+#include "../common/scene.h"
+
+namespace embree
+{
+ namespace isa
+ {
+ struct InstanceArrayIntersector1
+ {
+ typedef InstanceArrayPrimitive Primitive;
+
+ struct Precalculations {
+ __forceinline Precalculations (const Ray& ray, const void *ptr) {}
+ };
+
+ static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
+ static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
+ static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
+ };
+
+ struct InstanceArrayIntersector1MB
+ {
+ typedef InstanceArrayPrimitive Primitive;
+
+ struct Precalculations {
+ __forceinline Precalculations (const Ray& ray, const void *ptr) {}
+ };
+
+ static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
+ static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
+ static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
+ };
+
+ template<int K>
+ struct InstanceArrayIntersectorK
+ {
+ typedef InstanceArrayPrimitive Primitive;
+
+ struct Precalculations {
+ __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
+ };
+
+ static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
+ static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
+
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
+ intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
+ }
+
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
+ occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
+ return ray.tfar[k] < 0.0f;
+ }
+ };
+
+ template<int K>
+ struct InstanceArrayIntersectorKMB
+ {
+ typedef InstanceArrayPrimitive Primitive;
+
+ struct Precalculations {
+ __forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
+ };
+
+ static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
+ static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
+
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
+ intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
+ }
+
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
+ occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
+ return ray.tfar[k] < 0.0f;
+ }
+ };
+ }
+}
diff --git a/thirdparty/embree/kernels/geometry/instance_intersector.h b/thirdparty/embree/kernels/geometry/instance_intersector.h
index 28a7b728e5..45c3d36c2d 100644
--- a/thirdparty/embree/kernels/geometry/instance_intersector.h
+++ b/thirdparty/embree/kernels/geometry/instance_intersector.h
@@ -19,8 +19,8 @@ namespace embree
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
};
- static void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim);
- static bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim);
+ static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
+ static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
};
@@ -32,8 +32,8 @@ namespace embree
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
};
- static void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim);
- static bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim);
+ static void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim);
+ static bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim);
static bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim);
};
@@ -46,14 +46,14 @@ namespace embree
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
};
- static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& prim);
- static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& prim);
+ static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
+ static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
return ray.tfar[k] < 0.0f;
}
@@ -68,14 +68,14 @@ namespace embree
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
};
- static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& prim);
- static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& prim);
+ static void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim);
+ static vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim);
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
return ray.tfar[k] < 0.0f;
}
diff --git a/thirdparty/embree/kernels/geometry/intersector_epilog.h b/thirdparty/embree/kernels/geometry/intersector_epilog.h
index 7bf134cc54..af85b0e57d 100644
--- a/thirdparty/embree/kernels/geometry/intersector_epilog.h
+++ b/thirdparty/embree/kernels/geometry/intersector_epilog.h
@@ -21,12 +21,12 @@ namespace embree
struct Intersect1Epilog1
{
RayHit& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Intersect1Epilog1(RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -64,6 +64,9 @@ namespace embree
ray.primID = primID;
ray.geomID = geomID;
instance_id_stack::copy_UU(context->user->instID, ray.instID);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UU(context->user->instPrimID, ray.instPrimID);
+#endif
return true;
}
};
@@ -72,12 +75,12 @@ namespace embree
struct Occluded1Epilog1
{
Ray& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Occluded1Epilog1(Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -117,12 +120,12 @@ namespace embree
{
RayHitK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Intersect1KEpilog1(RayHitK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), k(k), context(context), geomID(geomID), primID(primID) {}
@@ -163,6 +166,9 @@ namespace embree
ray.primID[k] = primID;
ray.geomID[k] = geomID;
instance_id_stack::copy_UV<K>(context->user->instID, ray.instID, k);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UV<K>(context->user->instPrimID, ray.instPrimID, k);
+#endif
return true;
}
};
@@ -172,12 +178,12 @@ namespace embree
{
RayK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Occluded1KEpilog1(RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), k(k), context(context), geomID(geomID), primID(primID) {}
@@ -215,12 +221,12 @@ namespace embree
struct Intersect1EpilogM
{
RayHit& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
__forceinline Intersect1EpilogM(RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs)
: ray(ray), context(context), geomIDs(geomIDs), primIDs(primIDs) {}
@@ -287,6 +293,9 @@ namespace embree
ray.primID = primIDs[i];
ray.geomID = geomID;
instance_id_stack::copy_UU(context->user->instID, ray.instID);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UU(context->user->instPrimID, ray.instPrimID);
+#endif
return true;
}
@@ -296,12 +305,12 @@ namespace embree
struct Occluded1EpilogM
{
Ray& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
__forceinline Occluded1EpilogM(Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs)
: ray(ray), context(context), geomIDs(geomIDs), primIDs(primIDs) {}
@@ -363,12 +372,12 @@ namespace embree
struct Intersect1EpilogMU
{
RayHit& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Intersect1EpilogMU(RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -424,6 +433,9 @@ namespace embree
ray.primID = primID;
ray.geomID = geomID;
instance_id_stack::copy_UU(context->user->instID, ray.instID);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UU(context->user->instPrimID, ray.instPrimID);
+#endif
return true;
}
};
@@ -432,12 +444,12 @@ namespace embree
struct Occluded1EpilogMU
{
Ray& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Occluded1EpilogMU(Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -477,13 +489,13 @@ namespace embree
struct IntersectKEpilogM
{
RayHitK<K>& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
const size_t i;
__forceinline IntersectKEpilogM(RayHitK<K>& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs,
size_t i)
@@ -534,6 +546,9 @@ namespace embree
vuint<K>::store(valid,&ray.primID,primID);
vuint<K>::store(valid,&ray.geomID,geomID);
instance_id_stack::copy_UV<K>(context->user->instID, ray.instID, valid);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UV<K>(context->user->instPrimID, ray.instPrimID, valid);
+#endif
return valid;
}
};
@@ -543,14 +558,14 @@ namespace embree
{
vbool<K>& valid0;
RayK<K>& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
const size_t i;
__forceinline OccludedKEpilogM(vbool<K>& valid0,
RayK<K>& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs,
size_t i)
@@ -598,12 +613,12 @@ namespace embree
struct IntersectKEpilogMU
{
RayHitK<K>& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline IntersectKEpilogMU(RayHitK<K>& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -649,6 +664,9 @@ namespace embree
vuint<K>::store(valid,&ray.primID,primID);
vuint<K>::store(valid,&ray.geomID,geomID);
instance_id_stack::copy_UV<K>(context->user->instID, ray.instID, valid);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UV<K>(context->user->instPrimID, ray.instPrimID, valid);
+#endif
return valid;
}
};
@@ -658,13 +676,13 @@ namespace embree
{
vbool<K>& valid0;
RayK<K>& ray;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline OccludedKEpilogMU(vbool<K>& valid0,
RayK<K>& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: valid0(valid0), ray(ray), context(context), geomID(geomID), primID(primID) {}
@@ -709,12 +727,12 @@ namespace embree
{
RayHitK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
__forceinline Intersect1KEpilogM(RayHitK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs)
: ray(ray), k(k), context(context), geomIDs(geomIDs), primIDs(primIDs) {}
@@ -783,6 +801,9 @@ namespace embree
ray.primID[k] = primIDs[i];
ray.geomID[k] = geomID;
instance_id_stack::copy_UV<K>(context->user->instID, ray.instID, k);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UV<K>(context->user->instPrimID, ray.instPrimID, k);
+#endif
return true;
}
};
@@ -792,12 +813,12 @@ namespace embree
{
RayK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const vuint<M>& geomIDs;
const vuint<M>& primIDs;
__forceinline Occluded1KEpilogM(RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const vuint<M>& geomIDs,
const vuint<M>& primIDs)
: ray(ray), k(k), context(context), geomIDs(geomIDs), primIDs(primIDs) {}
@@ -860,12 +881,12 @@ namespace embree
{
RayHitK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Intersect1KEpilogMU(RayHitK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), k(k), context(context), geomID(geomID), primID(primID) {}
@@ -923,6 +944,9 @@ namespace embree
ray.primID[k] = primID;
ray.geomID[k] = geomID;
instance_id_stack::copy_UV<K>(context->user->instID, ray.instID, k);
+#if defined(RTC_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UV<K>(context->user->instPrimID, ray.instPrimID, k);
+#endif
return true;
}
};
@@ -932,12 +956,12 @@ namespace embree
{
RayK<K>& ray;
size_t k;
- IntersectContext* context;
+ RayQueryContext* context;
const unsigned int geomID;
const unsigned int primID;
__forceinline Occluded1KEpilogMU(RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const unsigned int geomID,
const unsigned int primID)
: ray(ray), k(k), context(context), geomID(geomID), primID(primID) {}
diff --git a/thirdparty/embree/kernels/geometry/intersector_epilog_sycl.h b/thirdparty/embree/kernels/geometry/intersector_epilog_sycl.h
new file mode 100644
index 0000000000..9565006738
--- /dev/null
+++ b/thirdparty/embree/kernels/geometry/intersector_epilog_sycl.h
@@ -0,0 +1,207 @@
+// Copyright 2009-2021 Intel Corporation
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "../common/ray.h"
+#include "../common/context.h"
+#include "filter_sycl.h"
+
+namespace embree
+{
+ template<typename Ray>
+ struct Intersect1Epilog1_HWIF;
+
+ template<>
+ struct Intersect1Epilog1_HWIF<RayHit>
+ {
+ RayHit& ray;
+ sycl::private_ptr<RayQueryContext> context;
+ const unsigned int geomID;
+ const unsigned int primID;
+ const bool filter;
+
+ __forceinline Intersect1Epilog1_HWIF(RayHit& ray,
+ sycl::private_ptr<RayQueryContext> context,
+ const unsigned int geomID,
+ const unsigned int primID,
+ const bool filter)
+ : ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}
+
+ template<typename Hit_i>
+ __forceinline bool operator() (Hit_i& hit_i) const
+ {
+ hit_i.finalize();
+
+ Scene* scene MAYBE_UNUSED = context->scene;
+ Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
+
+ /* ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((geometry->mask & ray.mask) == 0)
+ return false;
+#endif
+
+ /* call intersection filter function */
+#if defined(EMBREE_FILTER_FUNCTION)
+ if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))
+ {
+ Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);
+ float old_t = ray.tfar;
+ ray.tfar = hit_i.t;
+ bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
+ if (!found) {
+ ray.tfar = old_t;
+ return false;
+ }
+ }
+#endif
+
+ ray.tfar = hit_i.t;
+ ray.u = hit_i.u;
+ ray.v = hit_i.v;
+ ray.Ng.x = hit_i.Ng.x;
+ ray.Ng.y = hit_i.Ng.y;
+ ray.Ng.z = hit_i.Ng.z;
+ ray.geomID = geomID;
+ ray.primID = primID;
+ instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);
+#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);
+#endif
+ return true;
+ }
+
+ template<typename Hit_i>
+ __forceinline bool operator() (bool, Hit_i& hit_i) const
+ {
+ hit_i.finalize();
+
+ Scene* scene MAYBE_UNUSED = context->scene;
+ Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
+
+ /* ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((geometry->mask & ray.mask) == 0)
+ return false;
+#endif
+
+ const Vec3fa Ng = hit_i.Ng();
+ const Vec2f uv = hit_i.uv();
+
+ /* call intersection filter function */
+#if defined(EMBREE_FILTER_FUNCTION)
+ if (filter && (unlikely(context->hasContextFilter() || geometry->hasIntersectionFilter())))
+ {
+ Hit h(context->user,geomID,primID,uv,Ng);
+ float old_t = ray.tfar;
+ ray.tfar = hit_i.t();
+ bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
+ if (!found) {
+ ray.tfar = old_t;
+ return false;
+ }
+ }
+#endif
+
+ ray.tfar = hit_i.t();
+ ray.u = uv.x;
+ ray.v = uv.y;
+ ray.Ng.x = Ng.x;
+ ray.Ng.y = Ng.y;
+ ray.Ng.z = Ng.z;
+ ray.geomID = geomID;
+ ray.primID = primID;
+ instance_id_stack::copy_UU(context->user, context->user->instID, ray.instID);
+#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
+ instance_id_stack::copy_UU(context->user, context->user->instPrimID, ray.instPrimID);
+#endif
+ return true;
+ }
+ };
+
+ template<>
+ struct Intersect1Epilog1_HWIF<Ray>
+ {
+ Ray& ray;
+ sycl::private_ptr<RayQueryContext> context;
+ const unsigned int geomID;
+ const unsigned int primID;
+ const bool filter;
+
+ __forceinline Intersect1Epilog1_HWIF(Ray& ray,
+ sycl::private_ptr<RayQueryContext> context,
+ const unsigned int geomID,
+ const unsigned int primID,
+ const bool filter)
+ : ray(ray), context(context), geomID(geomID), primID(primID), filter(filter) {}
+
+ template<typename Hit_i>
+ __forceinline bool operator() (Hit_i& hit_i) const
+ {
+ hit_i.finalize();
+
+ Scene* scene MAYBE_UNUSED = context->scene;
+ Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
+
+ /* ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((geometry->mask & ray.mask) == 0)
+ return false;
+#endif
+
+ /* call intersection filter function */
+#if defined(EMBREE_FILTER_FUNCTION)
+ if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))
+ {
+ Hit h(context->user,geomID,primID,Vec2f(hit_i.u,hit_i.v),hit_i.Ng);
+ float old_t = ray.tfar;
+ ray.tfar = hit_i.t;
+ bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
+ if (!found) {
+ ray.tfar = old_t;
+ return false;
+ }
+ }
+#endif
+
+ ray.tfar = neg_inf;
+ return true;
+ }
+
+ template<typename Hit_i>
+ __forceinline bool operator() (bool, Hit_i& hit_i) const
+ {
+ hit_i.finalize();
+
+ Scene* scene MAYBE_UNUSED = context->scene;
+ Geometry* geometry MAYBE_UNUSED = scene->get(geomID);
+
+ /* ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((geometry->mask & ray.mask) == 0)
+ return false;
+#endif
+
+ /* call intersection filter function */
+#if defined(EMBREE_FILTER_FUNCTION)
+ if (filter && (unlikely(context->hasContextFilter() || geometry->hasOcclusionFilter())))
+ {
+ const Vec3fa Ng = hit_i.Ng();
+ const Vec2f uv = hit_i.uv();
+ Hit h(context->user,geomID,primID,uv,Ng);
+ float old_t = ray.tfar;
+ ray.tfar = hit_i.t();
+ bool found = runIntersectionFilter1SYCL(geometry,ray,context,h);
+ if (!found) {
+ ray.tfar = old_t;
+ return false;
+ }
+ }
+#endif
+
+ ray.tfar = neg_inf;
+ return true;
+ }
+ };
+}
diff --git a/thirdparty/embree/kernels/geometry/intersector_iterators.h b/thirdparty/embree/kernels/geometry/intersector_iterators.h
index 9cac1cd25c..5c6a6a7bb0 100644
--- a/thirdparty/embree/kernels/geometry/intersector_iterators.h
+++ b/thirdparty/embree/kernels/geometry/intersector_iterators.h
@@ -20,14 +20,15 @@ namespace embree
typedef typename Intersector::Precalculations Precalculations;
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
- for (size_t i=0; i<num; i++)
+ for (size_t i=0; i<num; i++) {
Intersector::intersect(pre,ray,context,prim[i]);
+ }
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
for (size_t i=0; i<num; i++) {
if (Intersector::occluded(pre,ray,context,prim[i]))
@@ -35,7 +36,7 @@ namespace embree
}
return false;
}
-
+
template<int N>
static __forceinline bool pointQuery(const Accel::Intersectors* This, PointQuery* query, PointQueryContext* context, const Primitive* prim, size_t num, const TravPointQuery<N> &tquery, size_t& lazy_node)
{
@@ -46,12 +47,12 @@ namespace embree
}
template<int K>
- static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
}
template<int K>
- static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
return valid;
}
@@ -64,7 +65,7 @@ namespace embree
typedef typename Intersector::Precalculations Precalculations;
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
for (size_t i=0; i<num; i++) {
Intersector::intersect(valid,pre,ray,context,prim[i]);
@@ -72,7 +73,7 @@ namespace embree
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
vbool<K> valid0 = valid;
for (size_t i=0; i<num; i++) {
@@ -83,7 +84,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
for (size_t i=0; i<num; i++) {
Intersector::intersect(pre,ray,k,context,prim[i]);
@@ -91,7 +92,7 @@ namespace embree
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
for (size_t i=0; i<num; i++) {
if (Intersector::occluded(pre,ray,k,context,prim[i]))
@@ -109,7 +110,7 @@ namespace embree
typedef typename IntersectorK::Primitive PrimitiveK;
typedef typename IntersectorK::Precalculations PrecalculationsK;
- static __forceinline void intersectK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayHitK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersectK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
{
PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
@@ -118,7 +119,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occludedK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
+ static __forceinline vbool<K> occludedK(const vbool<K>& valid, const Accel::Intersectors* This, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
{
PrecalculationsK pre(valid,ray); // FIXME: might cause trouble
vbool<K> valid0 = valid;
@@ -129,7 +130,7 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(const Accel::Intersectors* This, RayHitK<K>& ray, size_t k, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, RayHitK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
{
PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
for (size_t i=0; i<num; i++) {
@@ -137,7 +138,7 @@ namespace embree
}
}
- static __forceinline bool occluded(const Accel::Intersectors* This, RayK<K>& ray, size_t k, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, RayK<K>& ray, size_t k, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
{
PrecalculationsK pre(ray.tnear() <= ray.tfar,ray); // FIXME: might cause trouble
for (size_t i=0; i<num; i++) {
@@ -147,7 +148,7 @@ namespace embree
return false;
}
- static __forceinline size_t occluded(const Accel::Intersectors* This, size_t cur_mask, RayK<K>** __restrict__ inputPackets, IntersectContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
+ static __forceinline size_t occluded(const Accel::Intersectors* This, size_t cur_mask, RayK<K>** __restrict__ inputPackets, RayQueryContext* context, const PrimitiveK* prim, size_t num, size_t& lazy_node)
{
size_t m_occluded = 0;
for (size_t i=0; i<num; i++) {
diff --git a/thirdparty/embree/kernels/geometry/line_intersector.h b/thirdparty/embree/kernels/geometry/line_intersector.h
index 41096d8794..e3bad0a3d5 100644
--- a/thirdparty/embree/kernels/geometry/line_intersector.h
+++ b/thirdparty/embree/kernels/geometry/line_intersector.h
@@ -43,7 +43,7 @@ namespace embree
template<typename Ray, typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
@@ -96,7 +96,7 @@ namespace embree
template<typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
diff --git a/thirdparty/embree/kernels/geometry/linei.h b/thirdparty/embree/kernels/geometry/linei.h
index 3ee70ac012..3305025fc9 100644
--- a/thirdparty/embree/kernels/geometry/linei.h
+++ b/thirdparty/embree/kernels/geometry/linei.h
@@ -457,6 +457,9 @@ namespace embree
p1 = lerp(a1,b1,vfloat4(ftime));
pL = lerp(aL,bL,vfloat4(ftime));
pR = lerp(aR,bR,vfloat4(ftime));
+
+ pL = select(vboolf4(leftExists), pL, Vec4vf4(inf));
+ pR = select(vboolf4(rightExists), pR, Vec4vf4(inf));
}
#if defined(__AVX__)
@@ -647,6 +650,9 @@ namespace embree
p1 = lerp(a1,b1,vfloat8(ftime));
pL = lerp(aL,bL,vfloat8(ftime));
pR = lerp(aR,bR,vfloat8(ftime));
+
+ pL = select(vboolf4(leftExists), pL, Vec4vf8(inf));
+ pR = select(vboolf4(rightExists), pR, Vec4vf8(inf));
}
template<>
diff --git a/thirdparty/embree/kernels/geometry/linei_intersector.h b/thirdparty/embree/kernels/geometry/linei_intersector.h
index 5992827f5b..d754cc1269 100644
--- a/thirdparty/embree/kernels/geometry/linei_intersector.h
+++ b/thirdparty/embree/kernels/geometry/linei_intersector.h
@@ -17,7 +17,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -26,7 +26,7 @@ namespace embree
FlatLinearCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -47,7 +47,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -56,7 +56,7 @@ namespace embree
FlatLinearCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -77,7 +77,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -86,7 +86,7 @@ namespace embree
FlatLinearCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -102,7 +102,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -111,7 +111,7 @@ namespace embree
FlatLinearCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
diff --git a/thirdparty/embree/kernels/geometry/object.h b/thirdparty/embree/kernels/geometry/object.h
index 2a61829ffd..9525b97880 100644
--- a/thirdparty/embree/kernels/geometry/object.h
+++ b/thirdparty/embree/kernels/geometry/object.h
@@ -62,6 +62,17 @@ namespace embree
}
/*! fill triangle from triangle list */
+ __forceinline LBBox3fa fillMB(const PrimRefMB* prims, size_t i, Scene* scene, const BBox1f time_range)
+ {
+ const PrimRefMB& prim = prims[i]; i++;
+ const unsigned geomID = prim.geomID();
+ const unsigned primID = prim.primID();
+ new (this) Object(geomID, primID);
+ AccelSet* accel = (AccelSet*) scene->get(geomID);
+ return accel->linearBounds(primID,time_range);
+ }
+
+ /*! fill triangle from triangle list */
__forceinline LBBox3fa fillMB(const PrimRefMB* prims, size_t& i, size_t end, Scene* scene, const BBox1f time_range)
{
const PrimRefMB& prim = prims[i]; i++;
diff --git a/thirdparty/embree/kernels/geometry/object_intersector.h b/thirdparty/embree/kernels/geometry/object_intersector.h
index e4ad01852f..b89bc1837d 100644
--- a/thirdparty/embree/kernels/geometry/object_intersector.h
+++ b/thirdparty/embree/kernels/geometry/object_intersector.h
@@ -22,7 +22,7 @@ namespace embree
__forceinline Precalculations (const Ray& ray, const void *ptr) {}
};
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
@@ -35,7 +35,7 @@ namespace embree
accel->intersect(ray,prim.geomID(),prim.primID(),context);
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
{
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
/* perform ray mask test */
@@ -47,6 +47,40 @@ namespace embree
accel->occluded(ray,prim.geomID(),prim.primID(),context);
return ray.tfar < 0.0f;
}
+
+ static __forceinline bool intersect(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
+ return occluded(pre,ray,context,prim);
+ }
+
+ static __forceinline void intersect(unsigned int k, const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& prim)
+ {
+ AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
+
+ /* perform ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((ray.mask & accel->mask) == 0)
+ return;
+#endif
+
+ accel->intersect(k,ray,prim.geomID(),prim.primID(),context);
+ }
+
+ static __forceinline bool occluded(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim)
+ {
+ AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
+ /* perform ray mask test */
+#if defined(EMBREE_RAY_MASK)
+ if ((ray.mask & accel->mask) == 0)
+ return false;
+#endif
+
+ accel->occluded(k, ray,prim.geomID(),prim.primID(),context);
+ return ray.tfar < 0.0f;
+ }
+
+ static __forceinline bool intersect(unsigned int k, const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& prim) {
+ return occluded(k,pre,ray,context,prim);
+ }
static __forceinline bool pointQuery(PointQuery* query, PointQueryContext* context, const Primitive& prim)
{
@@ -57,13 +91,13 @@ namespace embree
}
template<int K>
- static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline void intersectK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(false);
}
template<int K>
- static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
+ static __forceinline vbool<K> occludedK(const vbool<K>& valid, /* PrecalculationsK& pre, */ RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, size_t& lazy_node)
{
assert(false);
return valid;
@@ -79,7 +113,7 @@ namespace embree
__forceinline Precalculations (const vbool<K>& valid, const RayK<K>& ray) {}
};
- static __forceinline void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline void intersect(const vbool<K>& valid_i, const Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& prim)
{
vbool<K> valid = valid_i;
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
@@ -92,7 +126,7 @@ namespace embree
accel->intersect(valid,ray,prim.geomID(),prim.primID(),context);
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& prim)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, const Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& prim)
{
vbool<K> valid = valid_i;
AccelSet* accel = (AccelSet*) context->scene->get(prim.geomID());
@@ -106,11 +140,11 @@ namespace embree
return ray.tfar < 0.0f;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
intersect(vbool<K>(1<<int(k)),pre,ray,context,prim);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& prim) {
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& prim) {
occluded(vbool<K>(1<<int(k)),pre,ray,context,prim);
return ray.tfar[k] < 0.0f;
}
diff --git a/thirdparty/embree/kernels/geometry/pointi.h b/thirdparty/embree/kernels/geometry/pointi.h
index bed04116b0..f81edb9035 100644
--- a/thirdparty/embree/kernels/geometry/pointi.h
+++ b/thirdparty/embree/kernels/geometry/pointi.h
@@ -267,10 +267,10 @@ namespace embree
const vfloat4 a2 = vfloat4::loadu(geom->vertexPtr(primID(2), itime));
const vfloat4 a3 = vfloat4::loadu(geom->vertexPtr(primID(3), itime));
transpose(a0, a1, a2, a3, p0.x, p0.y, p0.z, p0.w);
- const vfloat4 b0 = vfloat4(geom->normal(primID(0), itime));
- const vfloat4 b1 = vfloat4(geom->normal(primID(1), itime));
- const vfloat4 b2 = vfloat4(geom->normal(primID(2), itime));
- const vfloat4 b3 = vfloat4(geom->normal(primID(3), itime));
+ const vfloat4 b0 = vfloat4(geom->normal((size_t)primID(0), (size_t)itime));
+ const vfloat4 b1 = vfloat4(geom->normal((size_t)primID(1), (size_t)itime));
+ const vfloat4 b2 = vfloat4(geom->normal((size_t)primID(2), (size_t)itime));
+ const vfloat4 b3 = vfloat4(geom->normal((size_t)primID(3), (size_t)itime));
transpose(b0, b1, b2, b3, n0.x, n0.y, n0.z);
}
@@ -364,14 +364,14 @@ namespace embree
const vfloat4 a6 = vfloat4::loadu(geom->vertexPtr(primID(6), itime));
const vfloat4 a7 = vfloat4::loadu(geom->vertexPtr(primID(7), itime));
transpose(a0, a1, a2, a3, a4, a5, a6, a7, p0.x, p0.y, p0.z, p0.w);
- const vfloat4 b0 = vfloat4(geom->normal(primID(0), itime));
- const vfloat4 b1 = vfloat4(geom->normal(primID(1), itime));
- const vfloat4 b2 = vfloat4(geom->normal(primID(2), itime));
- const vfloat4 b3 = vfloat4(geom->normal(primID(3), itime));
- const vfloat4 b4 = vfloat4(geom->normal(primID(4), itime));
- const vfloat4 b5 = vfloat4(geom->normal(primID(5), itime));
- const vfloat4 b6 = vfloat4(geom->normal(primID(6), itime));
- const vfloat4 b7 = vfloat4(geom->normal(primID(7), itime));
+ const vfloat4 b0 = vfloat4(geom->normal((size_t)primID(0), (size_t)itime));
+ const vfloat4 b1 = vfloat4(geom->normal((size_t)primID(1), (size_t)itime));
+ const vfloat4 b2 = vfloat4(geom->normal((size_t)primID(2), (size_t)itime));
+ const vfloat4 b3 = vfloat4(geom->normal((size_t)primID(3), (size_t)itime));
+ const vfloat4 b4 = vfloat4(geom->normal((size_t)primID(4), (size_t)itime));
+ const vfloat4 b5 = vfloat4(geom->normal((size_t)primID(5), (size_t)itime));
+ const vfloat4 b6 = vfloat4(geom->normal((size_t)primID(6), (size_t)itime));
+ const vfloat4 b7 = vfloat4(geom->normal((size_t)primID(7), (size_t)itime));
transpose(b0, b1, b2, b3, b4, b5, b6, b7, n0.x, n0.y, n0.z);
}
diff --git a/thirdparty/embree/kernels/geometry/primitive.h b/thirdparty/embree/kernels/geometry/primitive.h
index 608d981dd7..de25ab87ef 100644
--- a/thirdparty/embree/kernels/geometry/primitive.h
+++ b/thirdparty/embree/kernels/geometry/primitive.h
@@ -6,8 +6,8 @@
#include "../common/default.h"
#include "../common/scene.h"
#include "../../common/simd/simd.h"
-#include "../common/primref.h"
-#include "../common/primref_mb.h"
+#include "../builders/primref.h"
+#include "../builders/primref_mb.h"
namespace embree
{
diff --git a/thirdparty/embree/kernels/geometry/primitive4.cpp b/thirdparty/embree/kernels/geometry/primitive4.cpp
index 9c953c5d35..924e78bbf1 100644
--- a/thirdparty/embree/kernels/geometry/primitive4.cpp
+++ b/thirdparty/embree/kernels/geometry/primitive4.cpp
@@ -15,6 +15,7 @@
#include "subdivpatch1.h"
#include "object.h"
#include "instance.h"
+#include "instance_array.h"
#include "subgrid.h"
namespace embree
@@ -335,6 +336,26 @@ namespace embree
InstancePrimitive::Type InstancePrimitive::type;
+ /********************** InstanceArray4 **************************/
+
+ const char* InstanceArrayPrimitive::Type::name () const {
+ return "instance_array";
+ }
+
+ size_t InstanceArrayPrimitive::Type::sizeActive(const char* This) const {
+ return 1;
+ }
+
+ size_t InstanceArrayPrimitive::Type::sizeTotal(const char* This) const {
+ return 1;
+ }
+
+ size_t InstanceArrayPrimitive::Type::getBytes(const char* This) const {
+ return sizeof(InstanceArrayPrimitive);
+ }
+
+ InstanceArrayPrimitive::Type InstanceArrayPrimitive::type;
+
/********************** SubGrid **************************/
const char* SubGrid::Type::name () const {
diff --git a/thirdparty/embree/kernels/geometry/quad_intersector_moeller.h b/thirdparty/embree/kernels/geometry/quad_intersector_moeller.h
index 3abc9d6f70..2c574e4e47 100644
--- a/thirdparty/embree/kernels/geometry/quad_intersector_moeller.h
+++ b/thirdparty/embree/kernels/geometry/quad_intersector_moeller.h
@@ -122,7 +122,7 @@ namespace embree
__forceinline QuadMIntersector1MoellerTrumbore(const Ray& ray, const void* ptr) {}
- __forceinline void intersect(RayHit& ray, IntersectContext* context,
+ __forceinline void intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -144,7 +144,7 @@ namespace embree
}
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -215,14 +215,14 @@ namespace embree
return false;
}
- __forceinline bool intersect(RayHit& ray, IntersectContext* context,
+ __forceinline bool intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
return intersect(ray,v0,v1,v2,v3,Intersect1EpilogM<8,filter>(ray,context,vuint8(geomID),vuint8(primID)));
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
@@ -394,7 +394,7 @@ namespace embree
__forceinline QuadMIntersectorKMoellerTrumbore(const vbool<K>& valid, const RayK<K>& ray)
: QuadMIntersectorKMoellerTrumboreBase<M,K,filter>(valid,ray) {}
- __forceinline void intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline void intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -403,7 +403,7 @@ namespace embree
MoellerTrumboreIntersector1KTriangleM::intersect1<M,K>(ray,k,v2,v3,v1,vbool<M>(true ),epilog);
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -440,14 +440,14 @@ namespace embree
return MoellerTrumboreIntersector1KTriangleM::intersect1<8,K>(ray,k,vtx0,vtx1,vtx2,flags,epilog);
}
- __forceinline bool intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
return intersect1(ray,k,v0,v1,v2,v3,Intersect1KEpilogM<8,K,filter>(ray,k,context,vuint8(geomID),vuint8(primID)));
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
diff --git a/thirdparty/embree/kernels/geometry/quad_intersector_pluecker.h b/thirdparty/embree/kernels/geometry/quad_intersector_pluecker.h
index 9873ff76ac..69d6881080 100644
--- a/thirdparty/embree/kernels/geometry/quad_intersector_pluecker.h
+++ b/thirdparty/embree/kernels/geometry/quad_intersector_pluecker.h
@@ -171,7 +171,7 @@ namespace embree
__forceinline QuadMIntersector1Pluecker(const Ray& ray, const void* ptr) {}
- __forceinline void intersect(RayHit& ray, IntersectContext* context,
+ __forceinline void intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -180,7 +180,7 @@ namespace embree
PlueckerIntersectorTriangle1::intersect<M>(ray,v2,v3,v1,vbool<M>(true),epilog);
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -216,13 +216,13 @@ namespace embree
return PlueckerIntersectorTriangle1::intersect<8>(ray,vtx0,vtx1,vtx2,flags,epilog);
}
- __forceinline bool intersect(RayHit& ray, IntersectContext* context, const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
+ __forceinline bool intersect(RayHit& ray, RayQueryContext* context, const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
return intersect(ray,v0,v1,v2,v3,Intersect1EpilogM<8,filter>(ray,context,vuint8(geomID),vuint8(primID)));
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context, const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context, const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
return intersect(ray,v0,v1,v2,v3,Occluded1EpilogM<8,filter>(ray,context,vuint8(geomID),vuint8(primID)));
@@ -374,7 +374,7 @@ namespace embree
__forceinline QuadMIntersectorKPluecker(const vbool<K>& valid, const RayK<K>& ray)
: QuadMIntersectorKPlueckerBase<M,K,filter>(valid,ray) {}
- __forceinline void intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline void intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -383,7 +383,7 @@ namespace embree
PlueckerIntersector1KTriangleM::intersect1<M,K>(ray,k,v2,v3,v1,vbool<M>(true ),epilog);
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const vuint<M>& geomID, const vuint<M>& primID) const
{
@@ -418,14 +418,14 @@ namespace embree
return PlueckerIntersector1KTriangleM::intersect1<8,K>(ray,k,vtx0,vtx1,vtx2,flags,epilog);
}
- __forceinline bool intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
return intersect1(ray,k,v0,v1,v2,v3,Intersect1KEpilogM<8,K,filter>(ray,k,context,vuint8(geomID),vuint8(primID)));
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const vuint4& geomID, const vuint4& primID) const
{
diff --git a/thirdparty/embree/kernels/geometry/quadi_intersector.h b/thirdparty/embree/kernels/geometry/quadi_intersector.h
index 20a98c3406..96fc77b42d 100644
--- a/thirdparty/embree/kernels/geometry/quadi_intersector.h
+++ b/thirdparty/embree/kernels/geometry/quadi_intersector.h
@@ -19,7 +19,7 @@ namespace embree
typedef QuadMIntersector1MoellerTrumbore<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -27,7 +27,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -48,7 +48,7 @@ namespace embree
typedef QuadMIntersectorKMoellerTrumbore<M,K,filter> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
Scene* scene = context->scene;
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
@@ -64,7 +64,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
Scene* scene = context->scene;
vbool<K> valid0 = valid_i;
@@ -83,7 +83,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf4 v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -91,7 +91,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf4 v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -107,7 +107,7 @@ namespace embree
typedef QuadMIntersector1Pluecker<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -115,7 +115,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -136,7 +136,7 @@ namespace embree
typedef QuadMIntersectorKPluecker<M,K,filter> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
Scene* scene = context->scene;
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
@@ -152,7 +152,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
Scene* scene = context->scene;
vbool<K> valid0 = valid_i;
@@ -171,7 +171,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf4 v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -179,7 +179,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf4 v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene);
@@ -195,7 +195,7 @@ namespace embree
typedef QuadMIntersector1MoellerTrumbore<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time());
@@ -203,7 +203,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time());
@@ -224,7 +224,7 @@ namespace embree
typedef QuadMIntersectorKMoellerTrumbore<M,K,filter> Precalculations;
/*! Intersects K rays with M quads. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
{
@@ -236,7 +236,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M quads. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
vbool<K> valid0 = valid_i;
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
@@ -251,7 +251,7 @@ namespace embree
}
/*! Intersect a ray with M quads and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time()[k]);
@@ -259,7 +259,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M quads. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time()[k]);
@@ -275,7 +275,7 @@ namespace embree
typedef QuadMIntersector1Pluecker<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time());
@@ -283,7 +283,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time());
@@ -304,7 +304,7 @@ namespace embree
typedef QuadMIntersectorKPluecker<M,K,filter> Precalculations;
/*! Intersects K rays with M quads. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
{
@@ -316,7 +316,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M quads. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMi<M>& quad)
{
vbool<K> valid0 = valid_i;
for (size_t i=0; i<QuadMi<M>::max_size(); i++)
@@ -331,7 +331,7 @@ namespace embree
}
/*! Intersect a ray with M quads and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time()[k]);
@@ -339,7 +339,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M quads. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMi<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMi<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2,v3; quad.gather(v0,v1,v2,v3,context->scene,ray.time()[k]);
diff --git a/thirdparty/embree/kernels/geometry/quadv_intersector.h b/thirdparty/embree/kernels/geometry/quadv_intersector.h
index 9b28e05614..9eea8275f7 100644
--- a/thirdparty/embree/kernels/geometry/quadv_intersector.h
+++ b/thirdparty/embree/kernels/geometry/quadv_intersector.h
@@ -19,14 +19,14 @@ namespace embree
typedef QuadMIntersector1MoellerTrumbore<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.occluded(ray,context, quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
@@ -46,7 +46,7 @@ namespace embree
typedef QuadMIntersectorKMoellerTrumbore<M,K,filter> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMv<M>& quad)
{
for (size_t i=0; i<QuadMv<M>::max_size(); i++)
{
@@ -61,7 +61,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMv<M>& quad)
{
vbool<K> valid0 = valid_i;
@@ -80,14 +80,14 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMv<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMv<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.occluded1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
@@ -102,14 +102,14 @@ namespace embree
typedef QuadMIntersector1Pluecker<M,filter> Precalculations;
/*! Intersect a ray with the M quads and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
}
/*! Test if the ray is occluded by one of M quads. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& quad)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& quad)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.occluded(ray,context, quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
@@ -129,7 +129,7 @@ namespace embree
typedef QuadMIntersectorKPluecker<M,K,filter> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const QuadMv<M>& quad)
{
for (size_t i=0; i<QuadMv<M>::max_size(); i++)
{
@@ -144,7 +144,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const QuadMv<M>& quad)
{
vbool<K> valid0 = valid_i;
@@ -163,14 +163,14 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const QuadMv<M>& quad)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const QuadMv<M>& quad)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const QuadMv<M>& quad)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.occluded1(ray,k,context,quad.v0,quad.v1,quad.v2,quad.v3,quad.geomID(),quad.primID());
diff --git a/thirdparty/embree/kernels/geometry/roundline_intersector.h b/thirdparty/embree/kernels/geometry/roundline_intersector.h
index 764ff93fec..a83dd72a7f 100644
--- a/thirdparty/embree/kernels/geometry/roundline_intersector.h
+++ b/thirdparty/embree/kernels/geometry/roundline_intersector.h
@@ -661,7 +661,7 @@ namespace embree
template<typename Ray, typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
@@ -694,7 +694,7 @@ namespace embree
template<typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const LineSegments* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i, const Vec4vf<M>& v1i,
diff --git a/thirdparty/embree/kernels/geometry/roundlinei_intersector.h b/thirdparty/embree/kernels/geometry/roundlinei_intersector.h
index 29061d6475..02a5d63a3d 100644
--- a/thirdparty/embree/kernels/geometry/roundlinei_intersector.h
+++ b/thirdparty/embree/kernels/geometry/roundlinei_intersector.h
@@ -16,7 +16,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -25,7 +25,7 @@ namespace embree
RoundLinearCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,vL,vR,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -46,7 +46,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculations1 Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -55,7 +55,7 @@ namespace embree
RoundLinearCurveIntersector1<M>::intersect(valid,ray,context,geom,pre,v0,v1,vL,vR,Intersect1EpilogM<M,filter>(ray,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -76,7 +76,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -85,7 +85,7 @@ namespace embree
RoundLinearCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,vL,vR,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -101,7 +101,7 @@ namespace embree
typedef LineMi<M> Primitive;
typedef CurvePrecalculationsK<K> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline void intersect(const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(normal.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
@@ -110,7 +110,7 @@ namespace embree
RoundLinearCurveIntersectorK<M,K>::intersect(valid,ray,k,context,geom,pre,v0,v1,vL,vR,Intersect1KEpilogM<M,K,filter>(ray,k,context,line.geomID(),line.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& line)
+ static __forceinline bool occluded(const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& line)
{
STAT3(shadow.trav_prims,1,1,1);
const LineSegments* geom = context->scene->get<LineSegments>(line.geomID());
diff --git a/thirdparty/embree/kernels/geometry/sphere_intersector.h b/thirdparty/embree/kernels/geometry/sphere_intersector.h
index 2670f9762d..ba242a88b6 100644
--- a/thirdparty/embree/kernels/geometry/sphere_intersector.h
+++ b/thirdparty/embree/kernels/geometry/sphere_intersector.h
@@ -24,24 +24,60 @@ namespace embree
__forceinline Vec2f uv(const size_t i) const {
return Vec2f(0.0f, 0.0f);
}
+ __forceinline Vec2vf<M> uv() const {
+ return Vec2vf<M>(0.0f, 0.0f);
+ }
__forceinline float t(const size_t i) const {
return vt[i];
}
+ __forceinline vfloat<M> t() const {
+ return vt;
+ }
__forceinline Vec3fa Ng(const size_t i) const {
return Vec3fa(vNg.x[i], vNg.y[i], vNg.z[i]);
}
+ __forceinline Vec3vf<M> Ng() const {
+ return vNg;
+ }
public:
vfloat<M> vt;
Vec3vf<M> vNg;
};
+ template<>
+ struct SphereIntersectorHitM<1>
+ {
+ __forceinline SphereIntersectorHitM() {}
+
+ __forceinline SphereIntersectorHitM(const float& t, const Vec3f& Ng)
+ : vt(t), vNg(Ng) {}
+
+ __forceinline void finalize() {}
+
+ __forceinline Vec2f uv() const {
+ return Vec2f(0.0f, 0.0f);
+ }
+
+ __forceinline float t() const {
+ return vt;
+ }
+
+ __forceinline Vec3f Ng() const {
+ return vNg;
+ }
+
+ public:
+ float vt;
+ Vec3f vNg;
+ };
+
template<int M>
struct SphereIntersector1
{
typedef CurvePrecalculations1 Precalculations;
- template<typename Epilog>
+ template<typename Ray, typename Epilog>
static __forceinline bool intersect(
const vbool<M>& valid_i, Ray& ray,
const Precalculations& pre, const Vec4vf<M>& v0, const Epilog& epilog)
@@ -68,10 +104,15 @@ namespace embree
const vfloat<M> t_back = projC0 + td;
const vbool<M> valid_front = valid & (ray.tnear() <= t_front) & (t_front <= ray.tfar);
- const vbool<M> valid_back = valid & (ray.tnear() <= t_back ) & (t_back <= ray.tfar);
/* check if there is a first hit */
+#if defined (EMBREE_BACKFACE_CULLING_SPHERES)
+ /* check if there is a first hit */
+ const vbool<M> valid_first = valid_front;
+#else
+ const vbool<M> valid_back = valid & (ray.tnear() <= t_back ) & (t_back <= ray.tfar);
const vbool<M> valid_first = valid_front | valid_back;
+#endif
if (unlikely(none(valid_first)))
return false;
@@ -84,7 +125,10 @@ namespace embree
/* invoke intersection filter for first hit */
const bool is_hit_first = epilog(valid_first, hit);
-
+
+#if defined (EMBREE_BACKFACE_CULLING_SPHERES)
+ return is_hit_first;
+#else
/* check for possible second hits before potentially accepted hit */
const vfloat<M> t_second = t_back;
const vbool<M> valid_second = valid_front & valid_back & (t_second <= ray.tfar);
@@ -95,13 +139,13 @@ namespace embree
const Vec3vf<M> Ng_second = td_back * ray_dir - perp;
hit = SphereIntersectorHitM<M> (t_second, Ng_second);
const bool is_hit_second = epilog(valid_second, hit);
-
return is_hit_first | is_hit_second;
+#endif
}
template<typename Epilog>
static __forceinline bool intersect(
- const vbool<M>& valid_i, Ray& ray, IntersectContext* context, const Points* geom,
+ const vbool<M>& valid_i, Ray& ray, RayQueryContext* context, const Points* geom,
const Precalculations& pre, const Vec4vf<M>& v0i, const Epilog& epilog)
{
const Vec3vf<M> ray_org(ray.org.x, ray.org.y, ray.org.z);
@@ -118,7 +162,7 @@ namespace embree
template<typename Epilog>
static __forceinline bool intersect(const vbool<M>& valid_i,
RayK<K>& ray, size_t k,
- IntersectContext* context,
+ RayQueryContext* context,
const Points* geom,
const Precalculations& pre,
const Vec4vf<M>& v0i,
@@ -148,10 +192,14 @@ namespace embree
const vfloat<M> t_back = projC0 + td;
const vbool<M> valid_front = valid & (ray.tnear()[k] <= t_front) & (t_front <= ray.tfar[k]);
- const vbool<M> valid_back = valid & (ray.tnear()[k] <= t_back ) & (t_back <= ray.tfar[k]);
/* check if there is a first hit */
+#if defined (EMBREE_BACKFACE_CULLING_SPHERES)
+ const vbool<M> valid_first = valid_front;
+#else
+ const vbool<M> valid_back = valid & (ray.tnear()[k] <= t_back ) & (t_back <= ray.tfar[k]);
const vbool<M> valid_first = valid_front | valid_back;
+#endif
if (unlikely(none(valid_first)))
return false;
@@ -164,7 +212,10 @@ namespace embree
/* invoke intersection filter for first hit */
const bool is_hit_first = epilog(valid_first, hit);
-
+
+#if defined (EMBREE_BACKFACE_CULLING_SPHERES)
+ return is_hit_first;
+#else
/* check for possible second hits before potentially accepted hit */
const vfloat<M> t_second = t_back;
const vbool<M> valid_second = valid_front & valid_back & (t_second <= ray.tfar[k]);
@@ -177,6 +228,7 @@ namespace embree
const bool is_hit_second = epilog(valid_second, hit);
return is_hit_first | is_hit_second;
+#endif
}
};
} // namespace isa
diff --git a/thirdparty/embree/kernels/geometry/spherei_intersector.h b/thirdparty/embree/kernels/geometry/spherei_intersector.h
index 7a0b428117..7072ea81e8 100644
--- a/thirdparty/embree/kernels/geometry/spherei_intersector.h
+++ b/thirdparty/embree/kernels/geometry/spherei_intersector.h
@@ -19,7 +19,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& sphere)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -32,7 +32,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& sphere)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -59,7 +59,7 @@ namespace embree
static __forceinline void intersect(const Precalculations& pre,
RayHit& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& sphere)
{
STAT3(normal.trav_prims, 1, 1, 1);
@@ -72,7 +72,7 @@ namespace embree
static __forceinline bool occluded(const Precalculations& pre,
Ray& ray,
- IntersectContext* context,
+ RayQueryContext* context,
const Primitive& sphere)
{
STAT3(shadow.trav_prims, 1, 1, 1);
@@ -98,7 +98,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& sphere)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(sphere.geomID());
@@ -110,7 +110,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& sphere)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(sphere.geomID());
@@ -129,7 +129,7 @@ namespace embree
typedef CurvePrecalculationsK<K> Precalculations;
static __forceinline void intersect(
- const Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& sphere)
+ const Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
{
STAT3(normal.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(sphere.geomID());
@@ -141,7 +141,7 @@ namespace embree
}
static __forceinline bool occluded(
- const Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& sphere)
+ const Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& sphere)
{
STAT3(shadow.trav_prims, 1, 1, 1);
const Points* geom = context->scene->get<Points>(sphere.geomID());
diff --git a/thirdparty/embree/kernels/geometry/subdivpatch1_intersector.h b/thirdparty/embree/kernels/geometry/subdivpatch1_intersector.h
index b4b15a1210..cf17127169 100644
--- a/thirdparty/embree/kernels/geometry/subdivpatch1_intersector.h
+++ b/thirdparty/embree/kernels/geometry/subdivpatch1_intersector.h
@@ -35,7 +35,7 @@ namespace embree
typedef GridSOA Primitive;
typedef SubdivPatch1Precalculations<GridSOAIntersector1::Precalculations> Precalculations;
- static __forceinline bool processLazyNode(Precalculations& pre, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
lazy_node = prim->root(0);
pre.grid = (Primitive*)prim;
@@ -44,27 +44,27 @@ namespace embree
/*! Intersect a ray with the primitive. */
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAIntersector1::intersect(pre,ray,context,prim,lazy_node);
else processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
intersect(This,pre,ray,context,prim,ty,tray,lazy_node);
}
/*! Test if the ray is occluded by the primitive */
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAIntersector1::occluded(pre,ray,context,prim,lazy_node);
else return processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
return occluded(This,pre,ray,context,prim,ty,tray,lazy_node);
}
@@ -88,7 +88,7 @@ namespace embree
typedef SubdivPatch1 Primitive;
typedef GridSOAMBIntersector1::Precalculations Precalculations;
- static __forceinline bool processLazyNode(Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim_i, size_t& lazy_node)
+ static __forceinline bool processLazyNode(Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim_i, size_t& lazy_node)
{
Primitive* prim = (Primitive*) prim_i;
GridSOA* grid = nullptr;
@@ -101,27 +101,27 @@ namespace embree
/*! Intersect a ray with the primitive. */
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAMBIntersector1::intersect(pre,ray,context,prim,lazy_node);
else processLazyNode(pre,ray,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
intersect(This,pre,ray,context,prim,ty,tray,lazy_node);
}
/*! Test if the ray is occluded by the primitive */
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAMBIntersector1::occluded(pre,ray,context,prim,lazy_node);
else return processLazyNode(pre,ray,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, size_t ty0, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node) {
return occluded(This,pre,ray,context,prim,ty,tray,lazy_node);
}
@@ -145,7 +145,7 @@ namespace embree
typedef GridSOA Primitive;
typedef SubdivPatch1PrecalculationsK<K,typename GridSOAIntersectorK<K>::Precalculations> Precalculations;
- static __forceinline bool processLazyNode(Precalculations& pre, IntersectContext* context, const Primitive* prim, size_t& lazy_node)
+ static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim, size_t& lazy_node)
{
lazy_node = prim->root(0);
pre.grid = (Primitive*)prim;
@@ -153,28 +153,28 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
else processLazyNode(pre,context,prim,lazy_node);
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
else return processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
else processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
else return processLazyNode(pre,context,prim,lazy_node);
@@ -192,7 +192,7 @@ namespace embree
//typedef GridSOAMBIntersectorK<K>::Precalculations Precalculations;
typedef SubdivPatch1PrecalculationsK<K,typename GridSOAMBIntersectorK<K>::Precalculations> Precalculations;
- static __forceinline bool processLazyNode(Precalculations& pre, IntersectContext* context, const Primitive* prim_i, size_t& lazy_node)
+ static __forceinline bool processLazyNode(Precalculations& pre, RayQueryContext* context, const Primitive* prim_i, size_t& lazy_node)
{
Primitive* prim = (Primitive*) prim_i;
GridSOA* grid = (GridSOA*) prim->root_ref.get();
@@ -202,28 +202,28 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAMBIntersectorK<K>::intersect(valid,pre,ray,context,prim,lazy_node);
else processLazyNode(pre,context,prim,lazy_node);
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAMBIntersectorK<K>::occluded(valid,pre,ray,context,prim,lazy_node);
else return processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) GridSOAMBIntersectorK<K>::intersect(pre,ray,k,context,prim,lazy_node);
else processLazyNode(pre,context,prim,lazy_node);
}
template<int N, bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t ty, const TravRay<N,robust> &tray, size_t& lazy_node)
{
if (likely(ty == 0)) return GridSOAMBIntersectorK<K>::occluded(pre,ray,k,context,prim,lazy_node);
else return processLazyNode(pre,context,prim,lazy_node);
diff --git a/thirdparty/embree/kernels/geometry/subgrid.h b/thirdparty/embree/kernels/geometry/subgrid.h
index ce54421cab..f57e55db78 100644
--- a/thirdparty/embree/kernels/geometry/subgrid.h
+++ b/thirdparty/embree/kernels/geometry/subgrid.h
@@ -283,7 +283,7 @@ namespace embree
friend embree_ostream operator<<(embree_ostream cout, const SubGrid& sg) {
- return cout << "SubGrid " << " ( x " << sg.x() << ", y = " << sg.y() << ", geomID = " << sg.geomID() << ", primID = " << sg.primID() << " )";
+ return cout << "SubGrid " << " ( x = " << sg.x() << ", y = " << sg.y() << ", geomID = " << sg.geomID() << ", primID = " << sg.primID() << ", invalid3x3X() " << (int)sg.invalid3x3X() << ", invalid3x3Y() " << (int)sg.invalid3x3Y();
}
__forceinline unsigned int geomID() const { return _geomID; }
@@ -305,9 +305,10 @@ namespace embree
__forceinline SubGridID() {}
__forceinline SubGridID(const unsigned int x, const unsigned int y, const unsigned int primID) :
- x(x), y(y), primID(primID) {}
+ x(x), y(y), primID(primID) {}
+
};
-
+
/* QuantizedBaseNode as large subgrid leaf */
template<int N>
struct SubGridQBVHN
@@ -403,6 +404,9 @@ namespace embree
typedef SubGridQBVHN<8> SubGridQBVH8;
+
+
+
/* QuantizedBaseNode as large subgrid leaf */
template<int N>
struct SubGridMBQBVHN
@@ -513,5 +517,4 @@ namespace embree
}
};
-
}
diff --git a/thirdparty/embree/kernels/geometry/subgrid_intersector.h b/thirdparty/embree/kernels/geometry/subgrid_intersector.h
index e241073812..561d3d43f2 100644
--- a/thirdparty/embree/kernels/geometry/subgrid_intersector.h
+++ b/thirdparty/embree/kernels/geometry/subgrid_intersector.h
@@ -23,7 +23,7 @@ namespace embree
typedef SubGridQBVHN<N> Primitive;
typedef SubGridQuadMIntersector1MoellerTrumbore<4,filter> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -33,7 +33,7 @@ namespace embree
pre.intersect(ray,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -54,7 +54,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -76,7 +76,7 @@ namespace embree
}
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -126,7 +126,7 @@ namespace embree
typedef SubGridQBVHN<N> Primitive;
typedef SubGridQuadMIntersector1Pluecker<4,filter> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -136,7 +136,7 @@ namespace embree
pre.intersect(ray,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -156,7 +156,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -179,7 +179,7 @@ namespace embree
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -231,7 +231,7 @@ namespace embree
typedef SubGridQBVHN<N> Primitive;
typedef SubGridQuadMIntersectorKMoellerTrumbore<4,K,filter> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
Vec3fa vtx[16];
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -249,7 +249,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
vbool<K> valid0 = valid_i;
Vec3fa vtx[16];
@@ -270,7 +270,7 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -280,7 +280,7 @@ namespace embree
pre.intersect1(ray,k,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -290,7 +290,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
for (size_t j=0;j<num;j++)
@@ -307,7 +307,7 @@ namespace embree
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
vbool<K> valid0 = valid;
@@ -327,7 +327,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -347,7 +347,7 @@ namespace embree
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -375,7 +375,7 @@ namespace embree
typedef SubGridQBVHN<N> Primitive;
typedef SubGridQuadMIntersectorKPluecker<4,K,filter> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
Vec3fa vtx[16];
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -393,7 +393,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
vbool<K> valid0 = valid_i;
Vec3fa vtx[16];
@@ -414,7 +414,7 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -424,7 +424,7 @@ namespace embree
pre.intersect1(ray,k,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -434,7 +434,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
for (size_t j=0;j<num;j++)
@@ -451,7 +451,7 @@ namespace embree
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
vbool<K> valid0 = valid;
@@ -471,7 +471,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
@@ -491,7 +491,7 @@ namespace embree
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
diff --git a/thirdparty/embree/kernels/geometry/subgrid_intersector_moeller.h b/thirdparty/embree/kernels/geometry/subgrid_intersector_moeller.h
index 64937d34fe..2666847333 100644
--- a/thirdparty/embree/kernels/geometry/subgrid_intersector_moeller.h
+++ b/thirdparty/embree/kernels/geometry/subgrid_intersector_moeller.h
@@ -39,7 +39,7 @@ namespace embree
__forceinline SubGridQuadMIntersector1MoellerTrumbore(const Ray& ray, const void* ptr) {}
- __forceinline void intersect(RayHit& ray, IntersectContext* context,
+ __forceinline void intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -65,7 +65,7 @@ namespace embree
}
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -135,14 +135,14 @@ namespace embree
return false;
}
- __forceinline bool intersect(RayHit& ray, IntersectContext* context,
+ __forceinline bool intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
return intersect(ray,v0,v1,v2,v3,g,subgrid,Intersect1EpilogMU<8,filter>(ray,context,subgrid.geomID(),subgrid.primID()));
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -270,7 +270,7 @@ namespace embree
__forceinline SubGridQuadMIntersectorKMoellerTrumbore(const vbool<K>& valid, const RayK<K>& ray)
: SubGridQuadMIntersectorKMoellerTrumboreBase<M,K,filter>(valid,ray) {}
- __forceinline void intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline void intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
UVIdentity<M> mapUV;
@@ -294,7 +294,7 @@ namespace embree
}
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
UVIdentity<M> mapUV;
@@ -361,13 +361,13 @@ namespace embree
return false;
}
- __forceinline bool intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
return intersect1(ray,k,v0,v1,v2,v3,g,subgrid,Intersect1KEpilogMU<8,K,filter>(ray,k,context,subgrid.geomID(),subgrid.primID()));
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
return intersect1(ray,k,v0,v1,v2,v3,g,subgrid,Occluded1KEpilogMU<8,K,filter>(ray,k,context,subgrid.geomID(),subgrid.primID()));
diff --git a/thirdparty/embree/kernels/geometry/subgrid_intersector_pluecker.h b/thirdparty/embree/kernels/geometry/subgrid_intersector_pluecker.h
index 5ded56e1f7..4919f927ae 100644
--- a/thirdparty/embree/kernels/geometry/subgrid_intersector_pluecker.h
+++ b/thirdparty/embree/kernels/geometry/subgrid_intersector_pluecker.h
@@ -36,7 +36,7 @@ namespace embree
__forceinline SubGridQuadMIntersector1Pluecker(const Ray& ray, const void* ptr) {}
- __forceinline void intersect(RayHit& ray, IntersectContext* context,
+ __forceinline void intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -63,7 +63,7 @@ namespace embree
}
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -134,14 +134,14 @@ namespace embree
return false;
}
- __forceinline bool intersect(RayHit& ray, IntersectContext* context,
+ __forceinline bool intersect(RayHit& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
return intersect(ray,v0,v1,v2,v3,g,subgrid,Intersect1EpilogMU<8,filter>(ray,context,subgrid.geomID(),subgrid.primID()));
}
- __forceinline bool occluded(Ray& ray, IntersectContext* context,
+ __forceinline bool occluded(Ray& ray, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3,
const GridMesh::Grid &g, const SubGrid& subgrid) const
{
@@ -255,7 +255,7 @@ namespace embree
__forceinline SubGridQuadMIntersectorKPluecker(const vbool<K>& valid, const RayK<K>& ray)
: SubGridQuadMIntersectorKPlueckerBase<M,K,filter>(valid,ray) {}
- __forceinline void intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline void intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
UVIdentity<M> mapUV;
@@ -280,7 +280,7 @@ namespace embree
}
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf<M>& v0, const Vec3vf<M>& v1, const Vec3vf<M>& v2, const Vec3vf<M>& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
UVIdentity<M> mapUV;
@@ -348,13 +348,13 @@ namespace embree
return false;
}
- __forceinline bool intersect1(RayHitK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool intersect1(RayHitK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
return intersect1(ray,k,v0,v1,v2,v3,g,subgrid,Intersect1KEpilogMU<8,K,filter>(ray,k,context,subgrid.geomID(),subgrid.primID()));
}
- __forceinline bool occluded1(RayK<K>& ray, size_t k, IntersectContext* context,
+ __forceinline bool occluded1(RayK<K>& ray, size_t k, RayQueryContext* context,
const Vec3vf4& v0, const Vec3vf4& v1, const Vec3vf4& v2, const Vec3vf4& v3, const GridMesh::Grid &g, const SubGrid &subgrid) const
{
return intersect1(ray,k,v0,v1,v2,v3,g,subgrid,Occluded1KEpilogMU<8,K,filter>(ray,k,context,subgrid.geomID(),subgrid.primID()));
diff --git a/thirdparty/embree/kernels/geometry/subgrid_mb_intersector.h b/thirdparty/embree/kernels/geometry/subgrid_mb_intersector.h
index 473d656e24..0986eea134 100644
--- a/thirdparty/embree/kernels/geometry/subgrid_mb_intersector.h
+++ b/thirdparty/embree/kernels/geometry/subgrid_mb_intersector.h
@@ -15,7 +15,7 @@ namespace embree
typedef SubGridMBQBVHN<N> Primitive;
typedef SubGridQuadMIntersector1Pluecker<4,filter> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -27,7 +27,7 @@ namespace embree
pre.intersect(ray,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -46,7 +46,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
for (size_t i=0;i<num;i++)
@@ -69,7 +69,7 @@ namespace embree
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
for (size_t i=0;i<num;i++)
@@ -102,7 +102,7 @@ namespace embree
typedef SubGridMBQBVHN<N> Primitive;
typedef SubGridQuadMIntersectorKPluecker<4,K,filter> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
size_t m_valid = movemask(valid_i);
while(m_valid)
@@ -112,7 +112,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const SubGrid& subgrid)
{
vbool<K> valid0 = valid_i;
size_t m_valid = movemask(valid_i);
@@ -125,7 +125,7 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(normal.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -137,7 +137,7 @@ namespace embree
pre.intersect1(ray,k,context,v0,v1,v2,v3,g,subgrid);
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const SubGrid& subgrid)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const SubGrid& subgrid)
{
STAT3(shadow.trav_prims,1,1,1);
const GridMesh* mesh = context->scene->get<GridMesh>(subgrid.geomID());
@@ -150,7 +150,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
for (size_t j=0;j<num;j++)
@@ -169,7 +169,7 @@ namespace embree
}
template<bool robust>
- static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid, const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive* prim, size_t num, const TravRayK<K, robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersectorK<N,K,robust> isecK;
@@ -191,7 +191,7 @@ namespace embree
}
template<bool robust>
- static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline void intersect(const Accel::Intersectors* This, Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
for (size_t i=0;i<num;i++)
@@ -211,7 +211,7 @@ namespace embree
}
template<bool robust>
- static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
+ static __forceinline bool occluded(const Accel::Intersectors* This, Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive* prim, size_t num, const TravRay<N,robust> &tray, size_t& lazy_node)
{
BVHNQuantizedBaseNodeIntersector1<N,robust> isec1;
diff --git a/thirdparty/embree/kernels/geometry/triangle_intersector.h b/thirdparty/embree/kernels/geometry/triangle_intersector.h
index 2cdff78ec8..9d9ddc7cad 100644
--- a/thirdparty/embree/kernels/geometry/triangle_intersector.h
+++ b/thirdparty/embree/kernels/geometry/triangle_intersector.h
@@ -18,14 +18,14 @@ namespace embree
typedef MoellerTrumboreIntersector1<M> Precalculations;
/*! Intersect a ray with the M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const TriangleM<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersectEdge(ray,tri.v0,tri.e1,tri.e2,UVIdentity<M>(),Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const TriangleM<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersectEdge(ray,tri.v0,tri.e1,tri.e2,UVIdentity<M>(),Occluded1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
@@ -46,7 +46,7 @@ namespace embree
typedef MoellerTrumboreIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const TriangleM<M>& tri)
{
STAT_USER(0,TriangleM<M>::max_size());
for (size_t i=0; i<TriangleM<M>::max_size(); i++)
@@ -61,7 +61,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const TriangleM<M>& tri)
{
vbool<K> valid0 = valid_i;
@@ -79,14 +79,14 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const TriangleM<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersectEdge(ray,k,tri.v0,tri.e1,tri.e2,UVIdentity<M>(),Intersect1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const TriangleM<M>& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const TriangleM<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersectEdge(ray,k,tri.v0,tri.e1,tri.e2,UVIdentity<M>(),Occluded1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
diff --git a/thirdparty/embree/kernels/geometry/triangle_intersector_moeller.h b/thirdparty/embree/kernels/geometry/triangle_intersector_moeller.h
index 0a42d8f08b..87bf0cd069 100644
--- a/thirdparty/embree/kernels/geometry/triangle_intersector_moeller.h
+++ b/thirdparty/embree/kernels/geometry/triangle_intersector_moeller.h
@@ -77,18 +77,18 @@ namespace embree
{
/* calculate denominator */
vbool<M> valid = valid0;
+
const Vec3vf<M> O = Vec3vf<M>((Vec3fa)ray.org);
const Vec3vf<M> D = Vec3vf<M>((Vec3fa)ray.dir);
const Vec3vf<M> C = Vec3vf<M>(tri_v0) - O;
const Vec3vf<M> R = cross(C,D);
const vfloat<M> den = dot(Vec3vf<M>(tri_Ng),D);
-
const vfloat<M> absDen = abs(den);
const vfloat<M> sgnDen = signmsk(den);
-
+
/* perform edge tests */
- const vfloat<M> U = dot(R,Vec3vf<M>(tri_e2)) ^ sgnDen;
- const vfloat<M> V = dot(R,Vec3vf<M>(tri_e1)) ^ sgnDen;
+ const vfloat<M> U = asFloat(asInt(dot(R,Vec3vf<M>(tri_e2))) ^ asInt(sgnDen));
+ const vfloat<M> V = asFloat(asInt(dot(R,Vec3vf<M>(tri_e1))) ^ asInt(sgnDen));
/* perform backface culling */
#if defined(EMBREE_BACKFACE_CULLING)
@@ -99,14 +99,15 @@ namespace embree
if (likely(early_out && none(valid))) return false;
/* perform depth test */
- const vfloat<M> T = dot(Vec3vf<M>(tri_Ng),C) ^ sgnDen;
+ const vfloat<M> T = asFloat(asInt(dot(Vec3vf<M>(tri_Ng),C)) ^ asInt(sgnDen));
+
valid &= (absDen*vfloat<M>(ray.tnear()) < T) & (T <= absDen*vfloat<M>(ray.tfar));
if (likely(early_out && none(valid))) return false;
/* update hit information */
new (&hit) MoellerTrumboreHitM<M,UVMapper>(valid,U,V,T,absDen,tri_Ng,mapUV);
- return true;
+ return early_out || any(valid);
}
template<typename UVMapper>
@@ -320,8 +321,7 @@ namespace embree
const Vec3vf<K> Ng = cross(e2,e1);
return intersectK(valid0,ray.org,ray.dir,ray.tnear(),ray.tfar,tri_v0,e1,e2,Ng,mapUV,hit);
}
-
-
+
/*! Intersects K rays with one of M triangles. */
template<typename UVMapper, typename Epilog>
__forceinline vbool<K> intersectK(const vbool<K>& valid0,
diff --git a/thirdparty/embree/kernels/geometry/triangle_intersector_pluecker.h b/thirdparty/embree/kernels/geometry/triangle_intersector_pluecker.h
index 8fbefcea88..e21f1fa4c8 100644
--- a/thirdparty/embree/kernels/geometry/triangle_intersector_pluecker.h
+++ b/thirdparty/embree/kernels/geometry/triangle_intersector_pluecker.h
@@ -78,7 +78,7 @@ namespace embree
/* calculate vertices relative to ray origin */
const Vec3vf<M> O = Vec3vf<M>((Vec3fa)ray.org);
- const Vec3vf<M> D = Vec3vf<M>((Vec3fa)ray.dir);
+ const Vec3vf<M> D = Vec3vf<M>((Vec3fa)ray.dir);
const Vec3vf<M> v0 = tri_v0-O;
const Vec3vf<M> v1 = tri_v1-O;
const Vec3vf<M> v2 = tri_v2-O;
@@ -114,7 +114,7 @@ namespace embree
/* update hit information */
new (&hit) PlueckerHitM<M,UVMapper>(valid,U,V,UVW,t,Ng,mapUV);
- return true;
+ return early_out || any(valid);
}
template<typename UVMapper>
diff --git a/thirdparty/embree/kernels/geometry/triangle_intersector_woop.h b/thirdparty/embree/kernels/geometry/triangle_intersector_woop.h
index f05dcc4537..03d23adc3d 100644
--- a/thirdparty/embree/kernels/geometry/triangle_intersector_woop.h
+++ b/thirdparty/embree/kernels/geometry/triangle_intersector_woop.h
@@ -64,7 +64,7 @@ namespace embree
kx = (kz+1) % 3;
ky = (kx+1) % 3;
const float inv_dir_kz = rcp(ray.dir[kz]);
- if (ray.dir[kz]) std::swap(kx,ky);
+ if (ray.dir[kz] < 0.0f) std::swap(kx,ky);
S.x = ray.dir[kx] * inv_dir_kz;
S.y = ray.dir[ky] * inv_dir_kz;
S.z = inv_dir_kz;
diff --git a/thirdparty/embree/kernels/geometry/trianglei_intersector.h b/thirdparty/embree/kernels/geometry/trianglei_intersector.h
index f7deb9e72d..fa7f3ae43d 100644
--- a/thirdparty/embree/kernels/geometry/trianglei_intersector.h
+++ b/thirdparty/embree/kernels/geometry/trianglei_intersector.h
@@ -18,14 +18,14 @@ namespace embree
typedef TriangleMi<M> Primitive;
typedef MoellerTrumboreIntersector1<M> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
pre.intersect(ray,v0,v1,v2,Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
@@ -45,7 +45,7 @@ namespace embree
typedef TriangleMi<M> Primitive;
typedef MoellerTrumboreIntersectorK<M,K> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
const Scene* scene = context->scene;
for (size_t i=0; i<Primitive::max_size(); i++)
@@ -59,7 +59,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
vbool<K> valid0 = valid_i;
const Scene* scene = context->scene;
@@ -77,14 +77,14 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
pre.intersect(ray,k,v0,v1,v2,Intersect1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
@@ -99,14 +99,14 @@ namespace embree
typedef TriangleMi<M> Primitive;
typedef PlueckerIntersector1<M> Precalculations;
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
pre.intersect(ray,v0,v1,v2,Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
@@ -126,7 +126,7 @@ namespace embree
typedef TriangleMi<M> Primitive;
typedef PlueckerIntersectorK<M,K> Precalculations;
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
const Scene* scene = context->scene;
for (size_t i=0; i<Primitive::max_size(); i++)
@@ -140,7 +140,7 @@ namespace embree
}
}
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
vbool<K> valid0 = valid_i;
const Scene* scene = context->scene;
@@ -158,14 +158,14 @@ namespace embree
return !valid0;
}
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
pre.intersect(ray,k,v0,v1,v2,Intersect1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
}
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0, v1, v2; tri.gather(v0,v1,v2,context->scene);
@@ -181,7 +181,7 @@ namespace embree
typedef MoellerTrumboreIntersector1<M> Precalculations;
/*! Intersect a ray with the M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time());
@@ -189,7 +189,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time());
@@ -210,7 +210,7 @@ namespace embree
typedef MoellerTrumboreIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const TriangleMi<M>& tri)
{
for (size_t i=0; i<TriangleMi<M>::max_size(); i++)
{
@@ -222,7 +222,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const TriangleMi<M>& tri)
{
vbool<K> valid0 = valid_i;
for (size_t i=0; i<TriangleMi<M>::max_size(); i++)
@@ -237,7 +237,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const TriangleMi<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time()[k]);
@@ -245,7 +245,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const TriangleMi<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time()[k]);
@@ -261,7 +261,7 @@ namespace embree
typedef PlueckerIntersector1<M> Precalculations;
/*! Intersect a ray with the M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time());
@@ -269,7 +269,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time());
@@ -290,7 +290,7 @@ namespace embree
typedef PlueckerIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const TriangleMi<M>& tri)
{
for (size_t i=0; i<TriangleMi<M>::max_size(); i++)
{
@@ -302,7 +302,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const TriangleMi<M>& tri)
{
vbool<K> valid0 = valid_i;
for (size_t i=0; i<TriangleMi<M>::max_size(); i++)
@@ -317,7 +317,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const TriangleMi<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time()[k]);
@@ -325,7 +325,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const TriangleMi<M>& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const TriangleMi<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
Vec3vf<M> v0,v1,v2; tri.gather(v0,v1,v2,context->scene,ray.time()[k]);
diff --git a/thirdparty/embree/kernels/geometry/trianglev_intersector.h b/thirdparty/embree/kernels/geometry/trianglev_intersector.h
index 3abb7f8e32..0575bad388 100644
--- a/thirdparty/embree/kernels/geometry/trianglev_intersector.h
+++ b/thirdparty/embree/kernels/geometry/trianglev_intersector.h
@@ -20,14 +20,14 @@ namespace embree
typedef MoellerTrumboreIntersector1<M> Precalculations;
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,tri.v0,tri.v1,tri.v2,/*UVIdentity<M>(),*/Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersect(ray,tri.v0,tri.v1,tri.v2,/*UVIdentity<M>(),*/Occluded1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
@@ -48,14 +48,14 @@ namespace embree
typedef WoopPrecalculations1<M> Precalculations;
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
intersec::intersect(ray,pre,tri.v0,tri.v1,tri.v2,Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return intersec::intersect(ray,pre,tri.v0,tri.v1,tri.v2,Occluded1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
@@ -76,7 +76,7 @@ namespace embree
typedef MoellerTrumboreIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
for (size_t i=0; i<M; i++)
{
@@ -90,7 +90,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
vbool<K> valid0 = valid_i;
@@ -108,14 +108,14 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,k,tri.v0,tri.v1,tri.v2,/*UVIdentity<M>(),*/Intersect1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID())); //FIXME: M
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersect(ray,k,tri.v0,tri.v1,tri.v2,/*UVIdentity<M>(),*/Occluded1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID())); //FIXME: M
@@ -130,14 +130,14 @@ namespace embree
typedef PlueckerIntersector1<M> Precalculations;
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHit& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHit& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,tri.v0,tri.v1,tri.v2,UVIdentity<M>(),Intersect1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersect(ray,tri.v0,tri.v1,tri.v2,UVIdentity<M>(),Occluded1EpilogM<M,filter>(ray,context,tri.geomID(),tri.primID()));
@@ -157,7 +157,7 @@ namespace embree
typedef PlueckerIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
for (size_t i=0; i<M; i++)
{
@@ -171,7 +171,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const Primitive& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const Primitive& tri)
{
vbool<K> valid0 = valid_i;
@@ -189,14 +189,14 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(normal.trav_prims,1,1,1);
pre.intersect(ray,k,tri.v0,tri.v1,tri.v2,UVIdentity<M>(),Intersect1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const Primitive& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const Primitive& tri)
{
STAT3(shadow.trav_prims,1,1,1);
return pre.intersect(ray,k,tri.v0,tri.v1,tri.v2,UVIdentity<M>(),Occluded1KEpilogM<M,K,filter>(ray,k,context,tri.geomID(),tri.primID()));
diff --git a/thirdparty/embree/kernels/geometry/trianglev_mb.h b/thirdparty/embree/kernels/geometry/trianglev_mb.h
index b550a29fd5..c15313f209 100644
--- a/thirdparty/embree/kernels/geometry/trianglev_mb.h
+++ b/thirdparty/embree/kernels/geometry/trianglev_mb.h
@@ -113,7 +113,6 @@ namespace embree
BBox3fa bounds0 = empty;
BBox3fa bounds1 = empty;
-
for (size_t i=0; i<M && begin<end; i++, begin++)
{
const PrimRef& prim = prims[begin];
@@ -121,12 +120,12 @@ namespace embree
const unsigned primID = prim.primID();
const TriangleMesh* __restrict__ const mesh = scene->get<TriangleMesh>(geomID);
const TriangleMesh::Triangle& tri = mesh->triangle(primID);
- const Vec3fa& a0 = mesh->vertex(tri.v[0],itime+0); bounds0.extend(a0);
- const Vec3fa& a1 = mesh->vertex(tri.v[0],itime+1); bounds1.extend(a1);
- const Vec3fa& b0 = mesh->vertex(tri.v[1],itime+0); bounds0.extend(b0);
- const Vec3fa& b1 = mesh->vertex(tri.v[1],itime+1); bounds1.extend(b1);
- const Vec3fa& c0 = mesh->vertex(tri.v[2],itime+0); bounds0.extend(c0);
- const Vec3fa& c1 = mesh->vertex(tri.v[2],itime+1); bounds1.extend(c1);
+ const Vec3fa& a0 = mesh->vertex(tri.v[0],size_t(itime+0)); bounds0.extend(a0);
+ const Vec3fa& a1 = mesh->vertex(tri.v[0],size_t(itime+1)); bounds1.extend(a1);
+ const Vec3fa& b0 = mesh->vertex(tri.v[1],size_t(itime+0)); bounds0.extend(b0);
+ const Vec3fa& b1 = mesh->vertex(tri.v[1],size_t(itime+1)); bounds1.extend(b1);
+ const Vec3fa& c0 = mesh->vertex(tri.v[2],size_t(itime+0)); bounds0.extend(c0);
+ const Vec3fa& c1 = mesh->vertex(tri.v[2],size_t(itime+1)); bounds1.extend(c1);
vgeomID [i] = geomID;
vprimID [i] = primID;
va0.x[i] = a0.x; va0.y[i] = a0.y; va0.z[i] = a0.z;
@@ -159,12 +158,12 @@ namespace embree
const int ilower = itime_range.begin();
const TriangleMesh::Triangle& tri = mesh->triangle(primID);
allBounds.extend(mesh->linearBounds(primID, time_range));
- const Vec3fa& a0 = mesh->vertex(tri.v[0],ilower+0);
- const Vec3fa& a1 = mesh->vertex(tri.v[0],ilower+1);
- const Vec3fa& b0 = mesh->vertex(tri.v[1],ilower+0);
- const Vec3fa& b1 = mesh->vertex(tri.v[1],ilower+1);
- const Vec3fa& c0 = mesh->vertex(tri.v[2],ilower+0);
- const Vec3fa& c1 = mesh->vertex(tri.v[2],ilower+1);
+ const Vec3fa& a0 = mesh->vertex(tri.v[0],size_t(ilower+0));
+ const Vec3fa& a1 = mesh->vertex(tri.v[0],size_t(ilower+1));
+ const Vec3fa& b0 = mesh->vertex(tri.v[1],size_t(ilower+0));
+ const Vec3fa& b1 = mesh->vertex(tri.v[1],size_t(ilower+1));
+ const Vec3fa& c0 = mesh->vertex(tri.v[2],size_t(ilower+0));
+ const Vec3fa& c1 = mesh->vertex(tri.v[2],size_t(ilower+1));
const BBox1f time_range_v(mesh->timeStep(ilower+0),mesh->timeStep(ilower+1));
auto a01 = globalLinear(std::make_pair(a0,a1),time_range_v);
auto b01 = globalLinear(std::make_pair(b0,b1),time_range_v);
diff --git a/thirdparty/embree/kernels/geometry/trianglev_mb_intersector.h b/thirdparty/embree/kernels/geometry/trianglev_mb_intersector.h
index 38cd52e85d..c9042ba323 100644
--- a/thirdparty/embree/kernels/geometry/trianglev_mb_intersector.h
+++ b/thirdparty/embree/kernels/geometry/trianglev_mb_intersector.h
@@ -18,7 +18,7 @@ namespace embree
typedef MoellerTrumboreIntersector1<M> Precalculations;
/*! Intersect a ray with the M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time());
@@ -29,7 +29,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time());
@@ -53,7 +53,7 @@ namespace embree
typedef MoellerTrumboreIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
for (size_t i=0; i<TriangleMvMB<M>::max_size(); i++)
{
@@ -68,7 +68,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
vbool<K> valid0 = valid_i;
@@ -87,7 +87,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time()[k]);
@@ -98,7 +98,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time()[k]);
@@ -117,7 +117,7 @@ namespace embree
typedef PlueckerIntersector1<M> Precalculations;
/*! Intersect a ray with the M triangles and updates the hit. */
- static __forceinline void intersect(const Precalculations& pre, RayHit& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(const Precalculations& pre, RayHit& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time());
@@ -128,7 +128,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of M triangles. */
- static __forceinline bool occluded(const Precalculations& pre, Ray& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline bool occluded(const Precalculations& pre, Ray& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time());
@@ -152,7 +152,7 @@ namespace embree
typedef PlueckerIntersectorK<M,K> Precalculations;
/*! Intersects K rays with M triangles. */
- static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(const vbool<K>& valid_i, Precalculations& pre, RayHitK<K>& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
for (size_t i=0; i<TriangleMvMB<M>::max_size(); i++)
{
@@ -167,7 +167,7 @@ namespace embree
}
/*! Test for K rays if they are occluded by any of the M triangles. */
- static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline vbool<K> occluded(const vbool<K>& valid_i, Precalculations& pre, RayK<K>& ray, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
vbool<K> valid0 = valid_i;
@@ -186,7 +186,7 @@ namespace embree
}
/*! Intersect a ray with M triangles and updates the hit. */
- static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline void intersect(Precalculations& pre, RayHitK<K>& ray, size_t k, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(normal.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time()[k]);
@@ -197,7 +197,7 @@ namespace embree
}
/*! Test if the ray is occluded by one of the M triangles. */
- static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, IntersectContext* context, const TriangleMvMB<M>& tri)
+ static __forceinline bool occluded(Precalculations& pre, RayK<K>& ray, size_t k, RayQueryContext* context, const TriangleMvMB<M>& tri)
{
STAT3(shadow.trav_prims,1,1,1);
const Vec3vf<M> time(ray.time()[k]);