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.

77 lines
3.2 KiB

/*
* @File Created: 2022-11-24, 20:13:58
* @Last Modified: 2022-11-26, 18:45:16
* @Author: forty-twoo
* Copyright (c) 2022, Caiyue Li (li_caiyue@zju.edu.cn), All rights reserved.
*/
#ifndef BVH_H_
#define BVH_H_
2 years ago
#include <iostream>
#include <tinynurbs/tinynurbs.h>
2 years ago
class BVH_AABB;
//包围盒结构,存储盒子对角的两个点
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);
}
2 years ago
void ShowAABB()
{
std::cout << "min_point (" << Bmin.x << ", " << Bmin.y << ", " << Bmin.z << ") , max_point (" << Bmax.x << ", "
<< Bmax.y << ", " << Bmax.z << ")\n";
}
2 years ago
} 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; //把每个孩子结点指针存储到容器里
2 years ago
BVH_AABB *myBVH; //指向自己的BVH结构
2 years ago
} BVH_AABB_Node, *BVH_AABB_NodePtr;
class BVH_AABB
{
public:
2 years ago
unsigned int Hlevel; //递归层数
unsigned int BranchNum; //每个结点的分支数 [BranchNum=2:曲线 || BranchNum=4:曲面]
tinynurbs::RationalCurve<double> *NurbsCurvePtr = NULL; //指向该BVH对应的NurbsCurve的指针针
tinynurbs::RationalSurface<double> *NurbsSurfacePtr = NULL; //指向该BVH对应的NurbsSurface的指针针
double sampleNum; //采样点数--越大包围盒构造越准确
BVH_AABB_NodePtr bvh_aabb_node = NULL; // bvh树的根指针
public:
2 years ago
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_, tinynurbs::RationalCurve<double> NurbsCurve_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
2 years ago
{
bvh_aabb_node = new BVH_AABB_Node;
2 years ago
NurbsCurvePtr = new tinynurbs::RationalCurve<double>(NurbsCurve_);
std::cout << "BVH_AABB constructed correct, this is a bvh of NurbsCurve!\n";
};
BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_, tinynurbs::RationalSurface<double> NurbsSurface_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_)
{
bvh_aabb_node = new BVH_AABB_Node;
NurbsSurfacePtr = new tinynurbs::RationalSurface<double>(NurbsSurface_);
std::cout << "BVH_AABB constructed correct, this is a bvh of NurbsSurface!\n";
2 years ago
};
BVH_AABB_Node *GetNode() const
{
return bvh_aabb_node;
};
2 years ago
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_