24 #define CAN_GO_NEG_X(val) ((val > this->mVolume->getEnclosingRegion().getLowerX()) && (val % this->mVolume->m_uBlockSideLength != 0))
25 #define CAN_GO_POS_X(val) ((val < this->mVolume->getEnclosingRegion().getUpperX()) && ((val + 1) % this->mVolume->m_uBlockSideLength != 0))
26 #define CAN_GO_NEG_Y(val) ((val > this->mVolume->getEnclosingRegion().getLowerY()) && (val % this->mVolume->m_uBlockSideLength != 0))
27 #define CAN_GO_POS_Y(val) ((val < this->mVolume->getEnclosingRegion().getUpperY()) && ((val + 1) % this->mVolume->m_uBlockSideLength != 0))
28 #define CAN_GO_NEG_Z(val) ((val > this->mVolume->getEnclosingRegion().getLowerZ()) && (val % this->mVolume->m_uBlockSideLength != 0))
29 #define CAN_GO_POS_Z(val) ((val < this->mVolume->getEnclosingRegion().getUpperZ()) && ((val + 1) % this->mVolume->m_uBlockSideLength != 0))
33 template <
typename VoxelType>
39 template <
typename VoxelType>
44 template <
typename VoxelType>
54 tValue = (std::min)(tValue, peekVoxel1px0py0pz());
55 tValue = (std::min)(tValue, peekVoxel0px1py0pz());
56 tValue = (std::min)(tValue, peekVoxel1px1py0pz());
57 tValue = (std::min)(tValue, peekVoxel0px0py1pz());
58 tValue = (std::min)(tValue, peekVoxel1px0py1pz());
59 tValue = (std::min)(tValue, peekVoxel0px1py1pz());
60 tValue = (std::min)(tValue, peekVoxel1px1py1pz());
65 const uint8_t uSize = 1 << uLevel;
67 VoxelType tValue = (std::numeric_limits<VoxelType>::max)();
68 for(
uint8_t z = 0; z < uSize; ++z)
70 for(
uint8_t y = 0; y < uSize; ++y)
72 for(
uint8_t x = 0; x < uSize; ++x)
74 tValue = (std::min)(tValue, this->mVolume->getVoxelAt(this->mXPosInVolume + x, this->mYPosInVolume + y, this->mZPosInVolume + z));
82 template <
typename VoxelType>
85 if(this->isCurrentPositionValid())
87 return *mCurrentVoxel;
91 return getVoxelAt(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
95 template <
typename VoxelType>
98 setPosition(v3dNewPos.
getX(), v3dNewPos.
getY(), v3dNewPos.
getZ());
101 template <
typename VoxelType>
108 if(this->isCurrentPositionValid())
110 const int32_t uXBlock = this->mXPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
111 const int32_t uYBlock = this->mYPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
112 const int32_t uZBlock = this->mZPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
114 const uint16_t uXPosInBlock =
static_cast<uint16_t>(this->mXPosInVolume - (uXBlock << this->mVolume->m_uBlockSideLengthPower));
115 const uint16_t uYPosInBlock =
static_cast<uint16_t>(this->mYPosInVolume - (uYBlock << this->mVolume->m_uBlockSideLengthPower));
116 const uint16_t uZPosInBlock =
static_cast<uint16_t>(this->mZPosInVolume - (uZBlock << this->mVolume->m_uBlockSideLengthPower));
118 const uint32_t uVoxelIndexInBlock = uXPosInBlock +
119 uYPosInBlock * this->mVolume->m_uBlockSideLength +
120 uZPosInBlock * this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
122 Block<VoxelType>* pUncompressedCurrentBlock = this->mVolume->getUncompressedBlock(uXBlock, uYBlock, uZBlock);
132 template <
typename VoxelType>
146 POLYVOX_ASSERT(
false,
"This function cnnot be used on LargeVolume samplers.");
150 template <
typename VoxelType>
154 bool bIsOldPositionValid = this->isCurrentPositionValid();
160 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
168 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
172 template <
typename VoxelType>
176 bool bIsOldPositionValid = this->isCurrentPositionValid();
182 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
185 mCurrentVoxel += this->mVolume->m_uBlockSideLength;
190 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
194 template <
typename VoxelType>
198 bool bIsOldPositionValid = this->isCurrentPositionValid();
204 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
207 mCurrentVoxel += this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
212 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
216 template <
typename VoxelType>
220 bool bIsOldPositionValid = this->isCurrentPositionValid();
226 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
234 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
238 template <
typename VoxelType>
242 bool bIsOldPositionValid = this->isCurrentPositionValid();
248 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
251 mCurrentVoxel -= this->mVolume->m_uBlockSideLength;
256 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
260 template <
typename VoxelType>
264 bool bIsOldPositionValid = this->isCurrentPositionValid();
270 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
273 mCurrentVoxel -= this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
278 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
282 template <
typename VoxelType>
287 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
289 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
292 template <
typename VoxelType>
297 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength);
299 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
302 template <
typename VoxelType>
307 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
309 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
312 template <
typename VoxelType>
317 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
319 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
322 template <
typename VoxelType>
325 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_X(this->mXPosInVolume) )
327 return *(mCurrentVoxel - 1);
329 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
332 template <
typename VoxelType>
337 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
339 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
342 template <
typename VoxelType>
347 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
349 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
352 template <
typename VoxelType>
357 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength);
359 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
362 template <
typename VoxelType>
367 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
369 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
374 template <
typename VoxelType>
379 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
381 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
384 template <
typename VoxelType>
387 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_Y(this->mYPosInVolume) )
389 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength);
391 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
394 template <
typename VoxelType>
399 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
401 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
404 template <
typename VoxelType>
407 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_Z(this->mZPosInVolume) )
409 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
411 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
414 template <
typename VoxelType>
417 if((this->isCurrentPositionValid()))
419 return *mCurrentVoxel;
421 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
424 template <
typename VoxelType>
427 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_Z(this->mZPosInVolume) )
429 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
431 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
434 template <
typename VoxelType>
439 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
441 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
444 template <
typename VoxelType>
447 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_Y(this->mYPosInVolume) )
449 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength);
451 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
454 template <
typename VoxelType>
459 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
461 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
466 template <
typename VoxelType>
471 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
473 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
476 template <
typename VoxelType>
481 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength);
483 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
486 template <
typename VoxelType>
491 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
493 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
496 template <
typename VoxelType>
501 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
503 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
506 template <
typename VoxelType>
509 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_X(this->mXPosInVolume) )
511 return *(mCurrentVoxel + 1);
513 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
516 template <
typename VoxelType>
521 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
523 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
526 template <
typename VoxelType>
531 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
533 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
536 template <
typename VoxelType>
541 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength);
543 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
546 template <
typename VoxelType>
551 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
553 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);