39 #ifndef OCTREE_2BUF_BASE_HPP
40 #define OCTREE_2BUF_BASE_HPP
47 template<
typename DataT,
typename LeafT,
typename BranchT>
58 treeDirtyFlag_ (false),
64 template<
typename DataT,
typename LeafT,
typename BranchT>
74 template<
typename DataT,
typename LeafT,
typename BranchT>
void
77 unsigned int treeDepth;
79 assert (maxVoxelIndex_arg > 0);
82 treeDepth = std::max ((std::min (static_cast<unsigned int> (
OCT_MAXTREEDEPTH),
83 static_cast<unsigned int> (std::ceil (
Log2 (maxVoxelIndex_arg))))),
84 static_cast<unsigned int> (0));
87 depthMask_ = (1 << (treeDepth - 1));
91 template<
typename DataT,
typename LeafT,
typename BranchT>
void
94 assert (depth_arg > 0);
97 octreeDepth_ = depth_arg;
100 depthMask_ = (1 << (depth_arg - 1));
103 maxKey_.x = maxKey_.y = maxKey_.z = (1 << depth_arg) - 1;
107 template<
typename DataT,
typename LeafT,
typename BranchT>
void
109 unsigned int idxZ_arg,
const DataT& data_arg)
112 OctreeKey key (idxX_arg, idxY_arg, idxZ_arg);
115 addData (key, data_arg);
119 template<
typename DataT,
typename LeafT,
typename BranchT>
bool
121 unsigned int idxZ_arg, DataT& data_arg)
const
124 OctreeKey key (idxX_arg, idxY_arg, idxZ_arg);
127 LeafT* leaf = findLeaf (key);
131 leaf->getData (data_arg);
138 template<
typename DataT,
typename LeafT,
typename BranchT>
bool
140 unsigned int idxZ_arg)
const
143 OctreeKey key (idxX_arg, idxY_arg, idxZ_arg);
146 return existLeaf (key);
150 template<
typename DataT,
typename LeafT,
typename BranchT>
void
152 unsigned int idxZ_arg)
155 OctreeKey key (idxX_arg, idxY_arg, idxZ_arg);
158 return (this->removeLeaf (key));
162 template<
typename DataT,
typename LeafT,
typename BranchT>
void
168 deleteBranch (*rootNode_);
173 treeDirtyFlag_ =
false;
184 template<
typename DataT,
typename LeafT,
typename BranchT>
void
190 treeCleanUpRecursive (rootNode_);
194 bufferSelector_ = !bufferSelector_;
197 treeDirtyFlag_ =
true;
202 unsigned char childIdx;
204 for (childIdx = 0; childIdx < 8; childIdx++)
206 rootNode_->setChildPtr(bufferSelector_, childIdx, 0);
211 template<
typename DataT,
typename LeafT,
typename BranchT>
void
217 binaryTreeOut_arg.clear ();
218 binaryTreeOut_arg.reserve (this->branchCount_);
220 serializeTreeRecursive (rootNode_, newKey, &binaryTreeOut_arg, 0,
221 doXOREncoding_arg,
false, 0);
224 treeDirtyFlag_ =
false;
228 template<
typename DataT,
typename LeafT,
typename BranchT>
void
230 std::vector<DataT>& dataVector_arg,
bool doXOREncoding_arg)
235 binaryTreeOut_arg.clear ();
236 dataVector_arg.clear ();
238 dataVector_arg.reserve (objectCount_);
239 binaryTreeOut_arg.reserve (this->branchCount_);
241 serializeTreeRecursive (rootNode_, newKey, &binaryTreeOut_arg, &dataVector_arg, doXOREncoding_arg,
false, 0);
244 treeDirtyFlag_ =
false;
248 template<
typename DataT,
typename LeafT,
typename BranchT>
void
254 dataVector_arg.clear ();
256 dataVector_arg.reserve (objectCount_);
258 serializeTreeRecursive (rootNode_, newKey, 0, &dataVector_arg,
false,
false, 0);
261 treeDirtyFlag_ =
false;
265 template<
typename DataT,
typename LeafT,
typename BranchT>
void
274 std::vector<char>::const_iterator binaryTreeVectorIterator =
275 binaryTreeIn_arg.begin ();
276 std::vector<char>::const_iterator binaryTreeVectorIteratorEnd =
277 binaryTreeIn_arg.end ();
279 deserializeTreeRecursive (rootNode_, depthMask_, newKey,
280 binaryTreeVectorIterator, binaryTreeVectorIteratorEnd, 0, 0,
false,
284 treeDirtyFlag_ =
false;
288 template<
typename DataT,
typename LeafT,
typename BranchT>
void
290 std::vector<DataT>& dataVector_arg,
bool doXORDecoding_arg)
295 typename std::vector<DataT>::const_iterator dataVectorIterator = dataVector_arg.begin ();
298 typename std::vector<DataT>::const_iterator dataVectorEndIterator = dataVector_arg.end ();
304 std::vector<char>::const_iterator binaryTreeVectorIterator = binaryTreeIn_arg.begin ();
305 std::vector<char>::const_iterator binaryTreeVectorIteratorEnd = binaryTreeIn_arg.end ();
307 deserializeTreeRecursive (rootNode_, depthMask_, newKey, binaryTreeVectorIterator, binaryTreeVectorIteratorEnd, &dataVectorIterator,
308 &dataVectorEndIterator,
false, doXORDecoding_arg);
312 treeDirtyFlag_ =
false;
317 template<
typename DataT,
typename LeafT,
typename BranchT>
void
319 const int minPointsPerLeaf_arg)
324 dataVector_arg.clear ();
326 dataVector_arg.reserve (leafCount_);
328 serializeTreeRecursive (rootNode_, newKey, 0, &dataVector_arg,
false,
true, minPointsPerLeaf_arg);
331 treeDirtyFlag_ =
false;
335 template<
typename DataT,
typename LeafT,
typename BranchT> LeafT*
337 BranchNode* branch_arg,
bool branchReset_arg)
340 unsigned char childIdx;
347 for (childIdx = 0; childIdx < 8; childIdx++)
349 branch_arg->setChildPtr(bufferSelector_, childIdx, 0);
356 if (depthMask_arg > 1)
359 BranchNode* childBranch;
365 if (!branch_arg->hasChild(bufferSelector_, childIdx))
369 if (branch_arg->hasChild(!bufferSelector_, childIdx))
371 OctreeNode* childNode = branch_arg->getChildPtr(!bufferSelector_,childIdx);
374 childBranch =
static_cast<BranchNode*
> (childNode);
375 branch_arg->setChildPtr(bufferSelector_, childIdx, childNode);
378 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
379 createBranchChild (*branch_arg, childIdx, childBranch);
389 createBranchChild (*branch_arg, childIdx, childBranch);
396 childBranch =
static_cast<BranchNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
399 result = createLeafRecursive (key_arg, depthMask_arg / 2, childBranch, doNodeReset);
405 if (!branch_arg->hasChild(bufferSelector_, childIdx))
410 if (branch_arg->hasChild(!bufferSelector_, childIdx))
413 OctreeNode * childNode = branch_arg->getChildPtr(!bufferSelector_,childIdx);
414 if (childNode->getNodeType () ==
LEAF_NODE)
416 childLeaf =
static_cast<LeafNode*
> (childNode);
417 branch_arg->setChildPtr(bufferSelector_, childIdx, childNode);
421 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
422 createLeafChild (*branch_arg, childIdx, childLeaf);
429 createLeafChild (*branch_arg, childIdx, childLeaf);
439 childLeaf =
static_cast<LeafNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
450 template<
typename DataT,
typename LeafT,
typename BranchT> LeafT*
451 Octree2BufBase<DataT, LeafT, BranchT>::findLeafRecursive (
const OctreeKey& key_arg,
unsigned int depthMask_arg,
452 BranchNode* branch_arg)
const
455 unsigned char childIdx;
459 childIdx = key_arg.getChildIdxWithDepthMask (depthMask_arg);
461 if (depthMask_arg > 1)
464 BranchNode* childBranch;
465 childBranch =
static_cast<BranchNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
469 result = findLeafRecursive (key_arg, depthMask_arg / 2, childBranch);
474 if (branch_arg->hasChild(bufferSelector_, childIdx))
477 LeafNode* childLeaf =
static_cast<LeafNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
485 template<
typename DataT,
typename LeafT,
typename BranchT>
bool
486 Octree2BufBase<DataT, LeafT, BranchT>::deleteLeafRecursive (
const OctreeKey& key_arg,
unsigned int depthMask_arg,
487 BranchNode* branch_arg)
490 unsigned char childIdx;
495 childIdx = key_arg.getChildIdxWithDepthMask (depthMask_arg);
497 if (depthMask_arg > 1)
500 BranchNode* childBranch;
501 bool bBranchOccupied;
504 childBranch =
static_cast<BranchNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
509 bBranchOccupied = deleteLeafRecursive (key_arg, depthMask_arg / 2, childBranch);
511 if (!bBranchOccupied)
514 deleteBranchChild (*branch_arg, bufferSelector_, childIdx);
522 deleteBranchChild (*branch_arg, bufferSelector_, childIdx);
528 for (childIdx = 0; childIdx < 8; childIdx++)
530 bNoChilds = branch_arg->hasChild(bufferSelector_, childIdx);
540 template<
typename DataT,
typename LeafT,
typename BranchT>
void Octree2BufBase<
541 DataT, LeafT, BranchT>::serializeTreeRecursive (BranchNode* branch_arg,
542 OctreeKey& key_arg, std::vector<char>* binaryTreeOut_arg,
543 typename std::vector<DataT>* dataVector_arg,
bool doXOREncoding_arg,
544 bool newLeafsFilter_arg, std::size_t minPointsPerLeaf_arg)
547 unsigned char childIdx;
550 char branchBitPatternCurrBuffer;
551 char branchBitPatternPrevBuffer;
552 char nodeXORBitPattern;
555 branchBitPatternCurrBuffer = getBranchBitPattern (*branch_arg, bufferSelector_);
556 branchBitPatternPrevBuffer = getBranchBitPattern (*branch_arg, !bufferSelector_);
559 nodeXORBitPattern = branchBitPatternCurrBuffer ^ branchBitPatternPrevBuffer;
561 if (binaryTreeOut_arg)
563 if (doXOREncoding_arg)
566 binaryTreeOut_arg->push_back (nodeXORBitPattern);
571 binaryTreeOut_arg->push_back (branchBitPatternCurrBuffer);
576 for (childIdx = 0; childIdx < 8; childIdx++)
578 if (branch_arg->hasChild(bufferSelector_, childIdx))
581 key_arg.pushBranch(childIdx);
583 OctreeNode *childNode = branch_arg->getChildPtr(bufferSelector_,childIdx);
585 switch (childNode->getNodeType ())
590 serializeTreeRecursive (static_cast<BranchNode*> (childNode),
591 key_arg, binaryTreeOut_arg, dataVector_arg, doXOREncoding_arg,
592 newLeafsFilter_arg, minPointsPerLeaf_arg);
597 LeafNode* childLeaf =
static_cast<LeafNode*
> (childNode);
600 if (childLeaf->getSize () >= minPointsPerLeaf_arg)
602 if (!newLeafsFilter_arg)
605 childLeaf->getData (*dataVector_arg);
608 serializeTreeCallback (*childLeaf, key_arg);
610 else if (!branch_arg->hasChild (!bufferSelector_, childIdx))
613 childLeaf->getData (*dataVector_arg);
615 serializeTreeCallback (*childLeaf, key_arg);
629 else if (branch_arg->hasChild (!bufferSelector_, childIdx))
633 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
642 template<
typename DataT,
typename LeafT,
typename BranchT>
void
643 Octree2BufBase<DataT, LeafT, BranchT>::deserializeTreeRecursive (BranchNode* branch_arg,
644 unsigned int depthMask_arg, OctreeKey& key_arg,
645 typename std::vector<char>::const_iterator& binaryTreeIT_arg,
646 typename std::vector<char>::const_iterator& binaryTreeIT_End_arg,
647 typename std::vector<DataT>::const_iterator* dataVectorIterator_arg,
648 typename std::vector<DataT>::const_iterator* dataVectorEndIterator_arg,
649 bool branchReset_arg,
bool doXORDecoding_arg)
652 unsigned char childIdx;
656 char recoveredNodeBits;
662 for (childIdx = 0; childIdx < 8; childIdx++)
664 branch_arg->setChildPtr(bufferSelector_, childIdx, 0);
668 if (binaryTreeIT_arg!=binaryTreeIT_End_arg) {
670 nodeBits = *binaryTreeIT_arg++;
674 if (doXORDecoding_arg)
676 recoveredNodeBits = getBranchBitPattern (*branch_arg, !bufferSelector_) ^ nodeBits;
680 recoveredNodeBits = nodeBits;
684 for (childIdx = 0; childIdx < 8; childIdx++)
687 if (recoveredNodeBits & (1 << childIdx))
690 key_arg.pushBranch(childIdx);
696 if (depthMask_arg > 1)
700 BranchNode* childBranch;
703 if (!branch_arg->hasChild(bufferSelector_, childIdx))
706 if (branch_arg->hasChild(!bufferSelector_, childIdx))
708 OctreeNode* childNode = branch_arg->getChildPtr(!bufferSelector_,childIdx);
711 childBranch =
static_cast<BranchNode*
> (childNode);
712 branch_arg->setChildPtr(bufferSelector_, childIdx, childNode);
715 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
716 createBranchChild (*branch_arg, childIdx, childBranch);
725 createBranchChild (*branch_arg, childIdx, childBranch);
734 childBranch =
static_cast<BranchNode*
> (branch_arg->getChildPtr(bufferSelector_,childIdx));
738 deserializeTreeRecursive (childBranch, depthMask_arg / 2, key_arg,
739 binaryTreeIT_arg, binaryTreeIT_End_arg,
740 dataVectorIterator_arg, dataVectorEndIterator_arg,
741 doNodeReset, doXORDecoding_arg);
750 if (branch_arg->hasChild(!bufferSelector_, childIdx))
753 OctreeNode* childNode = branch_arg->getChildPtr(!bufferSelector_,childIdx);
754 if (childNode->getNodeType()==
LEAF_NODE) {
755 childLeaf =
static_cast<LeafNode*
> (childNode);
756 branch_arg->setChildPtr(bufferSelector_, childIdx, childNode);
760 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
761 createLeafChild (*branch_arg, childIdx, childLeaf);
767 createLeafChild (*branch_arg, childIdx, childLeaf);
773 bool bKeyBasedEncoding =
false;
775 if (dataVectorIterator_arg && dataVectorEndIterator_arg)
778 while ( (*dataVectorIterator_arg != *dataVectorEndIterator_arg)
779 && (this->genOctreeKeyForDataT (**dataVectorIterator_arg,
780 dataKey) && (dataKey == key_arg)))
782 childLeaf->setData (**dataVectorIterator_arg);
783 (*dataVectorIterator_arg)++;
784 bKeyBasedEncoding =
true;
789 if (!bKeyBasedEncoding)
791 childLeaf->setData (**dataVectorIterator_arg);
792 (*dataVectorIterator_arg)++;
798 this->deserializeTreeCallback (*childLeaf, key_arg);
804 else if (branch_arg->hasChild (!bufferSelector_, childIdx))
807 branch_arg->setChildPtr(bufferSelector_, childIdx, 0);
810 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
818 template<
typename DataT,
typename LeafT,
typename BranchT>
void
819 Octree2BufBase<DataT, LeafT, BranchT>::treeCleanUpRecursive (BranchNode* branch_arg)
822 unsigned char childIdx;
825 char nodeBitPatternLastBuffer;
826 char nodeXORBitPattern;
827 char unusedBranchesBits;
830 nodeBitPatternLastBuffer = getBranchBitPattern (*branch_arg, !bufferSelector_);
833 nodeXORBitPattern = getBranchXORBitPattern (*branch_arg);
836 unusedBranchesBits = nodeXORBitPattern & nodeBitPatternLastBuffer;
839 for (childIdx = 0; childIdx < 8; childIdx++)
841 if (branch_arg->hasChild(bufferSelector_, childIdx))
843 OctreeNode *childNode = branch_arg->getChildPtr(bufferSelector_,childIdx);
845 switch (childNode->getNodeType ())
850 treeCleanUpRecursive (static_cast<BranchNode*> (childNode));
862 if (unusedBranchesBits & (1 << childIdx))
865 deleteBranchChild (*branch_arg, !bufferSelector_, childIdx);
872 #define PCL_INSTANTIATE_Octree2BufBase(T) template class PCL_EXPORTS pcl::octree::Octree2BufBase<T>;