diff options
Diffstat (limited to 'thirdparty/embree/kernels/builders/splitter.h')
-rw-r--r-- | thirdparty/embree/kernels/builders/splitter.h | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/thirdparty/embree/kernels/builders/splitter.h b/thirdparty/embree/kernels/builders/splitter.h index da89d0b178..3daf55e801 100644 --- a/thirdparty/embree/kernels/builders/splitter.h +++ b/thirdparty/embree/kernels/builders/splitter.h @@ -3,8 +3,11 @@ #pragma once +#if !defined(RTHWIF_STANDALONE) #include "../common/scene.h" -#include "../common/primref.h" +#endif + +#include "../builders/primref.h" namespace embree { @@ -15,6 +18,41 @@ namespace embree const size_t dim, const float pos, const Vec3fa (&v)[N+1], + BBox3fa& left_o, + BBox3fa& right_o) + { + BBox3fa left = empty, right = empty; + /* clip triangle to left and right box by processing all edges */ + for (size_t i=0; i<N; i++) + { + const Vec3fa &v0 = v[i]; + const Vec3fa &v1 = v[i+1]; + const float v0d = v0[dim]; + const float v1d = v1[dim]; + + if (v0d <= pos) left. extend(v0); // this point is on left side + if (v0d >= pos) right.extend(v0); // this point is on right side + + if ((v0d < pos && pos < v1d) || (v1d < pos && pos < v0d)) // the edge crosses the splitting location + { + assert((v1d-v0d) != 0.0f); + const float inv_length = 1.0f/(v1d-v0d); + const Vec3fa c = madd(Vec3fa((pos-v0d)*inv_length),v1-v0,v0); + left.extend(c); + right.extend(c); + } + } + + /* clip against current bounds */ + left_o = intersect(left,bounds); + right_o = intersect(right,bounds); + } + + template<size_t N> + __forceinline void splitPolygon(const BBox3fa& bounds, + const size_t dim, + const float pos, + const Vec3fa (&v)[N+1], const Vec3fa (&inv_length)[N], BBox3fa& left_o, BBox3fa& right_o) @@ -78,7 +116,9 @@ namespace embree new (&left_o ) PrimRef(intersect(left ,prim.bounds()),prim.geomID(), prim.primID()); new (&right_o) PrimRef(intersect(right,prim.bounds()),prim.geomID(), prim.primID()); } - + +#if !defined(RTHWIF_STANDALONE) + struct TriangleSplitter { __forceinline TriangleSplitter(const Scene* scene, const PrimRef& prim) @@ -173,6 +213,13 @@ namespace embree __forceinline DummySplitter(const Scene* scene, const PrimRef& prim) { } + + __forceinline void operator() (const PrimRef& prim, const size_t dim, const float pos, PrimRef& left_o, PrimRef& right_o) const { + } + + __forceinline void operator() (const BBox3fa& prim, const size_t dim, const float pos, BBox3fa& left_o, BBox3fa& right_o) const { + } + }; struct DummySplitterFactory @@ -187,7 +234,7 @@ namespace embree private: const Scene* scene; }; - +#endif } } |