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))
36 template <
typename VoxelType>
42 template <
typename VoxelType>
47 template <
typename VoxelType>
57 tValue = (std::min)(tValue, peekVoxel1px0py0pz());
58 tValue = (std::min)(tValue, peekVoxel0px1py0pz());
59 tValue = (std::min)(tValue, peekVoxel1px1py0pz());
60 tValue = (std::min)(tValue, peekVoxel0px0py1pz());
61 tValue = (std::min)(tValue, peekVoxel1px0py1pz());
62 tValue = (std::min)(tValue, peekVoxel0px1py1pz());
63 tValue = (std::min)(tValue, peekVoxel1px1py1pz());
68 const uint8_t uSize = 1 << uLevel;
70 VoxelType tValue = (std::numeric_limits<VoxelType>::max)();
71 for(
uint8_t z = 0; z < uSize; ++z)
73 for(
uint8_t y = 0; y < uSize; ++y)
75 for(
uint8_t x = 0; x < uSize; ++x)
77 tValue = (std::min)(tValue, this->mVolume->getVoxelAt(this->mXPosInVolume + x, this->mYPosInVolume + y, this->mZPosInVolume + z));
88 template <
typename VoxelType>
91 if(this->isCurrentPositionValid())
93 return *mCurrentVoxel;
97 return getVoxelAt(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
104 template <
typename VoxelType>
107 setPosition(v3dNewPos.
getX(), v3dNewPos.
getY(), v3dNewPos.
getZ());
115 template <
typename VoxelType>
122 if(this->isCurrentPositionValid())
124 const int32_t uXBlock = this->mXPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
125 const int32_t uYBlock = this->mYPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
126 const int32_t uZBlock = this->mZPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
128 const uint16_t uXPosInBlock =
static_cast<uint16_t>(this->mXPosInVolume - (uXBlock << this->mVolume->m_uBlockSideLengthPower));
129 const uint16_t uYPosInBlock =
static_cast<uint16_t>(this->mYPosInVolume - (uYBlock << this->mVolume->m_uBlockSideLengthPower));
130 const uint16_t uZPosInBlock =
static_cast<uint16_t>(this->mZPosInVolume - (uZBlock << this->mVolume->m_uBlockSideLengthPower));
132 const uint32_t uVoxelIndexInBlock = uXPosInBlock +
133 uYPosInBlock * this->mVolume->m_uBlockSideLength +
134 uZPosInBlock * this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
136 Block* pUncompressedCurrentBlock = this->mVolume->getUncompressedBlock(uXBlock, uYBlock, uZBlock);
155 template <
typename VoxelType>
158 if(this->m_bIsCurrentPositionValidInX && this->m_bIsCurrentPositionValidInY && this->m_bIsCurrentPositionValidInZ)
160 *mCurrentVoxel = tValue;
169 template <
typename VoxelType>
173 bool bIsOldPositionValid = this->isCurrentPositionValid();
179 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
187 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
191 template <
typename VoxelType>
195 bool bIsOldPositionValid = this->isCurrentPositionValid();
201 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
204 mCurrentVoxel += this->mVolume->m_uBlockSideLength;
209 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
213 template <
typename VoxelType>
217 bool bIsOldPositionValid = this->isCurrentPositionValid();
223 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
226 mCurrentVoxel += this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
231 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
235 template <
typename VoxelType>
239 bool bIsOldPositionValid = this->isCurrentPositionValid();
245 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
253 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
257 template <
typename VoxelType>
261 bool bIsOldPositionValid = this->isCurrentPositionValid();
267 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
270 mCurrentVoxel -= this->mVolume->m_uBlockSideLength;
275 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
279 template <
typename VoxelType>
283 bool bIsOldPositionValid = this->isCurrentPositionValid();
289 if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
292 mCurrentVoxel -= this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
297 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
301 template <
typename VoxelType>
306 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
308 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
311 template <
typename VoxelType>
316 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength);
318 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
321 template <
typename VoxelType>
326 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
328 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
331 template <
typename VoxelType>
336 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
338 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
341 template <
typename VoxelType>
344 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_X(this->mXPosInVolume) )
346 return *(mCurrentVoxel - 1);
348 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
351 template <
typename VoxelType>
356 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
358 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
361 template <
typename VoxelType>
366 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
368 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
371 template <
typename VoxelType>
376 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength);
378 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
381 template <
typename VoxelType>
386 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
388 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
393 template <
typename VoxelType>
398 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
400 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
403 template <
typename VoxelType>
406 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_Y(this->mYPosInVolume) )
408 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength);
410 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
413 template <
typename VoxelType>
418 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
420 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
423 template <
typename VoxelType>
426 if((this->isCurrentPositionValid()) &&
CAN_GO_NEG_Z(this->mZPosInVolume) )
428 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
430 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
433 template <
typename VoxelType>
436 if((this->isCurrentPositionValid()))
438 return *mCurrentVoxel;
440 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
443 template <
typename VoxelType>
446 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_Z(this->mZPosInVolume) )
448 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
450 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
453 template <
typename VoxelType>
458 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
460 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
463 template <
typename VoxelType>
466 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_Y(this->mYPosInVolume) )
468 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength);
470 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
473 template <
typename VoxelType>
478 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
480 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
485 template <
typename VoxelType>
490 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
492 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
495 template <
typename VoxelType>
500 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength);
502 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
505 template <
typename VoxelType>
510 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
512 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
515 template <
typename VoxelType>
520 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
522 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
525 template <
typename VoxelType>
528 if((this->isCurrentPositionValid()) &&
CAN_GO_POS_X(this->mXPosInVolume) )
530 return *(mCurrentVoxel + 1);
532 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
535 template <
typename VoxelType>
540 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
542 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
545 template <
typename VoxelType>
550 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
552 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
555 template <
typename VoxelType>
560 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength);
562 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
565 template <
typename VoxelType>
570 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
572 return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);