Browse Source

Format file and class name and complete annotation

master
lab pc 4 years ago
parent
commit
d398ecb3e2
  1. 74
      include/Octree/BaseOctree.h
  2. 10
      include/Octree/OctreeBuilder.h
  3. 10
      include/Octree/OctreeIO.h
  4. 53
      include/Octree/OctreeSDF.h
  5. 26
      include/Octree/OctreeTraverser.h
  6. 56
      include/Octree/OctreeUDF.h
  7. 56
      include/Octree/SDFOctree.h
  8. 17
      include/Octree/SDFTraversalSampler.h
  9. 57
      include/Octree/UDFOctree.h
  10. 11
      include/Octree/UDFTraversalSampler.h
  11. 2
      include/Octree/VoxelDenseData.h
  12. 18
      src/BaseOctree.cpp
  13. 8
      src/OctreeBuilder.cpp
  14. 4
      src/OctreeIO.cpp
  15. 2
      src/OctreeTraverser.cpp
  16. 14
      src/SDFOctree.cpp
  17. 6
      src/SDFTraversalSampler.cpp
  18. 12
      src/UDFOctree.cpp
  19. 29
      src/UDFTraversalSampler.cpp
  20. 8
      tests/octree_test/main.cpp
  21. 2
      tests/sdf_test/main.cpp

74
include/Octree/OctreeBase.h → include/Octree/BaseOctree.h

@ -8,8 +8,8 @@
* ------------------------------------ * ------------------------------------
**/ **/
#ifndef OCTREE_OCTREEBASE_H #ifndef OCTREE_BASEOCTREE_H
#define OCTREE_OCTREEBASE_H #define OCTREE_BASEOCTREE_H
#include <memory> #include <memory>
#include <utility> #include <utility>
@ -19,7 +19,7 @@
#include "AABB.h" #include "AABB.h"
namespace Octree { namespace Octree {
class OctreeBase; class BaseOctree;
class OctreeNode; class OctreeNode;
@ -30,8 +30,8 @@ namespace Octree {
using std::array; using std::array;
#if 0 #if 0
using octree_sptr = shared_ptr<OctreeSDF>; using octree_sptr = shared_ptr<SDFOctree>;
using octree_wptr = weak_ptr<OctreeSDF>; using octree_wptr = weak_ptr<SDFOctree>;
#endif #endif
using ocnode_sptr = shared_ptr<OctreeNode>; using ocnode_sptr = shared_ptr<OctreeNode>;
@ -40,26 +40,24 @@ namespace Octree {
struct OctreeNode : public std::enable_shared_from_this<OctreeNode> { struct OctreeNode : public std::enable_shared_from_this<OctreeNode> {
friend class OctreeBase; friend class BaseOctree;
friend class OctreeBuilder;
protected:
uint32_t level; uint32_t level;
array<ocnode_sptr, 8> children; array<ocnode_sptr, 8> children;
ocnode_ptr father; ocnode_ptr father;
AABB aabb; AABB aabb;
#if 0
struct AABB {
double min_x, max_x;
double min_y, max_y;
double min_z, max_z;
} aabb;
#endif
set<uint32_t> tri_ids; set<uint32_t> tri_ids;
public: public:
explicit OctreeNode(ocnode_ptr father, const AABB &aabb, uint32_t level); explicit OctreeNode(ocnode_ptr father, const AABB &aabb, uint32_t level);
/**
* Insert a face index into `tri_ids`
* TODO: This function and property `tri_ids` are considered to be discarded
* @param tri
*/
void insert_triangle_id(uint32_t tri); void insert_triangle_id(uint32_t tri);
/** /**
@ -67,33 +65,71 @@ namespace Octree {
*/ */
void split_if_no_children(); void split_if_no_children();
/**
* Make sub node via aabb
* @param aabb
* @return
*/
virtual ocnode_sptr make_child(const AABB &aabb); virtual ocnode_sptr make_child(const AABB &aabb);
/**
* If this node is a leaf
* @return
*/
bool is_leaf() const; bool is_leaf() const;
/**
* Return all-8 sub node
* @return
*/
array<ocnode_sptr, 8> get_children() const; array<ocnode_sptr, 8> get_children() const;
/**
* Find the leaf that contains the @param pos
* @param pos
* @return
*/
ocnode_sptr map_node(const Eigen::Vector3d &pos); ocnode_sptr map_node(const Eigen::Vector3d &pos);
}; };
class OctreeBase { class BaseOctree {
public: public:
uint32_t max_level; uint32_t max_level;
ocnode_sptr root; ocnode_sptr root;
public: public:
explicit OctreeBase(uint32_t max_level, const AABB &aabb); explicit BaseOctree(uint32_t max_level, const AABB &aabb);
explicit OctreeBase(uint32_t max_level, ocnode_sptr root); explicit BaseOctree(uint32_t max_level, ocnode_sptr root);
public:
/**
* Find the leaf that contains the @param pos
* @param pos
* @return
*/
ocnode_sptr map_node(const Eigen::Vector3d &pos); ocnode_sptr map_node(const Eigen::Vector3d &pos);
/**
* Return the root node
* @return
*/
ocnode_sptr get_root() const { return root; } ocnode_sptr get_root() const { return root; }
/**
* Return the max_level
* @return
*/
uint32_t get_max_level() const { return max_level; } uint32_t get_max_level() const { return max_level; }
/**
* Get the aabb of root
* @return
*/
AABB aabb() const;
}; };
} }
#endif //OCTREE_OCTREEBASE_H #endif //OCTREE_BASEOCTREE_H

10
include/Octree/OctreeBuilder.h

@ -19,7 +19,7 @@
namespace Octree { namespace Octree {
class OctreeBase; class BaseOctree;
class OctreeNode; class OctreeNode;
using ocnode_sptr = std::shared_ptr<OctreeNode>; using ocnode_sptr = std::shared_ptr<OctreeNode>;
@ -28,9 +28,9 @@ namespace Octree {
public: public:
const uint32_t max_depth; const uint32_t max_depth;
const pMesh::Triangle3dMesh<> &mesh; const pMesh::Triangle3dMesh<> &mesh;
OctreeBase &octree; BaseOctree &octree;
explicit OctreeBuilder(const pMesh::Triangle3dMesh<> &mesh, OctreeBase &octree); explicit OctreeBuilder(const pMesh::Triangle3dMesh<> &mesh, BaseOctree &octree);
void build(); void build();
@ -51,6 +51,10 @@ namespace Octree {
*/ */
void insert_triangle_to_leaf(OctreeNode &node, uint32_t tid); void insert_triangle_to_leaf(OctreeNode &node, uint32_t tid);
/**
* Clean up the leaves that not contain any triangle to reduce memory
* @param node
*/
void clean_up(ocnode_sptr &node); void clean_up(ocnode_sptr &node);
}; };
} }

10
include/Octree/OctreeIO.h

@ -16,7 +16,7 @@
namespace Octree { namespace Octree {
class OctreeBase; class BaseOctree;
class OctreeNode; class OctreeNode;
class OctreeIO { class OctreeIO {
@ -26,10 +26,10 @@ namespace Octree {
class OctreeSaver : public OctreeIO { class OctreeSaver : public OctreeIO {
private: private:
const OctreeBase &octree; const BaseOctree &octree;
public: public:
explicit OctreeSaver(const OctreeBase &octree); explicit OctreeSaver(const BaseOctree &octree);
void save(const fs_path &path); void save(const fs_path &path);
@ -39,10 +39,10 @@ namespace Octree {
class OctreeLoader : public OctreeIO { class OctreeLoader : public OctreeIO {
private: private:
OctreeBase &octree; BaseOctree &octree;
public: public:
explicit OctreeLoader(OctreeBase &octree); explicit OctreeLoader(BaseOctree &octree);
void load(const fs_path &path); void load(const fs_path &path);
}; };

53
include/Octree/OctreeSDF.h

@ -1,53 +0,0 @@
/**
* ------------------------------------
* @author: Weipeng Kong
* @date: 2021/11/30
* @email: yjxkwp@foxmail.com
* @site: https://donot.fit
* @description:
* ------------------------------------
**/
#ifndef OCTREE_OCTREESDF_H
#define OCTREE_OCTREESDF_H
#include "OctreeBase.h"
namespace Octree {
class SDFData;
class OctreeSDFNode;
using sdfdata_sptr = shared_ptr<SDFData>;
using ocsdfnode_sptr = shared_ptr<OctreeSDFNode>;
using ocsdfnode_wptr = weak_ptr<OctreeSDFNode>;
using ocsdfnode_ptr = OctreeSDFNode *;
struct OctreeSDFNode : public OctreeNode {
public:
sdfdata_sptr sdf;
public:
explicit OctreeSDFNode(ocnode_ptr father, const AABB &aabb, uint32_t level);
double get_sdf(const Eigen::Vector3d &pos);
ocnode_sptr make_child(const AABB &aabb) override;
};
}
namespace Octree {
class OctreeSDF : public OctreeBase {
public:
explicit OctreeSDF(uint32_t max_level, const AABB &aabb);
ocsdfnode_sptr map_node(const Eigen::Vector3d &pos){return std::static_pointer_cast<OctreeSDFNode>(OctreeBase::map_node(pos));}
ocsdfnode_sptr get_root() const { return std::static_pointer_cast<OctreeSDFNode>(root); }
};
}
#endif //OCTREE_OCTREESDF_H

26
include/Octree/OctreeTraverser.h

@ -11,7 +11,7 @@
#ifndef OCTREE_OCTREETRAVERSER_H #ifndef OCTREE_OCTREETRAVERSER_H
#define OCTREE_OCTREETRAVERSER_H #define OCTREE_OCTREETRAVERSER_H
#include "OctreeBase.h" #include "BaseOctree.h"
namespace Octree { namespace Octree {
class OctreeTraverser { class OctreeTraverser {
@ -21,21 +21,41 @@ namespace Octree {
BFS BFS
}; };
protected: protected:
const OctreeBase &octree; const BaseOctree &octree;
private: private:
const TraverseStrategy strategy; const TraverseStrategy strategy;
public: public:
explicit OctreeTraverser(const OctreeBase &octree, const TraverseStrategy strategy = DFS); /**
* Constructor
* @param octree
* @param strategy
*/
explicit OctreeTraverser(const BaseOctree &octree, const TraverseStrategy strategy = DFS);
/**
* Start traversing
*/
void traverse(); void traverse();
/**
* Function called when node is visited
* @param node
*/
virtual void visit_node(OctreeNode &node); virtual void visit_node(OctreeNode &node);
private: private:
/**
* Breadth-first search
* @param node
*/
void dfs(ocnode_sptr node); void dfs(ocnode_sptr node);
/**
* Depth-first search
* @param root
*/
void bfs(ocnode_sptr root); void bfs(ocnode_sptr root);
}; };
} }

56
include/Octree/OctreeUDF.h

@ -1,56 +0,0 @@
/**
* ------------------------------------
* @author: Weipeng Kong
* @date: 2021/11/30
* @email: yjxkwp@foxmail.com
* @site: https://donot.fit
* @description:
* ------------------------------------
**/
#ifndef OCTREE_OCTREEUDF_H
#define OCTREE_OCTREEUDF_H
#include "OctreeBase.h"
namespace Octree {
class UDFData;
class OctreeUDFNode;
using udfdata_sptr = shared_ptr<UDFData>;
using ocudfnode_sptr = shared_ptr<OctreeUDFNode>;
using ocudfnode_wptr = weak_ptr<OctreeUDFNode>;
using ocudfnode_ptr = OctreeUDFNode *;
struct OctreeUDFNode : public OctreeNode {
public:
udfdata_sptr udf;
public:
explicit OctreeUDFNode(ocnode_ptr father, const AABB &aabb, uint32_t level);
double get_udf(const Eigen::Vector3d &pos);
ocnode_sptr make_child(const AABB &aabb) override;
};
}
namespace Octree {
class OctreeUDF : public OctreeBase {
public:
explicit OctreeUDF(uint32_t max_level, const AABB &aabb);
ocudfnode_sptr map_node(const Eigen::Vector3d &pos) { return std::static_pointer_cast<OctreeUDFNode>(OctreeBase::map_node(pos)); }
ocudfnode_sptr get_root() const { return std::static_pointer_cast<OctreeUDFNode>(root); }
};
}
#endif //OCTREE_OCTREEUDF_H

56
include/Octree/SDFOctree.h

@ -0,0 +1,56 @@
/**
* ------------------------------------
* @author: Weipeng Kong
* @date: 2021/11/30
* @email: yjxkwp@foxmail.com
* @site: https://donot.fit
* @description:
* ------------------------------------
**/
#ifndef OCTREE_SDFOCTREE_H
#define OCTREE_SDFOCTREE_H
#include "BaseOctree.h"
namespace Octree {
class SDFData;
class SDFOctreeNode;
using sdfdata_sptr = shared_ptr<SDFData>;
using ocsdfnode_sptr = shared_ptr<SDFOctreeNode>;
using ocsdfnode_wptr = weak_ptr<SDFOctreeNode>;
using ocsdfnode_ptr = SDFOctreeNode *;
struct SDFOctreeNode : public OctreeNode {
public:
sdfdata_sptr sdf;
public:
explicit SDFOctreeNode(ocnode_ptr father, const AABB &aabb, uint32_t level);
double get_sdf(const Eigen::Vector3d &pos);
ocnode_sptr make_child(const AABB &aabb) override;
};
}
namespace Octree {
class SDFOctree : public BaseOctree {
public:
explicit SDFOctree(uint32_t max_level, const AABB &aabb);
ocsdfnode_sptr map_node(const Eigen::Vector3d &pos) {
return std::static_pointer_cast<SDFOctreeNode>(BaseOctree::map_node(pos));
}
ocsdfnode_sptr get_root() const {
return std::static_pointer_cast<SDFOctreeNode>(root);
}
};
}
#endif //OCTREE_SDFOCTREE_H

17
include/Octree/SDFTraversalSampler.h

@ -18,32 +18,37 @@
#include <Eigen/Dense> #include <Eigen/Dense>
namespace Octree { namespace Octree {
class OctreeSDFNode; class SDFOctreeNode;
class OctreeSDF;
class SDFOctree;
class SDFTraversalBuilder : public OctreeTraverser { class SDFTraversalBuilder : public OctreeTraverser {
const pMesh::Triangle3dMesh<> &mesh; const pMesh::Triangle3dMesh<> &mesh;
const double sample_step; const double sample_step;
struct QueryBox{ struct QueryBox {
OctreeSDFNode &node; SDFOctreeNode &node;
int start; int start;
int len; int len;
}; };
std::vector<QueryBox> query_boxes; std::vector<QueryBox> query_boxes;
public: public:
explicit SDFTraversalBuilder(const OctreeSDF &octree, const pMesh::Triangle3dMesh<> &mesh, const double sample_step, const TraverseStrategy strategy = DFS); explicit SDFTraversalBuilder(const SDFOctree &octree, const pMesh::Triangle3dMesh<> &mesh,
const double sample_step, const TraverseStrategy strategy = DFS);
void build(); void build();
void visit_node(OctreeNode &node) override; void visit_node(OctreeNode &node) override;
}; };
}
namespace Octree {
class SDFTraversalSampler : public OctreeTraverser { class SDFTraversalSampler : public OctreeTraverser {
public: public:
explicit SDFTraversalSampler(const OctreeBase &octree, const TraverseStrategy strategy = DFS); explicit SDFTraversalSampler(const BaseOctree &octree, const TraverseStrategy strategy = DFS);
void visit_node(OctreeNode &node) override; void visit_node(OctreeNode &node) override;
}; };

57
include/Octree/UDFOctree.h

@ -0,0 +1,57 @@
/**
* ------------------------------------
* @author: Weipeng Kong
* @date: 2021/11/30
* @email: yjxkwp@foxmail.com
* @site: https://donot.fit
* @description:
* ------------------------------------
**/
#ifndef OCTREE_UDFOCTREE_H
#define OCTREE_UDFOCTREE_H
#include "BaseOctree.h"
namespace Octree {
class UDFData;
class UDFOctreeNode;
using udfdata_sptr = shared_ptr<UDFData>;
using ocudfnode_sptr = shared_ptr<UDFOctreeNode>;
using ocudfnode_wptr = weak_ptr<UDFOctreeNode>;
using ocudfnode_ptr = UDFOctreeNode *;
struct UDFOctreeNode : public OctreeNode {
public:
udfdata_sptr udf;
public:
explicit UDFOctreeNode(ocnode_ptr father, const AABB &aabb, uint32_t level);
double get_udf(const Eigen::Vector3d &pos);
ocnode_sptr make_child(const AABB &aabb) override;
};
}
namespace Octree {
class UDFOctree : public BaseOctree {
public:
explicit UDFOctree(uint32_t max_level, const AABB &aabb);
ocudfnode_sptr map_node(const Eigen::Vector3d &pos) {
return std::static_pointer_cast<UDFOctreeNode>(BaseOctree::map_node(pos));
}
ocudfnode_sptr get_root() const {
return std::static_pointer_cast<UDFOctreeNode>(root);
}
};
}
#endif //OCTREE_UDFOCTREE_H

11
include/Octree/UDFTraversalSampler.h

@ -12,28 +12,29 @@
#define OCTREE_SDFTRAVERSALSAMPLER_H #define OCTREE_SDFTRAVERSALSAMPLER_H
#include "OctreeTraverser.h" #include "OctreeTraverser.h"
#include "SDFData.h"
#include "UDFData.h" #include "UDFData.h"
#include <utility> #include <utility>
#include <pMesh/mesh/TriangleMesh.h> #include <pMesh/mesh/TriangleMesh.h>
#include <Eigen/Dense> #include <Eigen/Dense>
namespace Octree { namespace Octree {
class UDFOctreeNode;
class UDFOctree;
class UDFTraversalBuilder : public OctreeTraverser { class UDFTraversalBuilder : public OctreeTraverser {
const pMesh::Triangle3dMesh<> &mesh; const pMesh::Triangle3dMesh<> &mesh;
const double sample_step; const double sample_step;
struct QueryBox{ struct QueryBox{
OctreeNode &node; UDFOctreeNode &node;
int start; int start;
int len; int len;
}; };
std::vector<QueryBox> query_boxes; std::vector<QueryBox> query_boxes;
public: public:
explicit UDFTraversalBuilder(const OctreeBase &octree, const pMesh::Triangle3dMesh<> &mesh, const double sample_step, const TraverseStrategy strategy = DFS); explicit UDFTraversalBuilder(const BaseOctree &octree, const pMesh::Triangle3dMesh<> &mesh, const double sample_step, const TraverseStrategy strategy = DFS);
void build(); void build();
@ -42,7 +43,7 @@ namespace Octree {
class UDFTraversalSampler : public OctreeTraverser { class UDFTraversalSampler : public OctreeTraverser {
public: public:
explicit UDFTraversalSampler(const OctreeBase &octree, const TraverseStrategy strategy = DFS); explicit UDFTraversalSampler(const BaseOctree &octree, const TraverseStrategy strategy = DFS);
void visit_node(OctreeNode &node) override; void visit_node(OctreeNode &node) override;
}; };

2
include/Octree/VoxelDenseData.h

@ -46,8 +46,6 @@ namespace Octree {
*/ */
int get_array_index(int x, int y, int z) const; int get_array_index(int x, int y, int z) const;
}; };
} }
#endif //OCTREE_VOXELDENSEDATA_H #endif //OCTREE_VOXELDENSEDATA_H

18
src/OctreeBase.cpp → src/BaseOctree.cpp

@ -8,23 +8,31 @@
* ------------------------------------ * ------------------------------------
**/ **/
#include "Octree/OctreeBase.h" #include "Octree/BaseOctree.h"
Octree::ocnode_sptr Octree::OctreeBase::map_node(const Eigen::Vector3d &pos) { Octree::ocnode_sptr Octree::BaseOctree::map_node(const Eigen::Vector3d &pos) {
auto fd = (root == nullptr) ? nullptr : root->map_node(pos); auto fd = (root == nullptr) ? nullptr : root->map_node(pos);
return fd; return fd;
return fd == nullptr ? root : fd; return fd == nullptr ? root : fd;
} }
Octree::OctreeBase::OctreeBase(uint32_t max_level, const Octree::AABB &aabb) : Octree::BaseOctree::BaseOctree(uint32_t max_level, const Octree::AABB &aabb) :
OctreeBase(max_level, std::make_shared<OctreeNode>(nullptr, aabb, 0)) { BaseOctree(max_level, std::make_shared<OctreeNode>(nullptr, aabb, 0)) {
} }
Octree::OctreeBase::OctreeBase(uint32_t max_level, Octree::ocnode_sptr root) : max_level(max_level), root(root) { Octree::BaseOctree::BaseOctree(uint32_t max_level, Octree::ocnode_sptr root) : max_level(max_level), root(root) {
} }
Octree::AABB Octree::BaseOctree::aabb() const {
if(root == nullptr){
return AABB();
}else{
return root->aabb;
}
}
Octree::OctreeNode::OctreeNode(ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : father(father), Octree::OctreeNode::OctreeNode(ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : father(father),
level(level), level(level),

8
src/OctreeBuilder.cpp

@ -9,7 +9,7 @@
**/ **/
#include "../include/Octree/OctreeBuilder.h" #include "../include/Octree/OctreeBuilder.h"
#include "Octree/OctreeBase.h" #include "Octree/BaseOctree.h"
#include <set> #include <set>
#if 0 #if 0
@ -20,14 +20,12 @@ struct OctreeNodeBuilder{
#endif #endif
Octree::OctreeBuilder::OctreeBuilder(const pMesh::Triangle3dMesh<> &mesh, Octree::OctreeBase &octree): Octree::OctreeBuilder::OctreeBuilder(const pMesh::Triangle3dMesh<> &mesh, Octree::BaseOctree &octree) :
mesh(mesh), max_depth(octree.get_max_level()), octree(octree) mesh(mesh), max_depth(octree.get_max_level()), octree(octree) {
{
} }
void Octree::OctreeBuilder::build() { void Octree::OctreeBuilder::build() {
for (int i = 0; i < mesh.f_size(); ++i) { for (int i = 0; i < mesh.f_size(); ++i) {
this->insert_triangle(*octree.root, i); this->insert_triangle(*octree.root, i);

4
src/OctreeIO.cpp

@ -9,14 +9,14 @@
**/ **/
#include "../include/Octree/OctreeIO.h" #include "../include/Octree/OctreeIO.h"
#include "Octree/OctreeBase.h" #include "Octree/BaseOctree.h"
namespace SerializationTool{ namespace SerializationTool{
} }
Octree::OctreeSaver::OctreeSaver(const Octree::OctreeBase &octree): octree(octree) { Octree::OctreeSaver::OctreeSaver(const Octree::BaseOctree &octree): octree(octree) {
} }

2
src/OctreeTraverser.cpp

@ -10,7 +10,7 @@
#include "../include/Octree/OctreeTraverser.h" #include "../include/Octree/OctreeTraverser.h"
Octree::OctreeTraverser::OctreeTraverser(const OctreeBase &octree, const TraverseStrategy strategy) : octree(octree), Octree::OctreeTraverser::OctreeTraverser(const BaseOctree &octree, const TraverseStrategy strategy) : octree(octree),
strategy( strategy(
strategy) { strategy) {

14
src/OctreeSDF.cpp → src/SDFOctree.cpp

@ -8,11 +8,11 @@
* ------------------------------------ * ------------------------------------
**/ **/
#include "Octree/OctreeSDF.h" #include "Octree/SDFOctree.h"
#include "Octree/SDFData.h" #include "Octree/SDFData.h"
double Octree::OctreeSDFNode::get_sdf(const Eigen::Vector3d &pos) { double Octree::SDFOctreeNode::get_sdf(const Eigen::Vector3d &pos) {
Eigen::Vector3d relative = pos - aabb.get_min(); Eigen::Vector3d relative = pos - aabb.get_min();
auto size = aabb.size(); auto size = aabb.size();
relative.x() = relative.x() / size.x(); relative.x() = relative.x() / size.x();
@ -21,16 +21,16 @@ double Octree::OctreeSDFNode::get_sdf(const Eigen::Vector3d &pos) {
return sdf->sample(relative.x(), relative.y(), relative.z()); return sdf->sample(relative.x(), relative.y(), relative.z());
} }
Octree::OctreeSDFNode::OctreeSDFNode(Octree::ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : OctreeNode( Octree::SDFOctreeNode::SDFOctreeNode(Octree::ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : OctreeNode(
father, aabb, level) { father, aabb, level) {
} }
Octree::ocnode_sptr Octree::OctreeSDFNode::make_child(const Octree::AABB &aabb) { Octree::ocnode_sptr Octree::SDFOctreeNode::make_child(const Octree::AABB &aabb) {
return std::make_shared<OctreeSDFNode>(this, aabb, level + 1); return std::make_shared<SDFOctreeNode>(this, aabb, level + 1);
} }
Octree::OctreeSDF::OctreeSDF(uint32_t max_level, const Octree::AABB &aabb) : Octree::SDFOctree::SDFOctree(uint32_t max_level, const Octree::AABB &aabb) :
OctreeBase(max_level, std::static_pointer_cast<OctreeNode>(std::make_shared<OctreeSDFNode>(nullptr, aabb, 0))) { BaseOctree(max_level, std::static_pointer_cast<OctreeNode>(std::make_shared<SDFOctreeNode>(nullptr, aabb, 0))) {
} }

6
src/SDFTraversalSampler.cpp

@ -10,12 +10,12 @@
#include "Octree/SDFTraversalSampler.h" #include "Octree/SDFTraversalSampler.h"
#include "Octree/SDFData.h" #include "Octree/SDFData.h"
#include "Octree/OctreeSDF.h" #include "Octree/SDFOctree.h"
#include <igl/signed_distance.h> #include <igl/signed_distance.h>
#include <boost/date_time/posix_time/ptime.hpp> #include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time.hpp> #include <boost/date_time.hpp>
Octree::SDFTraversalBuilder::SDFTraversalBuilder(const Octree::OctreeSDF &octree, Octree::SDFTraversalBuilder::SDFTraversalBuilder(const Octree::SDFOctree &octree,
const pMesh::Triangle3dMesh<> &mesh, const pMesh::Triangle3dMesh<> &mesh,
const double sample_step, const double sample_step,
const Octree::OctreeTraverser::TraverseStrategy strategy) const Octree::OctreeTraverser::TraverseStrategy strategy)
@ -24,7 +24,7 @@ Octree::SDFTraversalBuilder::SDFTraversalBuilder(const Octree::OctreeSDF &octree
void Octree::SDFTraversalBuilder::visit_node(Octree::OctreeNode &node) { void Octree::SDFTraversalBuilder::visit_node(Octree::OctreeNode &node) {
// if (not node.is_leaf()) return; // if (not node.is_leaf()) return;
auto &sdf_node = (OctreeSDFNode &)node; auto &sdf_node = (SDFOctreeNode &)node;
if (node.level >= octree.get_max_level()) { if (node.level >= octree.get_max_level()) {
// deepest voxel // deepest voxel

12
src/OctreeUDF.cpp → src/UDFOctree.cpp

@ -8,15 +8,15 @@
* ------------------------------------ * ------------------------------------
**/ **/
#include "Octree/OctreeUDF.h" #include "Octree/UDFOctree.h"
#include "Octree/UDFData.h" #include "Octree/UDFData.h"
Octree::OctreeUDFNode::OctreeUDFNode(Octree::ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : OctreeNode( Octree::UDFOctreeNode::UDFOctreeNode(Octree::ocnode_ptr father, const Octree::AABB &aabb, uint32_t level) : OctreeNode(
father, aabb, level) { father, aabb, level) {
} }
double Octree::OctreeUDFNode::get_udf(const Eigen::Vector3d &pos) { double Octree::UDFOctreeNode::get_udf(const Eigen::Vector3d &pos) {
Eigen::Vector3d relative = pos - aabb.get_min(); Eigen::Vector3d relative = pos - aabb.get_min();
auto size = aabb.size(); auto size = aabb.size();
relative.x() = relative.x() / size.x(); relative.x() = relative.x() / size.x();
@ -25,10 +25,10 @@ double Octree::OctreeUDFNode::get_udf(const Eigen::Vector3d &pos) {
return udf->sample(relative.x(), relative.y(), relative.z()); return udf->sample(relative.x(), relative.y(), relative.z());
} }
Octree::ocnode_sptr Octree::OctreeUDFNode::make_child(const Octree::AABB &aabb) { Octree::ocnode_sptr Octree::UDFOctreeNode::make_child(const Octree::AABB &aabb) {
return std::make_shared<OctreeUDFNode>(this, aabb, level + 1); return std::make_shared<UDFOctreeNode>(this, aabb, level + 1);
} }
Octree::OctreeUDF::OctreeUDF(uint32_t max_level, const Octree::AABB &aabb) : OctreeBase(max_level, aabb) { Octree::UDFOctree::UDFOctree(uint32_t max_level, const Octree::AABB &aabb) : BaseOctree(max_level, aabb) {
} }

29
src/UDFTraversalSampler.cpp

@ -8,15 +8,16 @@
* ------------------------------------ * ------------------------------------
**/ **/
#include "Octree/SDFTraversalSampler.h" #include "Octree/UDFTraversalSampler.h"
#include "Octree/SDFData.h" #include "Octree/UDFData.h"
#include "Octree/UDFOctree.h"
#include <igl/signed_distance.h> #include <igl/signed_distance.h>
#include <boost/date_time/posix_time/ptime.hpp> #include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time.hpp> #include <boost/date_time.hpp>
#if 0
Octree::UDFTraversalBuilder::UDFTraversalBuilder(const Octree::OctreeBase &octree,
Octree::UDFTraversalBuilder::UDFTraversalBuilder(const Octree::BaseOctree &octree,
const pMesh::Triangle3dMesh<> &mesh, const pMesh::Triangle3dMesh<> &mesh,
const double sample_step, const double sample_step,
const Octree::OctreeTraverser::TraverseStrategy strategy) const Octree::OctreeTraverser::TraverseStrategy strategy)
@ -24,8 +25,9 @@ Octree::UDFTraversalBuilder::UDFTraversalBuilder(const Octree::OctreeBase &octre
} }
void Octree::UDFTraversalBuilder::visit_node(Octree::OctreeNode &node) { void Octree::UDFTraversalBuilder::visit_node(Octree::OctreeNode &node) {
// if (not node.is_leaf()) return; auto &udf_node = (UDFOctreeNode &)node;
// if (not node.is_leaf()) return;
if (node.level >= octree.max_level) { if (node.level >= octree.max_level) {
// deepest voxel // deepest voxel
auto aabb_size = node.aabb.size(); auto aabb_size = node.aabb.size();
@ -39,9 +41,9 @@ void Octree::UDFTraversalBuilder::visit_node(Octree::OctreeNode &node) {
int start = this->query_boxes.empty() ? 0 : (this->query_boxes.back().start + this->query_boxes.back().len); int start = this->query_boxes.empty() ? 0 : (this->query_boxes.back().start + this->query_boxes.back().len);
int len = _x * _y * _z; int len = _x * _y * _z;
sdfdata_sptr sdf = std::make_shared<SDFData>(std::vector<double>(len), _x, _y, _z); udfdata_sptr udf = std::make_shared<UDFData>(std::vector<double>(len), _x, _y, _z);
node.sdf = sdf; udf_node.udf = udf;
query_boxes.push_back({.node=node, .start=start, .len=len}); query_boxes.push_back({.node=udf_node, .start=start, .len=len});
} else { } else {
// rough voxel (un-deepest) // rough voxel (un-deepest)
// Only calc corners // Only calc corners
@ -52,9 +54,9 @@ void Octree::UDFTraversalBuilder::visit_node(Octree::OctreeNode &node) {
int start = this->query_boxes.empty() ? 0 : (this->query_boxes.back().start + this->query_boxes.back().len); int start = this->query_boxes.empty() ? 0 : (this->query_boxes.back().start + this->query_boxes.back().len);
int len = _x * _y * _z; int len = _x * _y * _z;
sdfdata_sptr sdf = std::make_shared<SDFData>(std::vector<double>(len), _x, _y, _z); udfdata_sptr udf = std::make_shared<UDFData>(std::vector<double>(len), _x, _y, _z);
node.sdf = sdf; udf_node.udf = udf;
query_boxes.push_back({.node=node, .start=start, .len=len}); query_boxes.push_back({.node=udf_node, .start=start, .len=len});
} }
} }
@ -80,7 +82,7 @@ void Octree::UDFTraversalBuilder::build() {
int index_base = 0; int index_base = 0;
for (const auto &qbox: this->query_boxes) { for (const auto &qbox: this->query_boxes) {
auto &sdf = *qbox.node.sdf; auto &sdf = *qbox.node.udf;
auto &aabb = qbox.node.aabb; auto &aabb = qbox.node.aabb;
const auto pos_base = aabb.get_min(); const auto pos_base = aabb.get_min();
const auto pos_max = aabb.get_max(); const auto pos_max = aabb.get_max();
@ -132,7 +134,7 @@ void Octree::UDFTraversalBuilder::build() {
double *distance = S.data(); double *distance = S.data();
for (const auto &qbox: this->query_boxes) { for (const auto &qbox: this->query_boxes) {
auto &sdf = *qbox.node.sdf; auto &sdf = *qbox.node.udf;
double *target_data = sdf.value.data(); double *target_data = sdf.value.data();
std::memcpy(target_data, distance + qbox.start, qbox.len * sizeof(double)); std::memcpy(target_data, distance + qbox.start, qbox.len * sizeof(double));
} }
@ -140,4 +142,3 @@ void Octree::UDFTraversalBuilder::build() {
query_boxes.clear(); query_boxes.clear();
} }
#endif

8
tests/octree_test/main.cpp

@ -9,7 +9,7 @@
**/ **/
#include <iostream> #include <iostream>
#include "Octree/OctreeSDF.h" #include "Octree/SDFOctree.h"
#include "Octree/OctreeBuilder.h" #include "Octree/OctreeBuilder.h"
#include "Octree/OctreeTraverser.h" #include "Octree/OctreeTraverser.h"
#include "Octree/SDFTraversalSampler.h" #include "Octree/SDFTraversalSampler.h"
@ -32,7 +32,7 @@
class VTKTraverser : public pMesh::io::BaseReader, public Octree::OctreeTraverser { class VTKTraverser : public pMesh::io::BaseReader, public Octree::OctreeTraverser {
int node_cnt = 0; int node_cnt = 0;
public: public:
explicit VTKTraverser(const Octree::OctreeSDF &octree, const TraverseStrategy strategy = DFS); explicit VTKTraverser(const Octree::SDFOctree &octree, const TraverseStrategy strategy = DFS);
void visit_node(Octree::OctreeNode &node) override; void visit_node(Octree::OctreeNode &node) override;
@ -65,7 +65,7 @@ int main() {
boost::timer t; boost::timer t;
Octree::AABB aabb(mesh.aabb()); Octree::AABB aabb(mesh.aabb());
Octree::OctreeSDF octree(level, aabb); Octree::SDFOctree octree(level, aabb);
aabb.extend(2); aabb.extend(2);
Octree::OctreeBuilder builder(mesh, octree); Octree::OctreeBuilder builder(mesh, octree);
@ -210,7 +210,7 @@ bool VTKTraverser::operator>>(pMesh::io::ReadAdapter &adapter) {
} }
VTKTraverser::VTKTraverser(const Octree::OctreeSDF &octree, const OctreeTraverser::TraverseStrategy strategy) VTKTraverser::VTKTraverser(const Octree::SDFOctree &octree, const OctreeTraverser::TraverseStrategy strategy)
: OctreeTraverser( : OctreeTraverser(
octree, strategy) { octree, strategy) {
} }

2
tests/sdf_test/main.cpp

@ -9,7 +9,7 @@
**/ **/
#include <iostream> #include <iostream>
#include "Octree/OctreeBase.h" #include "Octree/BaseOctree.h"
#include "Octree/OctreeBuilder.h" #include "Octree/OctreeBuilder.h"
#include "Octree/OctreeTraverser.h" #include "Octree/OctreeTraverser.h"
#include "Octree/SDFTraversalSampler.h" #include "Octree/SDFTraversalSampler.h"

Loading…
Cancel
Save