00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _LUXRAYS_MQBVHACCEL_H
00023 #define _LUXRAYS_MQBVHACCEL_H
00024
00025 #include <string.h>
00026 #include <xmmintrin.h>
00027 #include <boost/cstdint.hpp>
00028
00029 #include "luxrays/luxrays.h"
00030 #include "luxrays/core/acceleretor.h"
00031 #include "luxrays/accelerators/qbvhaccel.h"
00032
00033 using boost::int32_t;
00034
00035 namespace luxrays {
00036
00037 class MQBVHAccel : public Accelerator {
00038 public:
00039 MQBVHAccel(const Context *context, u_int fst, u_int sf);
00040 ~MQBVHAccel();
00041
00042 BBox WorldBound() const;
00043
00044 AcceleratorType GetType() const { return ACCEL_QBVH; }
00045 void Init(const std::deque<Mesh *> &meshes, const unsigned int totalVertexCount,
00046 const unsigned int totalTriangleCount);
00047
00048 const TriangleMeshID GetMeshID(const unsigned int index) const { return meshIDs[index]; }
00049 const TriangleMeshID *GetMeshIDTable() const { return meshIDs; }
00050 const TriangleID GetMeshTriangleID(const unsigned int index) const { return meshTriangleIDs[index]; }
00051 const TriangleID *GetMeshTriangleIDTable() const { return meshTriangleIDs; }
00052
00053 bool Intersect(const Ray *ray, RayHit *hit) const;
00054
00055 void Update();
00056
00057 friend class OpenCLIntersectionDevice;
00058
00059 private:
00060 static bool MeshPtrCompare(Mesh *, Mesh *);
00061
00062 void BuildTree(u_int start, u_int end, u_int *primsIndexes,
00063 BBox *primsBboxes, Point *primsCentroids, const BBox &nodeBbox,
00064 const BBox ¢roidsBbox, int32_t parentIndex, int32_t childIndex,
00065 int depth);
00066
00067 void CreateLeaf(int32_t parentIndex, int32_t childIndex,
00068 u_int start, const BBox &nodeBbox);
00069
00070 int32_t CreateNode(int32_t parentIndex, int32_t childIndex, const BBox &nodeBbox);
00071
00072 std::deque<Mesh *> meshList;
00073
00074 QBVHNode *nodes;
00075 u_int nNodes, maxNodes;
00076 BBox worldBound;
00077
00078 u_int fullSweepThreshold;
00079 u_int skipFactor;
00080
00081 u_int nLeafs;
00082 std::map<Mesh *, QBVHAccel *, bool (*)(Mesh *, Mesh *)> accels;
00083 QBVHAccel **leafs;
00084 const Transform **leafsInvTransform;
00085 unsigned int *leafsOffset;
00086 TriangleMeshID *meshIDs;
00087 TriangleID *meshTriangleIDs;
00088
00089 const Context *ctx;
00090 bool initialized;
00091 };
00092
00093 }
00094
00095 #endif