diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj index b04115d..e12aa09 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj @@ -85,6 +85,7 @@ + @@ -110,6 +111,7 @@ + diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters index 2cc8f3c..ac95887 100644 --- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters +++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters @@ -58,6 +58,9 @@ Source Files + + Source Files + @@ -106,5 +109,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/ArchitectureColoredPainting/BvhTree.cpp b/ArchitectureColoredPainting/BvhTree.cpp new file mode 100644 index 0000000..13ad178 --- /dev/null +++ b/ArchitectureColoredPainting/BvhTree.cpp @@ -0,0 +1,63 @@ +#include "BvhTree.h" + +GLuint BvhTree::getBvhNodeNum() { + return tot; +} + +void BvhTree::buildBvhTree(QVector4D initBound[], int len) { + tot = 0; + root = subBvhTree(initBound, 0, len-1); +} + +QVector4D BvhTree::Union(QVector4D a, QVector4D b) { + return QVector4D( + std::min(a.x(), b.x()), + std::min(a.y(), b.y()), + std::max(a.z(), b.z()), + std::max(a.w(), b.w()) + ); +} + +QVector4D BvhTree::calcBound(QVector4D initBound[], int l, int r) { + QVector4D res = initBound[l]; + for (int i = l + 1; i < r; i++) { + res = Union(res, initBound[i]); + } + return res; +} + +bvhPtr BvhTree::subBvhTree(QVector4D initBound[], int l, int r) { + if (l > r) return NULL; + bvhPtr p(new BvhNode()); + p.get()->lab = tot++; + p.get()->bound = calcBound(initBound, l, r); + if (l == r) return p; + int dim = p.get()->maximumBound(); + if (dim == 0) { + std::sort(initBound + l, initBound + r, BvhNode::x_compare); + } else { + std::sort(initBound + l, initBound + r, BvhNode::y_compare); + } + int mid = (l + r) >> 1; + p.get()->child[0] = subBvhTree(initBound, l, mid); + p.get()->child[1] = subBvhTree(initBound, mid+1, r); + return p; +} + +void BvhTree::traverseBvhTree(bvhPtr now, std::vector& children, std::vector& bounds) { + if (now == NULL) return ; + if(now.get()->getSon(0) || now.get()->getSon(1)) { + children.push_back(now.get()->getSon(0)); + children.push_back(now.get()->getSon(1)); + } + bounds.push_back(now.get()->bound); + traverseBvhTree(now.get()->child[0], children, bounds); + traverseBvhTree(now.get()->child[1], children, bounds); + +} + +void BvhTree::getBvhArray(std::vector& children, std::vector& bounds) { + children.push_back(tot); + children.push_back(0); + traverseBvhTree(root, children, bounds); +} \ No newline at end of file diff --git a/ArchitectureColoredPainting/BvhTree.h b/ArchitectureColoredPainting/BvhTree.h new file mode 100644 index 0000000..1ccc0c6 --- /dev/null +++ b/ArchitectureColoredPainting/BvhTree.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define bvhPtr std::tr1::shared_ptr + +// BvhTree 节点 +struct BvhNode { + GLuint lab; + QVector4D bound; + bvhPtr child[2]; + static bool x_compare(QVector4D a, QVector4D b) { + return a.x() < b.x(); + } + static bool y_compare(QVector4D a, QVector4D b) { + return a.y() < b.y(); + } + GLuint getSon(int k) { + if (k >= 2) return 0; + if (child[k] == NULL) + return 0; + return child[k].get()->lab; + } + BvhNode() { + child[0] = child[1] = NULL; + } + int maximumBound() { + return (std::fabs(bound.x() - bound.w()) < std::fabs(bound.y() - bound.z())); + } + ~BvhNode() {} +}; + +class BvhTree +{ +private: + GLuint tot; + bvhPtr root; + static QVector4D calcBound(QVector4D initBound[], int l, int r); + static QVector4D Union(QVector4D a, QVector4D b); +public: + BvhTree() { + tot = 0; + root = NULL; + } + // 根据底层包围盒生成bvh树 + void buildBvhTree(QVector4D initBound[], int len); + bvhPtr subBvhTree(QVector4D initBound[], int l, int r); + void traverseBvhTree(bvhPtr now, std::vector& children, std::vector& bounds); + // 获得 Bvh (rootBvh部分)的 children 数组,包围盒数组 vector 传输 + void getBvhArray(std::vector& children, std::vector& bounds); + GLuint getBvhNodeNum(); +}; + diff --git a/ArchitectureColoredPainting/Model.cpp b/ArchitectureColoredPainting/Model.cpp index 8e5d847..0b920de 100644 --- a/ArchitectureColoredPainting/Model.cpp +++ b/ArchitectureColoredPainting/Model.cpp @@ -79,7 +79,6 @@ Model* Model::createModel(QString path, QOpenGLContext* context, QOpenGLShaderPr return new Model(path, context, shaderProgram); } - void Model::processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4) { diff --git a/ArchitectureColoredPainting/Model.h b/ArchitectureColoredPainting/Model.h index 6914019..3206614 100644 --- a/ArchitectureColoredPainting/Model.h +++ b/ArchitectureColoredPainting/Model.h @@ -33,5 +33,4 @@ private: //加载材质纹理 QVector loadMaterialTextures(aiMaterial* mat, aiTextureType type, QString typeName); -}; - +}; \ No newline at end of file diff --git a/ArchitectureColoredPainting/PaintingMesh.h b/ArchitectureColoredPainting/PaintingMesh.h index 9d4b869..e5eebd2 100644 --- a/ArchitectureColoredPainting/PaintingMesh.h +++ b/ArchitectureColoredPainting/PaintingMesh.h @@ -24,14 +24,6 @@ struct PaintingVertex QVector3D Bitangent; }; -struct BvhNode { - GLuint leftChild; - GLuint rightChild; - GLuint padding[2];//与显存对齐 - QVector4D bound; - BvhNode(GLuint leftChild, GLuint rightChild, QVector4D bound) :leftChild(leftChild), rightChild(rightChild), bound(bound) {} -}; - class PaintingMesh : public Drawable { public: