41#include <pcl/octree/octree_container.h>
42#include <pcl/octree/octree_iterator.h>
43#include <pcl/octree/octree_key.h>
44#include <pcl/octree/octree_nodes.h>
60template <
typename LeafContainerT =
index_t,
120 return Iterator(
this, max_depth_arg ? max_depth_arg : this->octree_depth_);
126 return ConstIterator(
this, max_depth_arg ? max_depth_arg : this->octree_depth_);
132 return ConstIterator(
this, max_depth_arg ? max_depth_arg : this->octree_depth_);
169 this, max_depth_arg ? max_depth_arg : this->octree_depth_);
176 this, max_depth_arg ? max_depth_arg : this->octree_depth_);
199 max_depth_arg ? max_depth_arg : this->octree_depth_);
206 max_depth_arg ? max_depth_arg : this->octree_depth_);
229 max_depth_arg ? max_depth_arg : this->octree_depth_);
236 this, max_depth_arg ? max_depth_arg : this->octree_depth_);
288 this, max_depth_arg ? max_depth_arg : this->octree_depth_);
295 this, max_depth_arg ? max_depth_arg : this->octree_depth_);
361 return this->octree_depth_;
442 std::vector<LeafContainerT*>& leaf_container_vector_arg)
const;
468 std::vector<LeafContainerT*>& leaf_container_vector_arg);
500 LeafContainerT* result =
nullptr;
512 return (
findLeaf(key_arg) !=
nullptr);
533 return this->root_node_;
545 return (branch_arg.
getChildPtr(child_idx_arg) !=
nullptr);
566 unsigned char child_idx_arg,
569 branch_arg[child_idx_arg] = new_child_arg;
583 for (
unsigned char i = 0; i < 8; i++) {
585 node_bits |=
static_cast<char>((!!child) << i);
598 if (branch_arg.
hasChild(child_idx_arg)) {
599 OctreeNode* branch_child = branch_arg[child_idx_arg];
619 branch_arg[child_idx_arg] =
nullptr;
630 for (
char i = 0; i < 8; i++)
643 branch_arg[child_idx_arg] =
static_cast<OctreeNode*
>(new_branch_child);
645 return new_branch_child;
656 auto* new_leaf_child =
new LeafNode();
657 branch_arg[child_idx_arg] =
static_cast<OctreeNode*
>(new_leaf_child);
659 return new_leaf_child;
695 LeafContainerT*& result_arg)
const;
722 std::vector<char>* binary_tree_out_arg,
723 typename std::vector<LeafContainerT*>* leaf_container_vector_arg)
const;
742 typename std::vector<char>::const_iterator& binary_tree_input_it_arg,
743 typename std::vector<char>::const_iterator& binary_tree_input_it_end_arg,
744 typename std::vector<LeafContainerT*>::const_iterator*
745 leaf_container_vector_it_arg,
746 typename std::vector<LeafContainerT*>::const_iterator*
747 leaf_container_vector_it_end_arg);
782#ifdef PCL_NO_PRECOMPILE
783#include <pcl/octree/impl/octree_base.hpp>
void findLeafRecursive(const OctreeKey &key_arg, uindex_t depth_mask_arg, BranchNode *branch_arg, LeafContainerT *&result_arg) const
Recursively search for a given leaf node and return a pointer.
ConstLeafNodeDepthFirstIterator leaf_depth_begin(uindex_t max_depth_arg=0u) const
ConstLeafNodeBreadthFirstIterator leaf_breadth_begin(uindex_t max_depth_arg=0u) const
LeafContainerT * findLeaf(const OctreeKey &key_arg) const
Find leaf node.
virtual void serializeTreeCallback(LeafContainerT &, const OctreeKey &) const
Callback executed for every leaf node during serialization.
void setTreeDepth(uindex_t max_depth_arg)
Set the maximum depth of the octree.
OctreeDepthFirstIterator< const OctreeT > ConstIterator
OctreeLeafNodeBreadthFirstIterator< const OctreeT > ConstLeafNodeBreadthFirstIterator
ConstIterator begin(uindex_t max_depth_arg=0u) const
const LeafNodeBreadthFirstIterator leaf_breadth_end()
void deserializeTreeRecursive(BranchNode *branch_arg, uindex_t depth_mask_arg, OctreeKey &key_arg, typename std::vector< char >::const_iterator &binary_tree_input_it_arg, typename std::vector< char >::const_iterator &binary_tree_input_it_end_arg, typename std::vector< LeafContainerT * >::const_iterator *leaf_container_vector_it_arg, typename std::vector< LeafContainerT * >::const_iterator *leaf_container_vector_it_end_arg)
Recursive method for deserializing octree structure.
LeafContainerT LeafContainer
OctreeFixedDepthIterator< OctreeT > FixedDepthIterator
OctreeDepthFirstIterator< OctreeT > Iterator
FixedDepthIterator fixed_depth_begin(uindex_t fixed_depth_arg=0u)
void serializeTree(std::vector< char > &binary_tree_out_arg, std::vector< LeafContainerT * > &leaf_container_vector_arg) const
Serialize octree into a binary output vector describing its branch node structure and push all LeafCo...
void serializeLeafs(std::vector< LeafContainerT * > &leaf_container_vector_arg)
Outputs a vector of all LeafContainerT elements that are stored within the octree leaf nodes.
LeafContainerT * createLeaf(uindex_t idx_x_arg, uindex_t idx_y_arg, uindex_t idx_z_arg)
Create new leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
virtual ~OctreeBase()
Empty deconstructor.
void deserializeTree(std::vector< char > &binary_tree_input_arg, std::vector< LeafContainerT * > &leaf_container_vector_arg)
Deserialize a binary octree description and create a corresponding octree structure.
bool branchHasChild(const BranchNode &branch_arg, unsigned char child_idx_arg) const
Check if branch is pointing to a particular child node.
BranchContainerT BranchContainer
const BreadthFirstIterator breadth_end()
OctreeFixedDepthIterator< const OctreeT > ConstFixedDepthIterator
const ConstFixedDepthIterator fixed_depth_end() const
void deleteBranch(BranchNode &branch_arg)
Delete branch and all its subchilds from octree.
void removeLeaf(const OctreeKey &key_arg)
Remove leaf node from octree.
const ConstIterator cend() const
DepthFirstIterator depth_begin(uindex_t max_depth_arg=0u)
std::size_t branch_count_
bool deleteLeafRecursive(const OctreeKey &key_arg, uindex_t depth_mask_arg, BranchNode *branch_arg)
Recursively search and delete leaf node.
bool dynamic_depth_enabled_
Iterator begin(uindex_t max_depth_arg=0u)
void setBranchChildPtr(BranchNode &branch_arg, unsigned char child_idx_arg, OctreeNode *new_child_arg)
Assign new child node to branch.
std::size_t getBranchCount() const
Return the amount of existing branch nodes in the octree.
uindex_t createLeafRecursive(const OctreeKey &key_arg, uindex_t depth_mask_arg, BranchNode *branch_arg, LeafNode *&return_leaf_arg, BranchNode *&parent_of_leaf_arg)
Create a leaf node at octree key.
LeafNodeDepthFirstIterator leaf_depth_begin(uindex_t max_depth_arg=0u)
OctreeNode * getRootNode() const
Retrieve root node.
OctreeDepthFirstIterator< const OctreeT > ConstDepthFirstIterator
void deserializeTree(std::vector< char > &binary_tree_input_arg)
Deserialize a binary octree description vector and create a corresponding octree structure.
const ConstLeafNodeDepthFirstIterator leaf_depth_end() const
const ConstIterator end() const
const FixedDepthIterator fixed_depth_end()
uindex_t getTreeDepth() const
Get the maximum depth of the octree.
OctreeLeafNodeDepthFirstIterator< OctreeT > LeafNodeIterator
BranchNode * createBranchChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Create and add a new branch child to a branch class.
OctreeBase< LeafContainerT, BranchContainerT > OctreeT
OctreeBranchNode< BranchContainerT > BranchNode
const ConstLeafNodeBreadthFirstIterator leaf_breadth_end() const
ConstDepthFirstIterator depth_begin(uindex_t max_depth_arg=0u) const
void deleteTree()
Delete the octree structure and its leaf nodes.
OctreeDepthFirstIterator< OctreeT > DepthFirstIterator
OctreeBreadthFirstIterator< const OctreeT > ConstBreadthFirstIterator
void serializeTree(std::vector< char > &binary_tree_out_arg) const
Serialize octree into a binary output vector describing its branch node structure.
ConstIterator cbegin(uindex_t max_depth_arg=0u) const
OctreeLeafNodeBreadthFirstIterator< OctreeT > LeafNodeBreadthFirstIterator
bool existLeaf(uindex_t idx_x_arg, uindex_t idx_y_arg, uindex_t idx_z_arg) const
idx_x_arg for the existence of leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
OctreeBase & operator=(const OctreeBase &source)
Copy operator.
const LeafNodeDepthFirstIterator leaf_depth_end()
void serializeTreeRecursive(const BranchNode *branch_arg, OctreeKey &key_arg, std::vector< char > *binary_tree_out_arg, typename std::vector< LeafContainerT * > *leaf_container_vector_arg) const
Recursively explore the octree and output binary octree description together with a vector of leaf no...
LeafContainerT * createLeaf(const OctreeKey &key_arg)
Create a leaf node.
LeafContainerT * findLeaf(uindex_t idx_x_arg, uindex_t idx_y_arg, uindex_t idx_z_arg) const
Find leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
char getBranchBitPattern(const BranchNode &branch_arg) const
Generate bit pattern reflecting the existence of child node pointers.
std::size_t getLeafCount() const
Return the amount of existing leafs in the octree.
void removeLeaf(uindex_t idx_x_arg, uindex_t idx_y_arg, uindex_t idx_z_arg)
Remove leaf node at (idx_x_arg, idx_y_arg, idx_z_arg).
LeafNodeBreadthFirstIterator leaf_breadth_begin(uindex_t max_depth_arg=0u)
void setMaxVoxelIndex(uindex_t max_voxel_index_arg)
Set the maximum amount of voxels per dimension.
OctreeLeafNodeDepthFirstIterator< OctreeT > LeafNodeDepthFirstIterator
OctreeBase(const OctreeBase &source)
Copy constructor.
bool octreeCanResize() const
Test if octree is able to dynamically change its depth.
BreadthFirstIterator breadth_begin(uindex_t max_depth_arg=0u)
const ConstDepthFirstIterator depth_end() const
ConstBreadthFirstIterator breadth_begin(uindex_t max_depth_arg=0u) const
OctreeBreadthFirstIterator< OctreeT > BreadthFirstIterator
LeafNode * createLeafChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Create and add a new leaf child to a branch class.
bool existLeaf(const OctreeKey &key_arg) const
Check for existence of a leaf node in the octree.
OctreeLeafNodeDepthFirstIterator< const OctreeT > ConstLeafNodeIterator
OctreeBase()
Empty constructor.
OctreeNode * getBranchChildPtr(const BranchNode &branch_arg, unsigned char child_idx_arg) const
Retrieve a child node pointer for child node at child_idx.
const DepthFirstIterator depth_end()
void deleteBranchChild(BranchNode &branch_arg, unsigned char child_idx_arg)
Delete child node and all its subchilds from octree.
const ConstBreadthFirstIterator breadth_end() const
OctreeLeafNode< LeafContainerT > LeafNode
OctreeLeafNodeDepthFirstIterator< const OctreeT > ConstLeafNodeDepthFirstIterator
virtual void deserializeTreeCallback(LeafContainerT &, const OctreeKey &)
Callback executed for every leaf node during deserialization.
ConstFixedDepthIterator fixed_depth_begin(uindex_t fixed_depth_arg=0u) const
Abstract octree branch class
bool hasChild(unsigned char child_idx_arg) const
Check if branch is pointing to a particular child node.
OctreeNode * getChildPtr(unsigned char child_idx_arg) const
Get pointer to child.
Octree container class that does not store any information.
Abstract octree iterator class
Octree leaf node iterator class.
Octree leaf node iterator class.
Abstract octree leaf class
const ContainerT * getContainerPtr() const
Get const pointer to container.
Abstract octree node class
virtual node_type_t getNodeType() const =0
Pure virtual method for retrieving the type of octree node (branch or leaf).
detail::int_type_t< detail::index_type_size, detail::index_type_signed > index_t
Type used for an index in PCL.
detail::int_type_t< detail::index_type_size, false > uindex_t
Type used for an unsigned index in PCL.
Defines all the PCL and non-PCL macros used.