/******************************************************************************* * The MIT License (MIT) * * Copyright (c) 2015 David Williams and Matthew Williams * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *******************************************************************************/ #ifndef __PolyVox_BaseVolume_H__ #define __PolyVox_BaseVolume_H__ #include "Region.h" #include "Vector.h" #include namespace PolyVox { /// The BaseVolume class provides common functionality and an interface for other volume classes to implement. You should not try to create an instance of this /// class directly. Instead you should use RawVolume or PagedVolume. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// More details to come... //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// template class BaseVolume { public: typedef _VoxelType VoxelType; #ifndef SWIG template class Sampler { public: Sampler(DerivedVolumeType* volume); ~Sampler(); Vector3DInt32 getPosition(void) const; inline VoxelType getVoxel(void) const; void setPosition(const Vector3DInt32& v3dNewPos); void setPosition(int32_t xPos, int32_t yPos, int32_t zPos); inline bool setVoxel(VoxelType tValue); void movePositiveX(void); void movePositiveY(void); void movePositiveZ(void); void moveNegativeX(void); void moveNegativeY(void); void moveNegativeZ(void); inline VoxelType peekVoxel1nx1ny1nz(void) const; inline VoxelType peekVoxel1nx1ny0pz(void) const; inline VoxelType peekVoxel1nx1ny1pz(void) const; inline VoxelType peekVoxel1nx0py1nz(void) const; inline VoxelType peekVoxel1nx0py0pz(void) const; inline VoxelType peekVoxel1nx0py1pz(void) const; inline VoxelType peekVoxel1nx1py1nz(void) const; inline VoxelType peekVoxel1nx1py0pz(void) const; inline VoxelType peekVoxel1nx1py1pz(void) const; inline VoxelType peekVoxel0px1ny1nz(void) const; inline VoxelType peekVoxel0px1ny0pz(void) const; inline VoxelType peekVoxel0px1ny1pz(void) const; inline VoxelType peekVoxel0px0py1nz(void) const; inline VoxelType peekVoxel0px0py0pz(void) const; inline VoxelType peekVoxel0px0py1pz(void) const; inline VoxelType peekVoxel0px1py1nz(void) const; inline VoxelType peekVoxel0px1py0pz(void) const; inline VoxelType peekVoxel0px1py1pz(void) const; inline VoxelType peekVoxel1px1ny1nz(void) const; inline VoxelType peekVoxel1px1ny0pz(void) const; inline VoxelType peekVoxel1px1ny1pz(void) const; inline VoxelType peekVoxel1px0py1nz(void) const; inline VoxelType peekVoxel1px0py0pz(void) const; inline VoxelType peekVoxel1px0py1pz(void) const; inline VoxelType peekVoxel1px1py1nz(void) const; inline VoxelType peekVoxel1px1py0pz(void) const; inline VoxelType peekVoxel1px1py1pz(void) const; protected: DerivedVolumeType* mVolume; //The current position in the volume int32_t mXPosInVolume; int32_t mYPosInVolume; int32_t mZPosInVolume; }; #endif // SWIG public: /// Gets a voxel at the position given by x,y,z coordinates VoxelType getVoxel(int32_t uXPos, int32_t uYPos, int32_t uZPos) const; /// Gets a voxel at the position given by a 3D vector VoxelType getVoxel(const Vector3DInt32& v3dPos) const; /// Sets the voxel at the position given by x,y,z coordinates void setVoxel(int32_t uXPos, int32_t uYPos, int32_t uZPos, VoxelType tValue); /// Sets the voxel at the position given by a 3D vector void setVoxel(const Vector3DInt32& v3dPos, VoxelType tValue); /// Calculates approximatly how many bytes of memory the volume is currently using. uint32_t calculateSizeInBytes(void); protected: /// Constructor for creating a volume. BaseVolume(); /// Copy constructor BaseVolume(const BaseVolume& rhs); /// Destructor ~BaseVolume(); /// Assignment operator BaseVolume& operator=(const BaseVolume& rhs); }; } #include "BaseVolume.inl" #include "BaseVolumeSampler.inl" #endif //__PolyVox_BaseVolume_H__