You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.9 KiB
52 lines
1.9 KiB
#ifndef BVH_H_
|
|
#define BVH_H_
|
|
|
|
#include <iostream>
|
|
#include <tinynurbs/tinynurbs.h>
|
|
|
|
//包围盒结构,存储盒子对角的两个点
|
|
typedef struct AABB
|
|
{
|
|
glm::vec3 Bmin, Bmax;
|
|
AABB()
|
|
{
|
|
double minNum = std::numeric_limits<double>::lowest();
|
|
double maxNum = std::numeric_limits<double>::max();
|
|
Bmax = glm::vec3(minNum, minNum, minNum);
|
|
Bmin = glm::vec3(maxNum, maxNum, maxNum);
|
|
}
|
|
} AABB;
|
|
|
|
// AABB包围盒的结点
|
|
typedef struct BVH_AABB_Node
|
|
{
|
|
AABB bound; //包围盒边界
|
|
std::vector<std::pair<double, double>> param; //此包围盒对应的每个参数的范围
|
|
std::vector<struct BVH_AABB_Node *> childPtr; //把每个孩子结点指针存储到容器里
|
|
} BVH_AABB_Node, *BVH_AABB_NodePtr;
|
|
|
|
class BVH_AABB
|
|
{
|
|
public:
|
|
unsigned int Hlevel; //递归层数
|
|
unsigned int BranchNum; //每个结点的分支数 [BranchNum=2:曲线 || BranchNum=4:曲面]
|
|
double sampleNum; //采样点数--越大包围盒构造越准确
|
|
BVH_AABB_NodePtr bvh_aabb_node = NULL; // bvh树的根指针
|
|
|
|
public:
|
|
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
|
|
{
|
|
bvh_aabb_node = new BVH_AABB_Node;
|
|
std::cout << "BVH_AABB constructed correct!\n";
|
|
};
|
|
BVH_AABB_Node *GetNode() const
|
|
{
|
|
return bvh_aabb_node;
|
|
};
|
|
AABB UnionBound(const AABB &a, const AABB &b);
|
|
AABB UpdateBound(const AABB &bound, const glm::vec3 &p);
|
|
BVH_AABB_NodePtr Build_NurbsCurve(tinynurbs::RationalCurve<double> &curve, BVH_AABB_NodePtr &curNode, int curLevel, double t, double tstep);
|
|
BVH_AABB_NodePtr Build_NurbsSurface(tinynurbs::RationalSurface<double> &surface, BVH_AABB_NodePtr &curNode, int curLevel, double u, double v, double ustep, double vstep);
|
|
};
|
|
|
|
#endif // !BVH_H_
|
|
|