diff --git a/library/PolyVoxCore/CMakeLists.txt b/library/PolyVoxCore/CMakeLists.txt index 016ae6c4..120f7455 100644 --- a/library/PolyVoxCore/CMakeLists.txt +++ b/library/PolyVoxCore/CMakeLists.txt @@ -21,6 +21,8 @@ SET(CORE_SRC_FILES SET(CORE_INC_FILES include/Array.h include/Array.inl + include/Dimensions.h + include/Dimensions.inl include/GradientEstimators.inl include/SurfaceMesh.h include/Log.h diff --git a/library/PolyVoxCore/include/Array.h b/library/PolyVoxCore/include/Array.h index 17461e7b..4315a7a0 100644 --- a/library/PolyVoxCore/include/Array.h +++ b/library/PolyVoxCore/include/Array.h @@ -49,19 +49,21 @@ namespace PolyVox m_pOffsets = new uint32_t[noOfDims]; // Calculate all the information you need to use the array - m_uNoOfElements=1; - for (uint32_t i=0; ii; k--) - m_pOffsets[i]*=Dimensions[k]; + { + m_pOffsets[i] *= Dimensions[k]; + } } // Allocate new elements, let exception propagate - m_pElements=new ElementType[m_uNoOfElements]; + m_pElements = new ElementType[m_uNoOfElements]; } Array operator [](uint32_t uIndex) @@ -111,6 +113,17 @@ namespace PolyVox friend class Array<2, ElementType>; public: + Array<1, ElementType>(const uint32_t (&Dimensions)[1]) + : m_pElements(0) + ,m_pDimensions(0) + { + m_pDimensions = new uint32_t[1]; + m_pDimensions[0] = Dimensions[0]; + + // Allocate new elements, let exception propagate + m_pElements = new ElementType[m_pDimensions[0]]; + } + ElementType & operator [] (uint32_t uIndex) { assert(uIndex Array3DInt32; ///A 3D Array of unsigned 32-bit values. typedef Array<3,uint32_t> Array3DUint32; -}//namespace Thermite +}//namespace PolyVox #include "Array.inl" diff --git a/library/PolyVoxCore/include/Dimensions.h b/library/PolyVoxCore/include/Dimensions.h new file mode 100644 index 00000000..5b5a00d0 --- /dev/null +++ b/library/PolyVoxCore/include/Dimensions.h @@ -0,0 +1,92 @@ +#pragma region License +/******************************************************************************* +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. +*******************************************************************************/ +#pragma endregion + +#ifndef __PolyVox_Dimensions_H__ +#define __PolyVox_Dimensions_H__ + +#pragma region Headers +#include "PolyVoxImpl/TypeDef.h" +#include "PolyVoxImpl/CPlusPlusZeroXSupport.h" +#pragma endregion + +namespace PolyVox +{ + template + class ArraySizesImpl + { + typedef const uint32_t (&UIntArrayN)[N]; + + friend class ArraySizes; + friend class ArraySizesImpl; + + public: + ArraySizesImpl operator () (uint32_t uSize) + { + return ArraySizesImpl(m_pSizes, uSize); + } + + operator UIntArrayN () const + { + return m_pSizes; + } + + private: + ArraySizesImpl(const uint32_t (&pSizes)[N-1], uint32_t uSize) + { + std::copy(&pSizes[0],&pSizes[N-1],m_pSizes); + m_pSizes[N-1]=uSize; + } + + uint32_t m_pSizes[N]; + }; + + class ArraySizes + { + typedef const uint32_t (&UIntArray1)[1]; + + public: + explicit ArraySizes(uint32_t uSize) + { + m_pSizes[0]=uSize; + } + + ArraySizesImpl<2> operator () (uint32_t uSize) + { + return ArraySizesImpl<2>(m_pSizes, uSize); + } + + operator UIntArray1 () const + { + return m_pSizes; + } + + private: + uint32_t m_pSizes[1]; + }; +}//namespace PolyVox + +#include "Array.inl" + +#endif //__PolyVox_Dimensions_H__ \ No newline at end of file diff --git a/library/PolyVoxCore/include/Vector.h b/library/PolyVoxCore/include/Vector.h index 40e05222..cea5d820 100644 --- a/library/PolyVoxCore/include/Vector.h +++ b/library/PolyVoxCore/include/Vector.h @@ -152,7 +152,7 @@ namespace PolyVox -}//namespace Thermite +}//namespace PolyVox #include "Vector.inl" diff --git a/library/PolyVoxCore/include/Vector.inl b/library/PolyVoxCore/include/Vector.inl index 8d165333..c54f7c42 100644 --- a/library/PolyVoxCore/include/Vector.inl +++ b/library/PolyVoxCore/include/Vector.inl @@ -582,4 +582,4 @@ namespace PolyVox } } #pragma endregion -}//namespace Thermite +}//namespace PolyVox diff --git a/library/PolyVoxCore/source/SurfaceExtractor.cpp b/library/PolyVoxCore/source/SurfaceExtractor.cpp index 4ef3e0c5..85035a4f 100644 --- a/library/PolyVoxCore/source/SurfaceExtractor.cpp +++ b/library/PolyVoxCore/source/SurfaceExtractor.cpp @@ -24,6 +24,7 @@ freely, subject to the following restrictions: #include "SurfaceExtractor.h" #include "Array.h" +#include "Dimensions.h" #include "SurfaceMesh.h" #include "PolyVoxImpl/MarchingCubesTables.h" #include "SurfaceVertex.h" @@ -65,6 +66,7 @@ namespace PolyVox m_pCurrentVertexIndicesY = new int32_t[m_uScratchPadWidth * m_uScratchPadHeight]; m_pCurrentVertexIndicesZ = new int32_t[m_uScratchPadWidth * m_uScratchPadHeight];*/ + //uint32_t Size1 [1]= {m_uScratchPadWidth}; // Array dimensions uint32_t Size2 [2]= {m_uScratchPadWidth, m_uScratchPadHeight}; // Array dimensions /*Array2DInt32 m_pPreviousVertexIndicesX(m_uScratchPadWidth, m_uScratchPadHeight); @@ -74,13 +76,16 @@ namespace PolyVox Array2DInt32 m_pCurrentVertexIndicesY(m_uScratchPadWidth, m_uScratchPadHeight); Array2DInt32 m_pCurrentVertexIndicesZ(m_uScratchPadWidth, m_uScratchPadHeight);*/ - Array2DInt32 m_pPreviousVertexIndicesX(Size2); + Array2DInt32 m_pPreviousVertexIndicesX(ArraySizes(m_uScratchPadWidth)(m_uScratchPadHeight)); Array2DInt32 m_pPreviousVertexIndicesY(Size2); Array2DInt32 m_pPreviousVertexIndicesZ(Size2); Array2DInt32 m_pCurrentVertexIndicesX(Size2); Array2DInt32 m_pCurrentVertexIndicesY(Size2); Array2DInt32 m_pCurrentVertexIndicesZ(Size2); + //Array1DFloat test1d(ArraySizes(10)); + //Array2DFloat test2d(ArraySizes(10)(20)); + /*m_pPreviousVertexIndicesX.resize(Size2);