24 #define BORDER_LOW(x) ((( x >> this->mVolume->m_uBlockSideLengthPower) << this->mVolume->m_uBlockSideLengthPower) != x)
25 #define BORDER_HIGH(x) ((( (x+1) >> this->mVolume->m_uBlockSideLengthPower) << this->mVolume->m_uBlockSideLengthPower) != (x+1))
34 template <
typename VoxelType>
40 template <
typename VoxelType>
45 template <
typename VoxelType>
52 this->mVolume = rhs.mVolume;
53 this->mXPosInVolume = rhs.mXPosInVolume;
54 this->mYPosInVolume = rhs.mYPosInVolume;
55 this->mZPosInVolume = rhs.mZPosInVolume;
56 mCurrentVoxel = rhs.mCurrentVoxel;
60 template <
typename VoxelType>
70 tValue = (std::min)(tValue, peekVoxel1px0py0pz());
71 tValue = (std::min)(tValue, peekVoxel0px1py0pz());
72 tValue = (std::min)(tValue, peekVoxel1px1py0pz());
73 tValue = (std::min)(tValue, peekVoxel0px0py1pz());
74 tValue = (std::min)(tValue, peekVoxel1px0py1pz());
75 tValue = (std::min)(tValue, peekVoxel0px1py1pz());
76 tValue = (std::min)(tValue, peekVoxel1px1py1pz());
81 const uint8_t uSize = 1 << uLevel;
83 VoxelType tValue = (std::numeric_limits<VoxelType>::max)();
84 for(uint8_t z = 0; z < uSize; ++z)
86 for(uint8_t y = 0; y < uSize; ++y)
88 for(uint8_t x = 0; x < uSize; ++x)
90 tValue = (std::min)(tValue, this->mVolume->getVoxelAt(this->mXPosInVolume + x, this->mYPosInVolume + y, this->mZPosInVolume + z));
101 template <
typename VoxelType>
104 return *mCurrentVoxel;
110 template <
typename VoxelType>
113 setPosition(v3dNewPos.
getX(), v3dNewPos.
getY(), v3dNewPos.
getZ());
121 template <
typename VoxelType>
124 this->mXPosInVolume = xPos;
125 this->mYPosInVolume = yPos;
126 this->mZPosInVolume = zPos;
128 const int32_t uXBlock = this->mXPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
129 const int32_t uYBlock = this->mYPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
130 const int32_t uZBlock = this->mZPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
132 const uint16_t uXPosInBlock =
static_cast<uint16_t
>(this->mXPosInVolume - (uXBlock << this->mVolume->m_uBlockSideLengthPower));
133 const uint16_t uYPosInBlock =
static_cast<uint16_t
>(this->mYPosInVolume - (uYBlock << this->mVolume->m_uBlockSideLengthPower));
134 const uint16_t uZPosInBlock =
static_cast<uint16_t
>(this->mZPosInVolume - (uZBlock << this->mVolume->m_uBlockSideLengthPower));
136 const uint32_t uVoxelIndexInBlock = uXPosInBlock +
137 uYPosInBlock * this->mVolume->m_uBlockSideLength +
138 uZPosInBlock * this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
140 if(this->mVolume->m_regValidRegionInBlocks.containsPoint(
Vector3DInt32(uXBlock, uYBlock, uZBlock)))
142 Block* pUncompressedCurrentBlock = this->mVolume->getUncompressedBlock(uXBlock, uYBlock, uZBlock);
148 mCurrentVoxel = this->mVolume->m_pUncompressedBorderData + uVoxelIndexInBlock;
161 template <
typename VoxelType>
164 VoxelType* pBorderDataEndPlusOne = this->mVolume->m_pUncompressedBorderData + this->mVolume->m_uNoOfVoxelsPerBlock;
167 if((mCurrentVoxel < this->mVolume->m_pUncompressedBorderData) || (mCurrentVoxel >= pBorderDataEndPlusOne))
169 *mCurrentVoxel = tValue;
178 template <
typename VoxelType>
182 if((++this->mXPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
190 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
194 template <
typename VoxelType>
198 if((++this->mYPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
201 mCurrentVoxel += this->mVolume->m_uBlockSideLength;
206 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
210 template <
typename VoxelType>
214 if((++this->mZPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
217 mCurrentVoxel += this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
222 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
226 template <
typename VoxelType>
230 if((this->mXPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
238 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
242 template <
typename VoxelType>
246 if((this->mYPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
249 mCurrentVoxel -= this->mVolume->m_uBlockSideLength;
254 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
258 template <
typename VoxelType>
262 if((this->mZPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
265 mCurrentVoxel -= this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
270 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
274 template <
typename VoxelType>
279 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
281 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume-1);
284 template <
typename VoxelType>
289 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength);
291 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume);
294 template <
typename VoxelType>
299 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
301 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume+1);
304 template <
typename VoxelType>
309 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
311 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume-1);
314 template <
typename VoxelType>
319 return *(mCurrentVoxel - 1);
321 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume);
324 template <
typename VoxelType>
329 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
331 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume+1);
334 template <
typename VoxelType>
339 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
341 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume-1);
344 template <
typename VoxelType>
349 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength);
351 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume);
354 template <
typename VoxelType>
359 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
361 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume+1);
366 template <
typename VoxelType>
371 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
373 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume-1);
376 template <
typename VoxelType>
381 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength);
383 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume);
386 template <
typename VoxelType>
391 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
393 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume+1);
396 template <
typename VoxelType>
401 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
403 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume-1);
406 template <
typename VoxelType>
409 return *mCurrentVoxel;
412 template <
typename VoxelType>
417 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
419 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume+1);
422 template <
typename VoxelType>
427 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
429 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume-1);
432 template <
typename VoxelType>
437 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength);
439 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume);
442 template <
typename VoxelType>
447 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
449 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume+1);
454 template <
typename VoxelType>
459 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
461 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume-1);
464 template <
typename VoxelType>
469 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength);
471 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume);
474 template <
typename VoxelType>
479 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
481 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume+1);
484 template <
typename VoxelType>
489 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
491 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume-1);
494 template <
typename VoxelType>
499 return *(mCurrentVoxel + 1);
501 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume);
504 template <
typename VoxelType>
509 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
511 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume+1);
514 template <
typename VoxelType>
519 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
521 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume-1);
524 template <
typename VoxelType>
529 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength);
531 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume);
534 template <
typename VoxelType>
539 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
541 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume+1);