12 #ifndef VOLUMEGRID_H_6014714286
13 #define VOLUMEGRID_H_6014714286
23 #include <Carna/Carna.h>
62 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
113 Segment&
segmentAt(
unsigned int segmentX,
unsigned int segmentY,
unsigned int segmentZ );
117 const Segment&
segmentAt(
unsigned int segmentX,
unsigned int segmentY,
unsigned int segmentZ )
const;
136 static SegmentHUVolumeType&
volume( Segment& segment );
140 static const SegmentHUVolumeType&
volume(
const Segment& segment );
155 typedef typename SegmentNormalsVolumeType::Value
VoxelType;
160 static SegmentNormalsVolumeType&
volume( Segment& segment );
164 static const SegmentNormalsVolumeType&
volume(
const Segment& segment );
173 template<
typename Selector >
178 template<
typename Selector >
179 typename Selector::VoxelType
getVoxel(
unsigned int x,
unsigned int y,
unsigned int z );
185 template<
typename Selector >
190 template<
typename Selector >
191 void setVoxel(
unsigned int x,
unsigned int y,
unsigned int z,
const typename Selector::VoxelType& voxel );
195 std::vector< Segment* > segments;
197 std::size_t segmentIndex(
unsigned int segmentX,
unsigned int segmentY,
unsigned int segmentZ )
const;
202 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
206 : maxSegmentSize( maxSegmentSize )
207 , segmentCounts( segmentCounts )
209 CARNA_ASSERT( maxSegmentSize.x() > 0 && maxSegmentSize.y() > 0 && maxSegmentSize.z() > 0 );
210 CARNA_ASSERT( segmentCounts.x() > 0 && segmentCounts.y() > 0 && segmentCounts.z() > 0 );
211 segments.resize( segmentCounts.x() * segmentCounts.y() * segmentCounts.z() );
212 for(
unsigned int z = 0; z < segmentCounts.z(); ++z )
213 for(
unsigned int y = 0; y < segmentCounts.y(); ++y )
214 for(
unsigned int x = 0; x < segmentCounts.x(); ++x )
216 const std::size_t index = segmentIndex( x, y, z );
218 segment->
offset =
math::Vector3ui( x * maxSegmentSize.x(), y * maxSegmentSize.y(), z * maxSegmentSize.z() );
219 segments[ index ] = segment;
224 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
227 std::for_each( segments.begin(), segments.end(), std::default_delete< Segment >() );
231 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
233 (
unsigned int segmentX
234 ,
unsigned int segmentY
235 ,
unsigned int segmentZ )
const
237 return segmentX + segmentY * segmentCounts.x() + segmentZ * segmentCounts.x() * segmentCounts.y();
241 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
242 typename VolumeGrid< SegmentHUVolumeType, SegmentNormalsVolumeType >::Segment&
246 return segmentAt( p.x(), p.y(), p.z() );
250 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
255 return segmentAt( p.x(), p.y(), p.z() );
259 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
262 (
unsigned int segmentX
263 ,
unsigned int segmentY
264 ,
unsigned int segmentZ )
266 const std::size_t index = segmentIndex( segmentX, segmentY, segmentZ );
267 Segment& segment = *segments[ index ];
272 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
275 (
unsigned int segmentX
276 ,
unsigned int segmentY
277 ,
unsigned int segmentZ )
const
279 const std::size_t index = segmentIndex( segmentX, segmentY, segmentZ );
280 const Segment& segment = *segments[ index ];
285 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
286 template<
typename Selector >
288 (
unsigned int x,
unsigned int y,
unsigned int z )
290 const unsigned int segmentX = x / maxSegmentSize.x();
291 const unsigned int segmentY = y / maxSegmentSize.y();
292 const unsigned int segmentZ = z / maxSegmentSize.z();
294 const unsigned int localX = x % maxSegmentSize.x();
295 const unsigned int localY = y % maxSegmentSize.y();
296 const unsigned int localZ = z % maxSegmentSize.z();
298 const Segment& segment = segmentAt( segmentX, segmentY, segmentZ );
299 return Selector::volume( segment )( localX, localY, localZ );
303 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
304 template<
typename Selector >
308 return getVoxel< Selector >( at.x(), at.y(), at.z() );
312 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
313 template<
typename Selector >
315 (
unsigned int x,
unsigned int y,
unsigned int z,
const typename Selector::VoxelType& voxel )
317 const unsigned int segmentX = x / maxSegmentSize.x();
318 const unsigned int segmentY = y / maxSegmentSize.y();
319 const unsigned int segmentZ = z / maxSegmentSize.z();
321 const unsigned int localX = x % maxSegmentSize.x();
322 const unsigned int localY = y % maxSegmentSize.y();
323 const unsigned int localZ = z % maxSegmentSize.z();
325 Segment& segment = segmentAt( segmentX, segmentY, segmentZ );
326 Selector::volume( segment ).setVoxel( localX, localY, localZ, voxel );
331 const bool updateRedundantX = localX == 0 && segmentX > 0;
332 const bool updateRedundantY = localY == 0 && segmentY > 0;
333 const bool updateRedundantZ = localZ == 0 && segmentZ > 0;
335 if( updateRedundantX )
337 Selector::volume( segmentAt( segmentX - 1, segmentY, segmentZ ) )
338 .setVoxel( maxSegmentSize.x(), localY, localZ, voxel );
340 if( updateRedundantY )
342 Selector::volume( segmentAt( segmentX, segmentY - 1, segmentZ ) )
343 .setVoxel( localX, maxSegmentSize.y(), localZ, voxel );
345 if( updateRedundantZ )
347 Selector::volume( segmentAt( segmentX, segmentY, segmentZ - 1 ) )
348 .setVoxel( localX, localY, maxSegmentSize.z(), voxel );
351 if( updateRedundantX && updateRedundantY )
353 Selector::volume( segmentAt( segmentX - 1, segmentY - 1, segmentZ ) )
354 .setVoxel( maxSegmentSize.x(), maxSegmentSize.y(), localZ, voxel );
356 if( updateRedundantX && updateRedundantZ )
358 Selector::volume( segmentAt( segmentX - 1, segmentY, segmentZ - 1 ) )
359 .setVoxel( maxSegmentSize.x(), localY, maxSegmentSize.z(), voxel );
361 if( updateRedundantY && updateRedundantZ )
363 Selector::volume( segmentAt( segmentX, segmentY - 1, segmentZ - 1 ) )
364 .setVoxel( localX, maxSegmentSize.y(), maxSegmentSize.z(), voxel );
367 if( updateRedundantX && updateRedundantY && updateRedundantZ )
369 Selector::volume( segmentAt( segmentX - 1, segmentY - 1, segmentZ - 1 ) )
370 .setVoxel( maxSegmentSize, voxel );
375 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
376 template<
typename Selector >
380 setVoxel< Selector >( at.x(), at.y(), at.z(), voxel );
389 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
397 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
410 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
418 template<
typename SegmentHUVolumeType,
typename SegmentNormalsVolumeType >
431 #endif // VOLUMEGRID_H_6014714286
SegmentNormalsVolumeType::Value VoxelType
Reflects the voxel type of the volume this selector references.
VolumeSegment< SegmentHUVolumeType, SegmentNormalsVolumeType > Segment
Reflects the data type that represents a single partition.
Segment & segmentAt(const base::math::Vector3ui &location)
References the partition at location.
static SegmentNormalsVolumeType & volume(Segment &segment)
References the normal map of a given partition.
VolumeGrid(const math::Vector3ui &maxSegmentSize, const math::Vector3ui &segmentCounts)
Instantiates.
Eigen::Matrix< unsigned int, 3, 1 > Vector3ui
Defines vector.
Represents a single volumetric data partition.
const math::Vector3ui maxSegmentSize
Holds the maximum resolution of a single partition.
void setVoxel(const math::Vector3ui &location, const typename Selector::VoxelType &voxel)
Writes the voxel of the volume that the Selector selects from the partition at location.
SegmentHUVolumeType::Value VoxelType
Reflects the voxel type of the volume this selector references.
SegmentHUVolumeType & huVolume()
References the HU volume data of this partition.
SegmentNormalsVolumeType SegmentNormalsVolume
Reflects the type to use for storing the normal map of a single partition.
math::Vector3ui offset
Holds the coordinate offset this partition within the whole volumetric data partitioning.
SegmentNormalsVolumeType & normals()
References the normal map of this partition.
References the normal map of a given partition.
virtual ~VolumeGrid()
Deletes this and all partitions.
const math::Vector3ui segmentCounts
Holds the number of partitions along each dimension.
SegmentHUVolumeType SegmentHUVolume
Reflects the type to use for storing the HU volume of a single partition.
Selector::VoxelType getVoxel(const math::Vector3ui &location)
Reads the voxel of the volume that the Selector selects from the partition at location.
Defines Carna::base::VolumeSegment.
References the HU volume of a given partition.
static SegmentHUVolumeType & volume(Segment &segment)
References the HU volume of a given partition.
Defines Carna::base::HUVolume.
Defines Carna::base::CarnaException, Carna::base::AssertionFailure.
#define CARNA_ASSERT(expression)
If the given expression is false, a break point is raised in debug mode and an AssertionFailure throw...
#define NON_COPYABLE
Features class it is placed in as non-copyable.
Represents a particular partitioning of volumetric data.