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))
31 template <
typename VoxelType>
37 template <
typename VoxelType>
42 template <
typename VoxelType>
49 this->mVolume = rhs.mVolume;
50 this->mXPosInVolume = rhs.mXPosInVolume;
51 this->mYPosInVolume = rhs.mYPosInVolume;
52 this->mZPosInVolume = rhs.mZPosInVolume;
53 mCurrentVoxel = rhs.mCurrentVoxel;
57 template <
typename VoxelType>
67 tValue = (std::min)(tValue, peekVoxel1px0py0pz());
68 tValue = (std::min)(tValue, peekVoxel0px1py0pz());
69 tValue = (std::min)(tValue, peekVoxel1px1py0pz());
70 tValue = (std::min)(tValue, peekVoxel0px0py1pz());
71 tValue = (std::min)(tValue, peekVoxel1px0py1pz());
72 tValue = (std::min)(tValue, peekVoxel0px1py1pz());
73 tValue = (std::min)(tValue, peekVoxel1px1py1pz());
78 const uint8_t uSize = 1 << uLevel;
80 VoxelType tValue = (std::numeric_limits<VoxelType>::max)();
81 for(uint8_t z = 0; z < uSize; ++z)
83 for(uint8_t y = 0; y < uSize; ++y)
85 for(uint8_t x = 0; x < uSize; ++x)
87 tValue = (std::min)(tValue, this->mVolume->getVoxelAt(this->mXPosInVolume + x, this->mYPosInVolume + y, this->mZPosInVolume + z));
95 template <
typename VoxelType>
98 return *mCurrentVoxel;
101 template <
typename VoxelType>
104 setPosition(v3dNewPos.
getX(), v3dNewPos.
getY(), v3dNewPos.
getZ());
107 template <
typename VoxelType>
110 this->mXPosInVolume = xPos;
111 this->mYPosInVolume = yPos;
112 this->mZPosInVolume = zPos;
114 const int32_t uXBlock = this->mXPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
115 const int32_t uYBlock = this->mYPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
116 const int32_t uZBlock = this->mZPosInVolume >> this->mVolume->m_uBlockSideLengthPower;
118 const uint16_t uXPosInBlock =
static_cast<uint16_t
>(this->mXPosInVolume - (uXBlock << this->mVolume->m_uBlockSideLengthPower));
119 const uint16_t uYPosInBlock =
static_cast<uint16_t
>(this->mYPosInVolume - (uYBlock << this->mVolume->m_uBlockSideLengthPower));
120 const uint16_t uZPosInBlock =
static_cast<uint16_t
>(this->mZPosInVolume - (uZBlock << this->mVolume->m_uBlockSideLengthPower));
122 const uint32_t uVoxelIndexInBlock = uXPosInBlock +
123 uYPosInBlock * this->mVolume->m_uBlockSideLength +
124 uZPosInBlock * this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
126 if(this->mVolume->m_regValidRegionInBlocks.containsPoint(
Vector3DInt32(uXBlock, uYBlock, uZBlock)))
128 Block<VoxelType>* pUncompressedCurrentBlock = this->mVolume->getUncompressedBlock(uXBlock, uYBlock, uZBlock);
134 mCurrentVoxel = this->mVolume->m_pUncompressedBorderData + uVoxelIndexInBlock;
138 template <
typename VoxelType>
147 template <
typename VoxelType>
151 if((++this->mXPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
159 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
163 template <
typename VoxelType>
167 if((++this->mYPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
170 mCurrentVoxel += this->mVolume->m_uBlockSideLength;
175 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
179 template <
typename VoxelType>
183 if((++this->mZPosInVolume) % this->mVolume->m_uBlockSideLength != 0)
186 mCurrentVoxel += this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
191 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
195 template <
typename VoxelType>
199 if((this->mXPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
207 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
211 template <
typename VoxelType>
215 if((this->mYPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
218 mCurrentVoxel -= this->mVolume->m_uBlockSideLength;
223 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
227 template <
typename VoxelType>
231 if((this->mZPosInVolume--) % this->mVolume->m_uBlockSideLength != 0)
234 mCurrentVoxel -= this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
239 setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
243 template <
typename VoxelType>
248 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
250 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume-1);
253 template <
typename VoxelType>
258 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength);
260 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume);
263 template <
typename VoxelType>
268 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
270 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume+1);
273 template <
typename VoxelType>
278 return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
280 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume-1);
283 template <
typename VoxelType>
288 return *(mCurrentVoxel - 1);
290 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume);
293 template <
typename VoxelType>
298 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
300 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume+1);
303 template <
typename VoxelType>
308 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
310 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume-1);
313 template <
typename VoxelType>
318 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength);
320 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume);
323 template <
typename VoxelType>
328 return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
330 return this->mVolume->
getVoxelAt(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume+1);
335 template <
typename VoxelType>
340 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
342 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume-1);
345 template <
typename VoxelType>
350 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength);
352 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume);
355 template <
typename VoxelType>
360 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
362 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume+1);
365 template <
typename VoxelType>
370 return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
372 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume-1);
375 template <
typename VoxelType>
378 return *mCurrentVoxel;
381 template <
typename VoxelType>
386 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
388 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume+1);
391 template <
typename VoxelType>
396 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
398 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume-1);
401 template <
typename VoxelType>
406 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength);
408 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume);
411 template <
typename VoxelType>
416 return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
418 return this->mVolume->
getVoxelAt(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume+1);
423 template <
typename VoxelType>
428 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
430 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume-1);
433 template <
typename VoxelType>
438 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength);
440 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume);
443 template <
typename VoxelType>
448 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
450 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume+1);
453 template <
typename VoxelType>
458 return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
460 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume-1);
463 template <
typename VoxelType>
468 return *(mCurrentVoxel + 1);
470 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume);
473 template <
typename VoxelType>
478 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
480 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume+1);
483 template <
typename VoxelType>
488 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
490 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume-1);
493 template <
typename VoxelType>
498 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength);
500 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume);
503 template <
typename VoxelType>
508 return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
510 return this->mVolume->
getVoxelAt(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume+1);