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.

53 lines
1.9 KiB

#ifndef BVH_H_
#define BVH_H_
2 years ago
#include <iostream>
#include <tinynurbs/tinynurbs.h>
//包围盒结构,存储盒子对角的两个点
typedef struct AABB
{
2 years ago
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
{
2 years ago
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:
2 years ago
unsigned int Hlevel; //递归层数
unsigned int BranchNum; //每个结点的分支数 [BranchNum=2:曲线 || BranchNum=4:曲面]
double sampleNum; //采样点数--越大包围盒构造越准确
BVH_AABB_NodePtr bvh_aabb_node = NULL; // bvh树的根指针
public:
2 years ago
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;
};
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);
AABB &UnionBound(const AABB &a, const AABB &b);
AABB &UpdateBound(const AABB &bound, const glm::vec3 &p);
};
#endif // !BVH_H_