/******************************************************************************* Copyright (c) 2005-2009 David Williams This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. *******************************************************************************/ #include "PolyVox/Impl/Utility.h" namespace PolyVox { template template BaseVolume::Sampler::Sampler(DerivedVolumeType* volume) :mVolume(volume) ,mXPosInVolume(0) ,mYPosInVolume(0) ,mZPosInVolume(0) ,m_eWrapMode(WrapModes::Border) ,m_tBorder() ,m_bIsCurrentPositionValidInX(false) ,m_bIsCurrentPositionValidInY(false) ,m_bIsCurrentPositionValidInZ(false) { } template template BaseVolume::Sampler::~Sampler() { } template template Vector3DInt32 BaseVolume::Sampler::getPosition(void) const { return Vector3DInt32(mXPosInVolume, mYPosInVolume, mZPosInVolume); } template template VoxelType BaseVolume::Sampler::getVoxel(void) const { return mVolume->getVoxel(mXPosInVolume, mYPosInVolume, mZPosInVolume, WrapModes::Validate); // FIXME - Use templatised version instead but watch for Linux compile errors. } template template bool inline BaseVolume::Sampler::isCurrentPositionValid(void) const { return m_bIsCurrentPositionValidInX && m_bIsCurrentPositionValidInY && m_bIsCurrentPositionValidInZ; } template template void BaseVolume::Sampler::setPosition(const Vector3DInt32& v3dNewPos) { setPosition(v3dNewPos.getX(), v3dNewPos.getY(), v3dNewPos.getZ()); } template template void BaseVolume::Sampler::setPosition(int32_t xPos, int32_t yPos, int32_t zPos) { mXPosInVolume = xPos; mYPosInVolume = yPos; mZPosInVolume = zPos; m_bIsCurrentPositionValidInX = mVolume->getEnclosingRegion().containsPointInX(xPos); m_bIsCurrentPositionValidInY = mVolume->getEnclosingRegion().containsPointInY(yPos); m_bIsCurrentPositionValidInZ = mVolume->getEnclosingRegion().containsPointInZ(zPos); } template template bool BaseVolume::Sampler::setVoxel(VoxelType tValue) { return mVolume->setVoxelAt(mXPosInVolume, mYPosInVolume, mZPosInVolume, tValue); } template template void BaseVolume::Sampler::setWrapMode(WrapMode eWrapMode, VoxelType tBorder) { m_eWrapMode = eWrapMode; m_tBorder = tBorder; } template template void BaseVolume::Sampler::movePositiveX(void) { mXPosInVolume++; m_bIsCurrentPositionValidInX = mVolume->getEnclosingRegion().containsPointInX(mXPosInVolume); } template template void BaseVolume::Sampler::movePositiveY(void) { mYPosInVolume++; m_bIsCurrentPositionValidInY = mVolume->getEnclosingRegion().containsPointInY(mYPosInVolume); } template template void BaseVolume::Sampler::movePositiveZ(void) { mZPosInVolume++; m_bIsCurrentPositionValidInZ = mVolume->getEnclosingRegion().containsPointInZ(mZPosInVolume); } template template void BaseVolume::Sampler::moveNegativeX(void) { mXPosInVolume--; m_bIsCurrentPositionValidInX = mVolume->getEnclosingRegion().containsPointInX(mXPosInVolume); } template template void BaseVolume::Sampler::moveNegativeY(void) { mYPosInVolume--; m_bIsCurrentPositionValidInY = mVolume->getEnclosingRegion().containsPointInY(mYPosInVolume); } template template void BaseVolume::Sampler::moveNegativeZ(void) { mZPosInVolume--; m_bIsCurrentPositionValidInZ = mVolume->getEnclosingRegion().containsPointInZ(mZPosInVolume); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1ny1nz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume - 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1ny0pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume - 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1ny1pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume - 1, mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx0py1nz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume , mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx0py0pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume , mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx0py1pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume , mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1py1nz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume + 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1py0pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume + 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1nx1py1pz(void) const { return getVoxelImpl(mXPosInVolume - 1, mYPosInVolume + 1, mZPosInVolume + 1); } ////////////////////////////////////////////////////////////////////////// template template VoxelType BaseVolume::Sampler::peekVoxel0px1ny1nz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume - 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel0px1ny0pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume - 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel0px1ny1pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume - 1, mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel0px0py1nz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume , mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel0px0py0pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume , mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel0px0py1pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume , mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel0px1py1nz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume + 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel0px1py0pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume + 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel0px1py1pz(void) const { return getVoxelImpl(mXPosInVolume , mYPosInVolume + 1, mZPosInVolume + 1); } ////////////////////////////////////////////////////////////////////////// template template VoxelType BaseVolume::Sampler::peekVoxel1px1ny1nz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume - 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1px1ny0pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume - 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1px1ny1pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume - 1, mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1px0py1nz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume , mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1px0py0pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume , mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1px0py1pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume , mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1px1py1nz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume + 1, mZPosInVolume - 1); } template template VoxelType BaseVolume::Sampler::peekVoxel1px1py0pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume + 1, mZPosInVolume ); } template template VoxelType BaseVolume::Sampler::peekVoxel1px1py1pz(void) const { return getVoxelImpl(mXPosInVolume + 1, mYPosInVolume + 1, mZPosInVolume + 1); } template template VoxelType BaseVolume::Sampler::getVoxelImpl(int32_t uXPos, int32_t uYPos, int32_t uZPos) const { switch(m_eWrapMode) { case WrapModes::Validate: return mVolume->getVoxel(uXPos, uYPos, uZPos, WrapModes::Validate, m_tBorder); case WrapModes::Clamp: return mVolume->getVoxel(uXPos, uYPos, uZPos, WrapModes::Clamp, m_tBorder); case WrapModes::Border: return mVolume->getVoxel(uXPos, uYPos, uZPos, WrapModes::Border, m_tBorder); case WrapModes::AssumeValid: return mVolume->getVoxel(uXPos, uYPos, uZPos, WrapModes::AssumeValid, m_tBorder); default: // Should never happen POLYVOX_ASSERT(false, "Invalid wrap mode"); return VoxelType(); } } }