PolyVox  0.3.0-dev
Open source voxel management library
SimpleVolumeSampler.inl
Go to the documentation of this file.
1 /*******************************************************************************
2 Copyright (c) 2005-2009 David Williams
3 
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7 
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11 
12  1. The origin of this software must not be misrepresented; you must not
13  claim that you wrote the original software. If you use this software
14  in a product, an acknowledgment in the product documentation would be
15  appreciated but is not required.
16 
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19 
20  3. This notice may not be removed or altered from any source
21  distribution.
22 *******************************************************************************/
23 
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))
30 
31 namespace PolyVox
32 {
36  template <typename VoxelType>
38  :BaseVolume<VoxelType>::template Sampler< SimpleVolume<VoxelType> >(volume)
39  {
40  }
41 
42  template <typename VoxelType>
44  {
45  }
46 
47  template <typename VoxelType>
49  {
50  if(uLevel == 0)
51  {
52  return getVoxel();
53  }
54  else if(uLevel == 1)
55  {
56  VoxelType tValue = getVoxel();
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());
64  return tValue;
65  }
66  else
67  {
68  const uint8_t uSize = 1 << uLevel;
69 
70  VoxelType tValue = (std::numeric_limits<VoxelType>::max)();
71  for(uint8_t z = 0; z < uSize; ++z)
72  {
73  for(uint8_t y = 0; y < uSize; ++y)
74  {
75  for(uint8_t x = 0; x < uSize; ++x)
76  {
77  tValue = (std::min)(tValue, this->mVolume->getVoxelAt(this->mXPosInVolume + x, this->mYPosInVolume + y, this->mZPosInVolume + z));
78  }
79  }
80  }
81  return tValue;
82  }
83  }
84 
88  template <typename VoxelType>
90  {
91  if(this->isCurrentPositionValid())
92  {
93  return *mCurrentVoxel;
94  }
95  else
96  {
97  return getVoxelAt(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
98  }
99  }
100 
104  template <typename VoxelType>
106  {
107  setPosition(v3dNewPos.getX(), v3dNewPos.getY(), v3dNewPos.getZ());
108  }
109 
115  template <typename VoxelType>
117  {
118  // Base version updates position and validity flags.
119  BaseVolume<VoxelType>::template Sampler< SimpleVolume<VoxelType> >::setPosition(xPos, yPos, zPos);
120 
121  // Then we update the voxel pointer
122  if(this->isCurrentPositionValid())
123  {
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;
127 
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));
131 
132  const uint32_t uVoxelIndexInBlock = uXPosInBlock +
133  uYPosInBlock * this->mVolume->m_uBlockSideLength +
134  uZPosInBlock * this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
135 
136  Block* pUncompressedCurrentBlock = this->mVolume->getUncompressedBlock(uXBlock, uYBlock, uZBlock);
137 
138  mCurrentVoxel = pUncompressedCurrentBlock->m_tUncompressedData + uVoxelIndexInBlock;
139  }
140  else
141  {
142  mCurrentVoxel = 0;
143  }
144  }
145 
155  template <typename VoxelType>
157  {
158  if(this->m_bIsCurrentPositionValidInX && this->m_bIsCurrentPositionValidInY && this->m_bIsCurrentPositionValidInZ)
159  {
160  *mCurrentVoxel = tValue;
161  return true;
162  }
163  else
164  {
165  return false;
166  }
167  }
168 
169  template <typename VoxelType>
171  {
172  // We'll need this in a moment...
173  bool bIsOldPositionValid = this->isCurrentPositionValid();
174 
175  // Base version updates position and validity flags.
177 
178  // Then we update the voxel pointer
179  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
180  {
181  //No need to compute new block.
182  ++mCurrentVoxel;
183  }
184  else
185  {
186  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
187  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
188  }
189  }
190 
191  template <typename VoxelType>
193  {
194  // We'll need this in a moment...
195  bool bIsOldPositionValid = this->isCurrentPositionValid();
196 
197  // Base version updates position and validity flags.
199 
200  // Then we update the voxel pointer
201  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
202  {
203  //No need to compute new block.
204  mCurrentVoxel += this->mVolume->m_uBlockSideLength;
205  }
206  else
207  {
208  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
209  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
210  }
211  }
212 
213  template <typename VoxelType>
215  {
216  // We'll need this in a moment...
217  bool bIsOldPositionValid = this->isCurrentPositionValid();
218 
219  // Base version updates position and validity flags.
221 
222  // Then we update the voxel pointer
223  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume) % this->mVolume->m_uBlockSideLength != 0))
224  {
225  //No need to compute new block.
226  mCurrentVoxel += this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
227  }
228  else
229  {
230  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
231  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
232  }
233  }
234 
235  template <typename VoxelType>
237  {
238  // We'll need this in a moment...
239  bool bIsOldPositionValid = this->isCurrentPositionValid();
240 
241  // Base version updates position and validity flags.
243 
244  // Then we update the voxel pointer
245  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mXPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
246  {
247  //No need to compute new block.
248  --mCurrentVoxel;
249  }
250  else
251  {
252  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
253  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
254  }
255  }
256 
257  template <typename VoxelType>
259  {
260  // We'll need this in a moment...
261  bool bIsOldPositionValid = this->isCurrentPositionValid();
262 
263  // Base version updates position and validity flags.
265 
266  // Then we update the voxel pointer
267  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mYPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
268  {
269  //No need to compute new block.
270  mCurrentVoxel -= this->mVolume->m_uBlockSideLength;
271  }
272  else
273  {
274  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
275  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
276  }
277  }
278 
279  template <typename VoxelType>
281  {
282  // We'll need this in a moment...
283  bool bIsOldPositionValid = this->isCurrentPositionValid();
284 
285  // Base version updates position and validity flags.
287 
288  // Then we update the voxel pointer
289  if((this->isCurrentPositionValid()) && bIsOldPositionValid && ((this->mZPosInVolume + 1) % this->mVolume->m_uBlockSideLength != 0))
290  {
291  //No need to compute new block.
292  mCurrentVoxel -= this->mVolume->m_uBlockSideLength * this->mVolume->m_uBlockSideLength;
293  }
294  else
295  {
296  //We've hit the block boundary. Just calling setPosition() is the easiest way to resolve this.
297  setPosition(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume);
298  }
299  }
300 
301  template <typename VoxelType>
303  {
304  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
305  {
306  return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
307  }
308  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
309  }
310 
311  template <typename VoxelType>
313  {
314  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) )
315  {
316  return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength);
317  }
318  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
319  }
320 
321  template <typename VoxelType>
323  {
324  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
325  {
326  return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
327  }
328  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
329  }
330 
331  template <typename VoxelType>
333  {
334  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
335  {
336  return *(mCurrentVoxel - 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
337  }
338  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
339  }
340 
341  template <typename VoxelType>
343  {
344  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) )
345  {
346  return *(mCurrentVoxel - 1);
347  }
348  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
349  }
350 
351  template <typename VoxelType>
353  {
354  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
355  {
356  return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
357  }
358  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
359  }
360 
361  template <typename VoxelType>
363  {
364  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
365  {
366  return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
367  }
368  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
369  }
370 
371  template <typename VoxelType>
373  {
374  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) )
375  {
376  return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength);
377  }
378  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
379  }
380 
381  template <typename VoxelType>
383  {
384  if((this->isCurrentPositionValid()) && CAN_GO_NEG_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
385  {
386  return *(mCurrentVoxel - 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
387  }
388  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume-1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
389  }
390 
392 
393  template <typename VoxelType>
395  {
396  if((this->isCurrentPositionValid()) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
397  {
398  return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
399  }
400  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
401  }
402 
403  template <typename VoxelType>
405  {
406  if((this->isCurrentPositionValid()) && CAN_GO_NEG_Y(this->mYPosInVolume) )
407  {
408  return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength);
409  }
410  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
411  }
412 
413  template <typename VoxelType>
415  {
416  if((this->isCurrentPositionValid()) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
417  {
418  return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
419  }
420  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
421  }
422 
423  template <typename VoxelType>
425  {
426  if((this->isCurrentPositionValid()) && CAN_GO_NEG_Z(this->mZPosInVolume) )
427  {
428  return *(mCurrentVoxel - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
429  }
430  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
431  }
432 
433  template <typename VoxelType>
435  {
436  if((this->isCurrentPositionValid()))
437  {
438  return *mCurrentVoxel;
439  }
440  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume, this->mYPosInVolume, this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
441  }
442 
443  template <typename VoxelType>
445  {
446  if((this->isCurrentPositionValid()) && CAN_GO_POS_Z(this->mZPosInVolume) )
447  {
448  return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
449  }
450  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
451  }
452 
453  template <typename VoxelType>
455  {
456  if((this->isCurrentPositionValid()) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
457  {
458  return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
459  }
460  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
461  }
462 
463  template <typename VoxelType>
465  {
466  if((this->isCurrentPositionValid()) && CAN_GO_POS_Y(this->mYPosInVolume) )
467  {
468  return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength);
469  }
470  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
471  }
472 
473  template <typename VoxelType>
475  {
476  if((this->isCurrentPositionValid()) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
477  {
478  return *(mCurrentVoxel + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
479  }
480  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
481  }
482 
484 
485  template <typename VoxelType>
487  {
488  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
489  {
490  return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
491  }
492  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
493  }
494 
495  template <typename VoxelType>
497  {
498  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) )
499  {
500  return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength);
501  }
502  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
503  }
504 
505  template <typename VoxelType>
507  {
508  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_NEG_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
509  {
510  return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
511  }
512  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume-1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
513  }
514 
515  template <typename VoxelType>
517  {
518  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
519  {
520  return *(mCurrentVoxel + 1 - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
521  }
522  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
523  }
524 
525  template <typename VoxelType>
527  {
528  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) )
529  {
530  return *(mCurrentVoxel + 1);
531  }
532  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
533  }
534 
535  template <typename VoxelType>
537  {
538  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
539  {
540  return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
541  }
542  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
543  }
544 
545  template <typename VoxelType>
547  {
548  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_NEG_Z(this->mZPosInVolume) )
549  {
550  return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength - this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
551  }
552  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume-1,this->m_eWrapMode, this->m_tBorder);
553  }
554 
555  template <typename VoxelType>
557  {
558  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) )
559  {
560  return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength);
561  }
562  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume,this->m_eWrapMode, this->m_tBorder);
563  }
564 
565  template <typename VoxelType>
567  {
568  if((this->isCurrentPositionValid()) && CAN_GO_POS_X(this->mXPosInVolume) && CAN_GO_POS_Y(this->mYPosInVolume) && CAN_GO_POS_Z(this->mZPosInVolume) )
569  {
570  return *(mCurrentVoxel + 1 + this->mVolume->m_uBlockSideLength + this->mVolume->m_uBlockSideLength*this->mVolume->m_uBlockSideLength);
571  }
572  return this->mVolume->getVoxelWithWrapping(this->mXPosInVolume+1,this->mYPosInVolume+1,this->mZPosInVolume+1,this->m_eWrapMode, this->m_tBorder);
573  }
574 }
575 
576 #undef CAN_GO_NEG_X
577 #undef CAN_GO_POS_X
578 #undef CAN_GO_NEG_Y
579 #undef CAN_GO_POS_Y
580 #undef CAN_GO_NEG_Z
581 #undef CAN_GO_POS_Z