// ======================================================================== // // Copyright 2009-2017 Intel Corporation // // // // Licensed under the Apache License, Version 2.0 (the "License"); // // you may not use this file except in compliance with the License. // // You may obtain a copy of the License at // // // // http://www.apache.org/licenses/LICENSE-2.0 // // // // Unless required by applicable law or agreed to in writing, software // // distributed under the License is distributed on an "AS IS" BASIS, // // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // // See the License for the specific language governing permissions and // // limitations under the License. // // ======================================================================== // #pragma once #include "default.h" #include "ray.h" #include "context.h" namespace embree { class Scene; /*! Base class for the acceleration structure data. */ class AccelData : public RefCount { public: enum Type { TY_UNKNOWN = 0, TY_ACCELN = 1, TY_ACCEL_INSTANCE = 2, TY_BVH4 = 3, TY_BVH8 = 4 }; public: AccelData (const Type type) : bounds(empty), type(type) {} /*! notifies the acceleration structure about the deletion of some geometry */ virtual void deleteGeometry(size_t geomID) {}; /*! clears the acceleration structure data */ virtual void clear() = 0; /*! returns normal bounds */ __forceinline BBox3fa getBounds() const { return bounds.bounds(); } /*! returns linear bounds */ __forceinline LBBox3fa getLinearBounds() const { return bounds; } public: LBBox3fa bounds; // linear bounds Type type; }; /*! Base class for all intersectable and buildable acceleration structures. */ class Accel : public AccelData { ALIGNED_CLASS; public: /*! Type of intersect function pointer for single rays. */ typedef void (*IntersectFunc)(void* ptr, /*!< pointer to user data */ RTCRay& ray, /*!< ray to intersect */ IntersectContext* context); /*! Type of intersect function pointer for ray packets of size 4. */ typedef void (*IntersectFunc4)(const void* valid, /*!< pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay4& ray, /*!< ray packet to intersect */ IntersectContext* context); /*! Type of intersect function pointer for ray packets of size 8. */ typedef void (*IntersectFunc8)(const void* valid, /*!< pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay8& ray, /*!< ray packet to intersect */ IntersectContext* context); /*! Type of intersect function pointer for ray packets of size 16. */ typedef void (*IntersectFunc16)(const void* valid, /*!< pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay16& ray, /*!< ray packet to intersect */ IntersectContext* context); /*! Type of intersect function pointer for ray packets of size N. */ typedef void (*IntersectFuncN)(void* ptr, /*!< pointer to user data */ RTCRay** ray, /*!< ray stream to intersect */ const size_t N, /*!< number of rays in stream */ IntersectContext* context /*!< layout flags */); /*! Type of occlusion function pointer for single rays. */ typedef void (*OccludedFunc) (void* ptr, /*!< pointer to user data */ RTCRay& ray, /*!< ray to test occlusion */ IntersectContext* context); /*! Type of occlusion function pointer for ray packets of size 4. */ typedef void (*OccludedFunc4) (const void* valid, /*! pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay4& ray, /*!< Ray packet to test occlusion. */ IntersectContext* context); /*! Type of occlusion function pointer for ray packets of size 8. */ typedef void (*OccludedFunc8) (const void* valid, /*! pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay8& ray, /*!< Ray packet to test occlusion. */ IntersectContext* context); /*! Type of occlusion function pointer for ray packets of size 16. */ typedef void (*OccludedFunc16) (const void* valid, /*! pointer to valid mask */ void* ptr, /*!< pointer to user data */ RTCRay16& ray, /*!< Ray packet to test occlusion. */ IntersectContext* context); /*! Type of intersect function pointer for ray packets of size N. */ typedef void (*OccludedFuncN)(void* ptr, /*!< pointer to user data */ RTCRay** ray, /*!< ray stream to intersect */ const size_t N, /*!< number of rays in stream */ IntersectContext* context /*!< layout flags */); typedef void (*ErrorFunc) (); struct Intersector1 { Intersector1 (ErrorFunc error = nullptr) : intersect((IntersectFunc)error), occluded((OccludedFunc)error), name(nullptr) {} Intersector1 (IntersectFunc intersect, OccludedFunc occluded, const char* name) : intersect(intersect), occluded(occluded), name(name) {} operator bool() const { return name; } public: static const char* type; IntersectFunc intersect; OccludedFunc occluded; const char* name; }; struct Intersector4 { Intersector4 (ErrorFunc error = nullptr) : intersect((IntersectFunc4)error), occluded((OccludedFunc4)error), name(nullptr) {} Intersector4 (IntersectFunc4 intersect, OccludedFunc4 occluded, const char* name) : intersect(intersect), occluded(occluded), name(name) {} operator bool() const { return name; } public: static const char* type; IntersectFunc4 intersect; OccludedFunc4 occluded; const char* name; }; struct Intersector8 { Intersector8 (ErrorFunc error = nullptr) : intersect((IntersectFunc8)error), occluded((OccludedFunc8)error), name(nullptr) {} Intersector8 (IntersectFunc8 intersect, OccludedFunc8 occluded, const char* name) : intersect(intersect), occluded(occluded), name(name) {} operator bool() const { return name; } public: static const char* type; IntersectFunc8 intersect; OccludedFunc8 occluded; const char* name; }; struct Intersector16 { Intersector16 (ErrorFunc error = nullptr) : intersect((IntersectFunc16)error), occluded((OccludedFunc16)error), name(nullptr) {} Intersector16 (IntersectFunc16 intersect, OccludedFunc16 occluded, const char* name) : intersect(intersect), occluded(occluded), name(name) {} operator bool() const { return name; } public: static const char* type; IntersectFunc16 intersect; OccludedFunc16 occluded; const char* name; }; struct IntersectorN { IntersectorN (ErrorFunc error = nullptr) : intersect((IntersectFuncN)error), occluded((OccludedFuncN)error), name(nullptr) {} IntersectorN (IntersectFuncN intersect, OccludedFuncN occluded, const char* name) : intersect(intersect), occluded(occluded), name(name) {} operator bool() const { return name; } public: static const char* type; IntersectFuncN intersect; OccludedFuncN occluded; const char* name; }; struct Intersectors { Intersectors() : ptr(nullptr) {} Intersectors (ErrorFunc error) : ptr(nullptr), intersector1(error), intersector4(error), intersector8(error), intersector16(error), intersectorN(error) {} void print(size_t ident) { if (intersector1.name) { for (size_t i=0; i