#pragma once #include "Voxel/Water.h" ///////////////////////////////////////////////////// // template implementation file for Region.h namespace RBX { namespace Voxel { template const Region Region::kEndRegion(NULL, Vector3int16::one(), Vector3int16::zero()); template const typename Region::iterator Region::kEndIterator(Region::kEndRegion); template const typename Region::xline_iterator Region::kEndXLineIterator(Region::kEndRegion); template Region::Region() : internalStorage(NULL), minCoords(Vector3int16::zero()), maxCoords(Vector3int16::zero()) {} template Region::Region(const InternalStorageType* internalStorage, const Vector3int16& minCoords, const Vector3int16& maxCoords) : internalStorage(internalStorage), minCoords(minCoords), maxCoords(maxCoords) {} template bool Region::isGuaranteedAllEmpty() const { return internalStorage == NULL; } template bool Region::contains(const Vector3int16& globalCoord) const { return globalCoord.isBetweenInclusive(minCoords, maxCoords); } template const Cell& Region::voxelAt( const Vector3int16& globalCoord) const { RBXASSERT_SLOW(contains(globalCoord)); if (isGuaranteedAllEmpty()) { return Constants::kUniqueEmptyCellRepresentation; } else { return voxelAtSkipAllEmptyCheck(globalCoord); } } template CellMaterial Region::materialAt( const Vector3int16& globalCoord) const { RBXASSERT_SLOW(contains(globalCoord)); if (isGuaranteedAllEmpty()) { return CELL_MATERIAL_Water; } else { unsigned int index = internalStorage->voxelCoordToArrayIndex(globalCoord); return readMaterial(&internalStorage->getConstMaterial()[0], index, internalStorage->getConstData()[index]); } } template bool Region::hasWaterAt( const Vector3int16& globalCoord) const { RBXASSERT_SLOW(contains(globalCoord)); if (isGuaranteedAllEmpty()) { return false; } else { return hasWaterAtSkipAllEmptyCheck( voxelAtSkipAllEmptyCheck(globalCoord), globalCoord); } } template typename Region::iterator Region::begin() const { return iterator(*this); } template const typename Region::iterator& Region::end() const { return kEndIterator; } template typename Region::xline_iterator Region::xLineBegin() const { return xline_iterator(*this); } template const typename Region::xline_iterator& Region::xLineEnd() const { return kEndXLineIterator; } template Region& Region::operator=( const Region& other) { internalStorage = other.internalStorage; minCoords = other.minCoords; maxCoords = other.maxCoords; return *this; } template bool Region::operator==( const Region& other) const { return internalStorage == other.internalStorage && minCoords == other.minCoords && maxCoords == other.maxCoords; } template const Cell& Region::voxelAtSkipAllEmptyCheck( const Vector3int16& globalCoord) const { RBXASSERT_SLOW(!isGuaranteedAllEmpty()); return internalStorage->getConstData()[ internalStorage->voxelCoordToArrayIndex(globalCoord)]; } template bool Region::hasWaterAtSkipAllEmptyCheck( const Cell& cell, const Vector3int16& globalCoord) const { RBXASSERT_SLOW(!isGuaranteedAllEmpty()); return Water::cellHasWater(internalStorage, cell, globalCoord); } } }