summaryrefslogtreecommitdiffstats
path: root/thirdparty/embree/kernels/common/geometry.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree/kernels/common/geometry.h')
-rw-r--r--thirdparty/embree/kernels/common/geometry.h107
1 files changed, 94 insertions, 13 deletions
diff --git a/thirdparty/embree/kernels/common/geometry.h b/thirdparty/embree/kernels/common/geometry.h
index 593990f5b1..00e3c5ede3 100644
--- a/thirdparty/embree/kernels/common/geometry.h
+++ b/thirdparty/embree/kernels/common/geometry.h
@@ -8,6 +8,7 @@
#include "buffer.h"
#include "../common/point_query.h"
#include "../builders/priminfo.h"
+#include "../builders/priminfo_mb.h"
namespace embree
{
@@ -26,12 +27,14 @@ namespace embree
numUserGeometries(0), numMBUserGeometries(0),
numInstancesCheap(0), numMBInstancesCheap(0),
numInstancesExpensive(0), numMBInstancesExpensive(0),
- numGrids(0), numMBGrids(0),
+ numInstanceArrays(0), numMBInstanceArrays(0),
+ numGrids(0), numMBGrids(0),
+ numSubGrids(0), numMBSubGrids(0),
numPoints(0), numMBPoints(0) {}
__forceinline size_t size() const {
- return numTriangles + numQuads + numBezierCurves + numLineSegments + numSubdivPatches + numUserGeometries + numInstancesCheap + numInstancesExpensive + numGrids + numPoints
- + numMBTriangles + numMBQuads + numMBBezierCurves + numMBLineSegments + numMBSubdivPatches + numMBUserGeometries + numMBInstancesCheap + numMBInstancesExpensive + numMBGrids + numMBPoints;
+ return numTriangles + numQuads + numBezierCurves + numLineSegments + numSubdivPatches + numUserGeometries + numInstancesCheap + numInstancesExpensive + numInstanceArrays + numGrids + numPoints
+ + numMBTriangles + numMBQuads + numMBBezierCurves + numMBLineSegments + numMBSubdivPatches + numMBUserGeometries + numMBInstancesCheap + numMBInstancesExpensive + numMBInstanceArrays + numMBGrids + numMBPoints;
}
__forceinline unsigned int enabledGeometryTypesMask() const
@@ -44,8 +47,9 @@ namespace embree
if (numUserGeometries) mask |= 1 << 4;
if (numInstancesCheap) mask |= 1 << 5;
if (numInstancesExpensive) mask |= 1 << 6;
- if (numGrids) mask |= 1 << 7;
- if (numPoints) mask |= 1 << 8;
+ if (numInstanceArrays) mask |= 1 << 7;
+ if (numGrids) mask |= 1 << 8;
+ if (numPoints) mask |= 1 << 9;
unsigned int maskMB = 0;
if (numMBTriangles) maskMB |= 1 << 0;
@@ -55,8 +59,9 @@ namespace embree
if (numMBUserGeometries) maskMB |= 1 << 4;
if (numMBInstancesCheap) maskMB |= 1 << 5;
if (numMBInstancesExpensive) maskMB |= 1 << 6;
- if (numMBGrids) maskMB |= 1 << 7;
- if (numMBPoints) maskMB |= 1 << 8;
+ if (numMBInstanceArrays) maskMB |= 1 << 7;
+ if (numMBGrids) maskMB |= 1 << 8;
+ if (numMBPoints) maskMB |= 1 << 9;
return (mask<<8) + maskMB;
}
@@ -81,8 +86,12 @@ namespace embree
ret.numMBInstancesCheap = numMBInstancesCheap + rhs.numMBInstancesCheap;
ret.numInstancesExpensive = numInstancesExpensive + rhs.numInstancesExpensive;
ret.numMBInstancesExpensive = numMBInstancesExpensive + rhs.numMBInstancesExpensive;
+ ret.numInstanceArrays = numInstanceArrays + rhs.numInstanceArrays;
+ ret.numMBInstanceArrays = numMBInstanceArrays + rhs.numMBInstanceArrays;
ret.numGrids = numGrids + rhs.numGrids;
ret.numMBGrids = numMBGrids + rhs.numMBGrids;
+ ret.numSubGrids = numSubGrids + rhs.numSubGrids;
+ ret.numMBSubGrids = numMBSubGrids + rhs.numMBSubGrids;
ret.numPoints = numPoints + rhs.numPoints;
ret.numMBPoints = numMBPoints + rhs.numMBPoints;
@@ -106,8 +115,12 @@ namespace embree
size_t numMBInstancesCheap; //!< number of enabled motion blurred cheap instances
size_t numInstancesExpensive; //!< number of enabled expensive instances
size_t numMBInstancesExpensive; //!< number of enabled motion blurred expensive instances
+ size_t numInstanceArrays; //!< number of enabled instance arrays
+ size_t numMBInstanceArrays; //!< number of enabled motion blurred instance arrays
size_t numGrids; //!< number of enabled grid geometries
size_t numMBGrids; //!< number of enabled motion blurred grid geometries
+ size_t numSubGrids; //!< number of enabled grid geometries
+ size_t numMBSubGrids; //!< number of enabled motion blurred grid geometries
size_t numPoints; //!< number of enabled points
size_t numMBPoints; //!< number of enabled motion blurred points
};
@@ -115,6 +128,8 @@ namespace embree
/*! Base class all geometries are derived from */
class Geometry : public RefCount
{
+ ALIGNED_CLASS_USM_(16);
+
friend class Scene;
public:
@@ -154,6 +169,7 @@ namespace embree
GTY_USER_GEOMETRY = 29,
GTY_INSTANCE_CHEAP = 30,
GTY_INSTANCE_EXPENSIVE = 31,
+ GTY_INSTANCE_ARRAY = 24,
GTY_END = 32,
GTY_BASIS_LINEAR = 0,
@@ -222,7 +238,10 @@ namespace embree
MTY_INSTANCE_CHEAP = 1ul << GTY_INSTANCE_CHEAP,
MTY_INSTANCE_EXPENSIVE = 1ul << GTY_INSTANCE_EXPENSIVE,
- MTY_INSTANCE = MTY_INSTANCE_CHEAP | MTY_INSTANCE_EXPENSIVE
+ MTY_INSTANCE = MTY_INSTANCE_CHEAP | MTY_INSTANCE_EXPENSIVE,
+ MTY_INSTANCE_ARRAY = 1ul << GTY_INSTANCE_ARRAY,
+
+ MTY_ALL = -1
};
static const char* gtype_names[GTY_END];
@@ -248,8 +267,13 @@ namespace embree
/*! tests if geometry is disabled */
__forceinline bool isDisabled() const { return !isEnabled(); }
+ /* checks if argument version of filter functions are enabled */
+ __forceinline bool hasArgumentFilterFunctions() const {
+ return argumentFilterEnabled;
+ }
+
/*! tests if that geometry has some filter function set */
- __forceinline bool hasFilterFunctions () const {
+ __forceinline bool hasGeometryFilterFunctions () const {
return (intersectionFilterN != nullptr) || (occlusionFilterN != nullptr);
}
@@ -265,6 +289,11 @@ namespace embree
/*! returns geometry type mask */
__forceinline GTypeMask getTypeMask() const { return (GTypeMask)(1 << gtype); }
+ /*! returns true of geometry contains motion blur */
+ __forceinline bool hasMotionBlur () const {
+ return numTimeSteps > 1;
+ }
+
/*! returns number of primitives */
__forceinline size_t size() const { return numPrimitives; }
@@ -277,6 +306,9 @@ namespace embree
/*! sets motion blur time range */
void setTimeRange (const BBox1f range);
+ /*! gets motion blur time range */
+ BBox1f getTimeRange () const;
+
/*! sets number of vertex attributes */
virtual void setVertexAttributeCount (unsigned int N) {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
@@ -447,6 +479,11 @@ namespace embree
/*! Set occlusion filter function for ray packets of size N. */
virtual void setOcclusionFilterFunctionN (RTCFilterFunctionN filterN);
+ /* Enables argument version of intersection or occlusion filter function. */
+ virtual void enableFilterFunctionFromArguments (bool enable) {
+ argumentFilterEnabled = enable;
+ }
+
/*! for instances only */
public:
@@ -455,6 +492,11 @@ namespace embree
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
}
+ /*! Sets the instanced scenes */
+ virtual void setInstancedScenes(const RTCScene* scenes, size_t numScenes) {
+ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
+ }
+
/*! Sets transformation of the instance */
virtual void setTransform(const AffineSpace3fa& transform, unsigned int timeStep) {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
@@ -467,7 +509,12 @@ namespace embree
/*! Returns the transformation of the instance */
virtual AffineSpace3fa getTransform(float time) {
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
+ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
+ }
+
+ /*! Returns the transformation of the instance */
+ virtual AffineSpace3fa getTransform(size_t instance, float time) {
+ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation not supported for this geometry");
}
/*! for user geometries only */
@@ -498,18 +545,47 @@ namespace embree
public:
- virtual PrimInfo createPrimRefArray(mvector<PrimRef>& prims, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ virtual PrimInfo createPrimRefArray(PrimRef* prims, const range<size_t>& r, size_t k, unsigned int geomID) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"createPrimRefArray not implemented for this geometry");
}
+ PrimInfo createPrimRefArray(mvector<PrimRef>& prims, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefArray(prims.data(),r,k,geomID);
+ }
+
+ PrimInfo createPrimRefArray(avector<PrimRef>& prims, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefArray(prims.data(),r,k,geomID);
+ }
+
+ virtual PrimInfo createPrimRefArray(mvector<PrimRef>& prims, mvector<SubGridBuildData>& sgrids, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefArray(prims,r,k,geomID);
+ }
+
virtual PrimInfo createPrimRefArrayMB(mvector<PrimRef>& prims, size_t itime, const range<size_t>& r, size_t k, unsigned int geomID) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"createPrimRefMBArray not implemented for this geometry");
}
+ /*! Calculates the PrimRef over the complete time interval */
+ virtual PrimInfo createPrimRefArrayMB(PrimRef* prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ throw_RTCError(RTC_ERROR_INVALID_OPERATION,"createPrimRefMBArray not implemented for this geometry");
+ }
+
+ PrimInfo createPrimRefArrayMB(mvector<PrimRef>& prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefArrayMB(prims.data(),t0t1,r,k,geomID);
+ }
+
+ PrimInfo createPrimRefArrayMB(avector<PrimRef>& prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefArrayMB(prims.data(),t0t1,r,k,geomID);
+ }
+
virtual PrimInfoMB createPrimRefMBArray(mvector<PrimRefMB>& prims, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"createPrimRefMBArray not implemented for this geometry");
}
+ virtual PrimInfoMB createPrimRefMBArray(mvector<PrimRefMB>& prims, mvector<SubGridBuildData>& sgrids, const BBox1f& t0t1, const range<size_t>& r, size_t k, unsigned int geomID) const {
+ return createPrimRefMBArray(prims,t0t1,r,k,geomID);
+ }
+
virtual LinearSpace3fa computeAlignedSpace(const size_t primID) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"computeAlignedSpace not implemented for this geometry");
}
@@ -541,6 +617,10 @@ namespace embree
virtual LBBox3fa vlinearBounds(size_t primID, const BBox1f& time_range) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"vlinearBounds not implemented for this geometry");
}
+
+ virtual LBBox3fa vlinearBounds(size_t primID, const BBox1f& time_range, const SubGridBuildData * const sgrids) const {
+ return vlinearBounds(primID,time_range);
+ }
virtual LBBox3fa vlinearBounds(const LinearSpace3fa& space, size_t primID, const BBox1f& time_range) const {
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"vlinearBounds not implemented for this geometry");
@@ -566,13 +646,14 @@ namespace embree
unsigned int mask; //!< for masking out geometry
unsigned int modCounter_ = 1; //!< counter for every modification - used to rebuild scenes when geo is modified
-
+
struct {
GType gtype : 8; //!< geometry type
GSubType gsubtype : 8; //!< geometry subtype
RTCBuildQuality quality : 3; //!< build quality for geometry
unsigned state : 2;
- bool enabled : 1; //!< true if geometry is enabled
+ bool enabled : 1; //!< true if geometry is enabled
+ bool argumentFilterEnabled : 1; //!< true if argument filter functions are enabled for this geometry
};
RTCFilterFunctionN intersectionFilterN;