/* * @File Created: 2022-11-24, 20:13:58 * @Last Modified: 2022-11-26, 18:50:38 * @Author: forty-twoo * @Copyright (c) 2022, Caiyue Li(li_caiyue@zju.edu.cn), All rights reserved. */ #ifndef BVH_H_ #define BVH_H_ #include #include class BVH_AABB; //包围盒结构,存储盒子对角的两个点 typedef struct AABB { glm::vec3 Bmin, Bmax; AABB() { double minNum = std::numeric_limits::lowest(); double maxNum = std::numeric_limits::max(); Bmax = glm::vec3(minNum, minNum, minNum); Bmin = glm::vec3(maxNum, maxNum, maxNum); } void ShowAABB() { std::cout << "min_point (" << Bmin.x << ", " << Bmin.y << ", " << Bmin.z << ") , max_point (" << Bmax.x << ", " << Bmax.y << ", " << Bmax.z << ")\n"; } } AABB; // AABB包围盒的结点 typedef struct BVH_AABB_Node { AABB bound; //包围盒边界 std::vector> param; //此包围盒对应的每个参数的范围 std::vector childPtr; //把每个孩子结点指针存储到容器里 BVH_AABB *myBVH; //指向自己的BVH结构 } BVH_AABB_Node, *BVH_AABB_NodePtr; class BVH_AABB { public: unsigned int Hlevel; //递归层数 unsigned int BranchNum; //每个结点的分支数 [BranchNum=2:曲线 || BranchNum=4:曲面] tinynurbs::RationalCurve *NurbsCurvePtr = NULL; //指向该BVH对应的NurbsCurve的指针针 tinynurbs::RationalSurface *NurbsSurfacePtr = NULL; //指向该BVH对应的NurbsSurface的指针针 double sampleNum; //采样点数--越大包围盒构造越准确 BVH_AABB_NodePtr bvh_aabb_node = NULL; // bvh树的根指针 public: BVH_AABB(unsigned int Hlevel_, unsigned int BranchNum_, double sampleNum_, tinynurbs::RationalCurve NurbsCurve_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_) { bvh_aabb_node = new BVH_AABB_Node; NurbsCurvePtr = new tinynurbs::RationalCurve(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 NurbsSurface_) : Hlevel(Hlevel_), BranchNum(BranchNum_), sampleNum(sampleNum_) { bvh_aabb_node = new BVH_AABB_Node; NurbsSurfacePtr = new tinynurbs::RationalSurface(NurbsSurface_); std::cout << "BVH_AABB constructed correct, this is a bvh of NurbsSurface!\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 &curve, BVH_AABB_NodePtr &curNode, int curLevel, double t, double tstep); BVH_AABB_NodePtr Build_NurbsSurface(tinynurbs::RationalSurface &surface, BVH_AABB_NodePtr &curNode, int curLevel, double u, double v, double ustep, double vstep); }; #endif // !BVH_H_