summaryrefslogtreecommitdiffstats
path: root/thirdparty/embree/kernels/geometry/curveNi_intersector.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree/kernels/geometry/curveNi_intersector.h')
-rw-r--r--thirdparty/embree/kernels/geometry/curveNi_intersector.h113
1 files changed, 96 insertions, 17 deletions
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;
+ }
+ }
}
}