17 template<
typename DataT, se::Res ResT>
25 template<
typename DerivedT,
typename DataT,
int BlockSize>
32 inline const DataType&
getData(
const int voxel_idx)
const;
34 inline DataType&
getData(
const int voxel_idx);
36 inline const DataType&
getData(
const Eigen::Vector3i& voxel_coord)
const;
38 inline DataType&
getData(
const Eigen::Vector3i& voxel_coord);
40 inline void setData(
const unsigned voxel_idx,
const DataT& data);
42 inline void setData(
const Eigen::Vector3i& voxel_coord,
const DataT& data);
55 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
58 std::array<DataType, BlockSize * BlockSize * BlockSize> block_data_;
59 static constexpr
int min_scale_ = 0;
60 static constexpr
int curr_scale_ = 0;
62 DerivedT& underlying()
64 return static_cast<DerivedT&
>(*this);
66 const DerivedT& underlying()
const 68 return static_cast<const DerivedT&
>(*this);
74 template<
typename DataT,
int BlockSize,
typename DerivedT>
80 template<Field FldT, Colour ColB, Semantics SemB,
int BlockSize,
typename DerivedT>
86 template<Colour ColB, Semantics SemB,
int BlockSize,
typename DerivedT>
96 Eigen::Vector3i coord;
108 inline int getVoxelIdx(
const Eigen::Vector3i& voxel_coord)
const;
110 inline int getVoxelIdx(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
114 inline const DataType&
getData()
const;
120 inline const DataType&
getData(
const int voxel_idx)
const;
122 inline DataType&
getData(
const int voxel_idx);
124 inline const DataType&
getData(
const Eigen::Vector3i& voxel_coord)
const;
126 inline DataType&
getData(
const Eigen::Vector3i& voxel_coord);
130 inline const DataType&
131 getData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out)
const;
134 getData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out);
138 inline const DataType&
getData(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
140 inline DataType&
getData(
const Eigen::Vector3i& voxel_coord,
const int scale);
144 inline const DataUnion getDataUnion(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
146 inline DataUnion getDataUnion(
const Eigen::Vector3i& voxel_coord,
const int scale);
150 inline void setData(
const int voxel_idx,
const DataType& data);
152 inline void setData(
const Eigen::Vector3i& voxel_coord,
const DataType& data);
154 inline void setData(
const Eigen::Vector3i& voxel_coord,
const int scale,
const DataType& data);
156 inline void setDataUnion(
const DataUnion& data_union);
168 min_scale_ = min_scale;
183 curr_scale_ = curr_scale;
186 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
191 static constexpr
int compute_num_voxels()
193 size_t voxel_count = 0;
194 unsigned int size_at_scale = BlockSize;
195 while (size_at_scale >= 1) {
196 voxel_count += size_at_scale * size_at_scale * size_at_scale;
198 size_at_scale = size_at_scale >> 1;
203 static constexpr std::array<int, se::math::log2_const(BlockSize) + 1> compute_size_at_scales()
205 std::array<int, se::math::log2_const(BlockSize) + 1> size_at_scales{};
207 int size_at_scale = BlockSize;
209 while (size_at_scale >= 1) {
210 size_at_scales[
scale] = size_at_scale;
211 size_at_scale = size_at_scale >> 1;
214 return size_at_scales;
217 static constexpr std::array<int, se::math::log2_const(BlockSize) + 1> compute_scale_offsets()
219 std::array<int, se::math::log2_const(BlockSize) + 1> scale_offsets{};
221 unsigned int size_at_scale = BlockSize;
222 scale_offsets[0] = 0;
224 while (size_at_scale > 1) {
225 scale_offsets[
scale] =
226 scale_offsets[scale - 1] + size_at_scale * size_at_scale * size_at_scale;
227 size_at_scale = size_at_scale >> 1;
230 return scale_offsets;
233 static constexpr
int num_voxels_ = compute_num_voxels();
235 static constexpr std::array<int, se::math::log2_const(BlockSize) + 1> size_at_scales_ =
236 compute_size_at_scales();
238 static constexpr std::array<int, se::math::log2_const(BlockSize) + 1> scale_offsets_ =
239 compute_scale_offsets();
242 std::array<DataType, num_voxels_> block_data_;
243 std::array<PropDataType, num_voxels_> block_prop_data_;
248 DerivedT& underlying()
250 return static_cast<DerivedT&
>(*this);
252 const DerivedT& underlying()
const 254 return static_cast<const DerivedT&
>(*this);
261 template<
typename DataT,
271 template<Colour ColB, Semantics SemB,
int BlockSize,
typename DerivedT>
300 init_data_ = init_data;
305 inline int getVoxelIdx(
const Eigen::Vector3i& voxel_coord)
const;
307 inline int getVoxelIdx(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
313 inline const DataType&
getData(
const Eigen::Vector3i& voxel_coord)
const;
315 inline DataType&
getData(
const Eigen::Vector3i& voxel_coord);
319 inline const DataType&
320 getData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out)
const;
323 getData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out);
327 inline const DataType&
getData(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
329 inline DataType&
getData(
const Eigen::Vector3i& voxel_coord,
const int scale);
331 inline const DataType&
getMaxData(
const Eigen::Vector3i& voxel_coord)
const;
333 inline DataType&
getMaxData(
const Eigen::Vector3i& voxel_coord);
335 inline const DataType&
336 getMaxData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out)
const;
339 getMaxData(
const Eigen::Vector3i& voxel_coord,
const int scale_in,
int& scale_out);
341 inline const DataType&
getMaxData(
const Eigen::Vector3i& voxel_coord,
const int scale)
const;
343 inline DataType&
getMaxData(
const Eigen::Vector3i& voxel_coord,
const int scale);
352 inline void setData(
const Eigen::Vector3i& voxel_coord,
const DataType& data);
354 inline void setData(
const Eigen::Vector3i& voxel_coord,
const int scale,
const DataType& data);
356 inline void setMaxData(
const Eigen::Vector3i& voxel_coord,
const DataType& data);
360 setMaxData(
const Eigen::Vector3i& voxel_coord,
const int scale,
const DataType& data);
364 min_data_ = min_data;
370 void allocateDownTo();
375 inline void allocateDownTo(
const int new_min_scale);
380 void deleteUpTo(
const int new_min_scale);
391 return block_data_[0][0];
403 return block_max_data_[0][0];
442 return block_max_data_;
447 return block_max_data_;
455 return curr_integr_count_;
463 return curr_observed_count_;
471 curr_integr_count_++;
479 void incrCurrObservedCount(
bool do_increment =
true);
484 void resetCurrCount();
498 return buffer_scale_;
502 return buffer_integr_count_;
506 return buffer_observed_count_;
513 void incrBufferIntegrCount(
const bool do_increment =
true);
521 void incrBufferObservedCount(
const bool do_increment =
true);
525 void resetBufferCount();
537 void initBuffer(
const int buffer_scale);
555 DataType& bufferData(
const Eigen::Vector3i& voxel_coord)
const;
566 DataType& bufferData(
const Eigen::Vector3i& voxel_coord);
579 return buffer_data_[voxel_idx];
593 return buffer_data_[voxel_idx];
607 return curr_data_[voxel_idx];
621 return curr_data_[voxel_idx];
632 DataType* blockDataAtScale(
const int scale);
642 DataType* blockMaxDataAtScale(
const int scale);
653 min_scale_ = min_scale;
668 curr_scale_ = curr_scale;
671 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
677 void initialiseData(DataType* voxel_data,
const int num_voxels)
679 std::fill(voxel_data, voxel_data + num_voxels, init_data_);
682 std::vector<DataType*> block_data_;
683 std::vector<DataType*> block_max_data_;
685 DataType* curr_data_ =
nullptr;
686 size_t curr_integr_count_;
687 size_t curr_observed_count_;
715 DataType* buffer_data_ =
nullptr;
718 buffer_integr_count_;
719 size_t buffer_observed_count_;
724 DerivedT& underlying()
726 return static_cast<DerivedT&
>(*this);
728 const DerivedT& underlying()
const 730 return static_cast<const DerivedT&
>(*this);
740 template<
typename DataT, Res ResT,
int BlockSize,
typename PolicyT>
743 public std::conditional<ResT == Res::Single,
744 BlockSingleRes<Block<DataT, ResT, BlockSize>, DataT, BlockSize>,
745 BlockMultiRes<DataT, BlockSize, Block<DataT, ResT, BlockSize>>>::
751 static constexpr
int size = BlockSize;
752 static constexpr
int size_qu = BlockSize * BlockSize;
753 static constexpr
int size_cu = BlockSize * BlockSize * BlockSize;
769 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
778 #include "impl/block_impl.hpp" 782 #endif // SE_BLOCK_HPP const std::vector< DataType * > & blockData() const
Definition: block.hpp:430
DataType & bufferData(const int voxel_idx)
Get a reference to the voxel data in the buffer at the voxel index.
Definition: block.hpp:591
void setCurrentScale(const int curr_scale)
Definition: block.hpp:666
Res
Definition: setup_util.hpp:23
BlockSingleRes(const DataType init_data=DataType())
void setData(const unsigned voxel_idx, const DataT &data)
The node type of the octant.
Definition: block.hpp:18
int getMinScale() const
Get scales.
Definition: block.hpp:646
const DataType & getInitData() const
Get init block data.
Definition: block.hpp:289
void setCurrentScale(const int curr_scale)
Definition: block.hpp:181
DataType data
Definition: block.hpp:99
The base used for single-resolution blocks.
Definition: block.hpp:26
int scale
Definition: block.hpp:97
int getMinScale() const
Get scales.
Definition: block.hpp:161
void setInitData(const DataType &init_data)
Definition: block.hpp:298
float field_t
The type of the stored field (e.g. TSDF, ESDF or occupancy)
Definition: type_util.hpp:50
const std::vector< DataType * > & blockMaxData() const
Definition: block.hpp:440
std::vector< DataType * > & blockMaxData()
Definition: block.hpp:445
const size_t & bufferObservedCount() const
Definition: block.hpp:504
PropDataType prop_data
Definition: block.hpp:100
se::field_t meanValue()
Get the block's value at the coarsest scale.
Definition: block.hpp:413
void setMinScale(const int min_scale)
Definition: block.hpp:166
const DataType & getMinData() const
Definition: block.hpp:345
static constexpr int getMaxScale()
Definition: block.hpp:656
void setMinData(const DataType &min_data)
Definition: block.hpp:362
se::Data< se::Field::Occupancy, ColB, SemB > DataType
Definition: block.hpp:274
se::OctantBase * block(const Eigen::Vector3i &voxel_coord, OctreeT &octree, se::OctantBase *base_parent_ptr)
Allocate a block at the provided voxel coordinates.
const DataType getData() const
Get the block's data at the coarsest scale.
Definition: block.hpp:389
se::DeltaData< se::Field::TSDF, ColB, SemB > PropDataType
Definition: block.hpp:90
DataT DataType
Definition: block.hpp:750
static constexpr int getMaxScale()
Definition: block.hpp:171
DataType & bufferData(const int voxel_idx) const
Get a const reference to the voxel data in the buffer at the voxel index.
Definition: block.hpp:577
int prop_data_idx
Definition: block.hpp:103
se::field_t maxValue()
Get the block's max value at the coarsest scale.
Definition: block.hpp:425
The actual block used in the tree.
Definition: block.hpp:267
const DataType getMaxData() const
Get the block's max data at the coarsest scale.
Definition: block.hpp:401
const DataType & getData(const int voxel_idx) const
const size_t & currIntegrCount() const
Get the number of integrations at the current scale.
Definition: block.hpp:453
std::enable_if_t< OctreeT::DataType::fld_==se::Field::Occupancy, typename OctreeT::DataType > getMaxData(const OctreeT &octree, const Eigen::Vector3i &voxel_coord, const int scale_desired)
Get the max occupancy data at a given scale.
static constexpr unsigned int getSize()
Definition: block.hpp:764
DataUnion()
Definition: block.hpp:95
const size_t & bufferIntegrCount() const
Definition: block.hpp:500
int data_idx
Definition: block.hpp:102
se::DeltaData< se::Field::Occupancy, ColB, SemB > PropDataType
Definition: block.hpp:275
const int & buffer_scale() const
Definition: block.hpp:496
This class only helps to dynamic cast the octant to the right type and builds the base of nodes and b...
Definition: octant.hpp:24
DataT DataType
Definition: block.hpp:28
DataType & currData(const int voxel_idx) const
Get a const reference to the mean voxel data at the current scale via the voxel index.
Definition: block.hpp:605
float get_field(const Data< FldT, ColB, SemB > data)
se::Data< se::Field::TSDF, ColB, SemB > DataType
Definition: block.hpp:89
const size_t & currObservedCount() const
Get the number of observed voxels at the current scale.
Definition: block.hpp:461
DataType & getInitData()
Definition: block.hpp:293
static int getMinScale()
Definition: block.hpp:45
DataType & currData(const int voxel_idx)
Get a reference to the mean voxel data at the current scale via the voxel index.
Definition: block.hpp:619
int getCurrentScale() const
Definition: block.hpp:176
void setMinScale(const int min_scale)
Definition: block.hpp:651
Helper wrapper to allocate and de-allocate octants in the octree.
Definition: colour_utils.hpp:17
void incrCurrIntegrCount()
Increment the number of integrations at the current scale by 1.
Definition: block.hpp:469
constexpr int log2_const(int n)
int getCurrentScale() const
Definition: block.hpp:661
std::vector< DataType * > & blockData()
Definition: block.hpp:435
static const std::vector< Eigen::Vector3f, Eigen::aligned_allocator< Eigen::Vector3f > > scale
The colours used for the various integration scales.
Definition: colour_utils.hpp:22
static int getCurrentScale()
Definition: block.hpp:50
constexpr bool is_power_of_two(T)