From d2cd3e7c6285808d4e184d22e8c64e6c6d50f1b0 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 26 Jan 2012 18:17:18 +0100 Subject: [PATCH] Work on refactoring voxel type. --- library/PolyVoxCore/CMakeLists.txt | 1 + .../PolyVoxCore/include/PolyVoxCore/Density.h | 16 +++++++- .../include/PolyVoxCore/Material.h | 36 ++++++++++++++++-- .../include/PolyVoxCore/MaterialDensityPair.h | 4 ++ .../include/PolyVoxCore/SurfaceExtractor.inl | 18 +++++++-- library/PolyVoxCore/source/Density.cpp | 12 ++++++ library/PolyVoxCore/source/Material.cpp | 38 +++++++++++++++++++ .../source/MaterialDensityPair.cpp | 4 ++ 8 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 library/PolyVoxCore/source/Material.cpp diff --git a/library/PolyVoxCore/CMakeLists.txt b/library/PolyVoxCore/CMakeLists.txt index 5c73631e..cd5ae9eb 100644 --- a/library/PolyVoxCore/CMakeLists.txt +++ b/library/PolyVoxCore/CMakeLists.txt @@ -9,6 +9,7 @@ SET(CORE_SRC_FILES source/Density.cpp source/GradientEstimators.cpp source/Log.cpp + source/Material.cpp source/MaterialDensityPair.cpp source/MeshDecimator.cpp source/Region.cpp diff --git a/library/PolyVoxCore/include/PolyVoxCore/Density.h b/library/PolyVoxCore/include/PolyVoxCore/Density.h index 25f262a8..cd1c0764 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/Density.h +++ b/library/PolyVoxCore/include/PolyVoxCore/Density.h @@ -70,10 +70,10 @@ namespace PolyVox } DensityType getDensity() const throw() { return m_uDensity; } - MaterialType getMaterial() const throw() { return 1; } + //MaterialType getMaterial() const throw() { return 1; } void setDensity(DensityType uDensity) { m_uDensity = uDensity; } - void setMaterial(MaterialType /*uMaterial*/) { assert(false); } //Cannot set material on voxel of type Density + //void setMaterial(MaterialType /*uMaterial*/) { assert(false); } //Cannot set material on voxel of type Density //static DensityType getMaxDensity() throw() { return (std::numeric_limits::max)(); } //static DensityType getMinDensity() throw() { return (std::numeric_limits::min)(); } @@ -103,6 +103,8 @@ namespace PolyVox class VoxelTypeTraits< DensityI8 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityI8::DensityType MinDensity; const static DensityI8::DensityType MaxDensity; }; @@ -111,6 +113,8 @@ namespace PolyVox class VoxelTypeTraits< DensityU8 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityU8::DensityType MinDensity; const static DensityU8::DensityType MaxDensity; }; @@ -119,6 +123,8 @@ namespace PolyVox class VoxelTypeTraits< DensityI16 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityI16::DensityType MinDensity; const static DensityI16::DensityType MaxDensity; }; @@ -127,6 +133,8 @@ namespace PolyVox class VoxelTypeTraits< DensityU16 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityU16::DensityType MinDensity; const static DensityU16::DensityType MaxDensity; }; @@ -135,6 +143,8 @@ namespace PolyVox class VoxelTypeTraits< DensityFloat > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityFloat::DensityType MinDensity; const static DensityFloat::DensityType MaxDensity; }; @@ -143,6 +153,8 @@ namespace PolyVox class VoxelTypeTraits< DensityDouble > { public: + const static bool HasDensity; + const static bool HasMaterial; const static DensityDouble::DensityType MinDensity; const static DensityDouble::DensityType MaxDensity; }; diff --git a/library/PolyVoxCore/include/PolyVoxCore/Material.h b/library/PolyVoxCore/include/PolyVoxCore/Material.h index ec91c9c0..fb48d3ff 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/Material.h +++ b/library/PolyVoxCore/include/PolyVoxCore/Material.h @@ -97,9 +97,39 @@ namespace PolyVox MaterialType m_uMaterial; }; - typedef Material Material8; - typedef Material Material16; - typedef Material Material32; + typedef Material MaterialU8; + typedef Material MaterialU16; + typedef Material MaterialU32; + + // These types are here for backwards compatibility but they are a little ambiguous as the name doesn't indicate + // whether the values are signed. We would recommend using one of the 8, 16, or 32 bit predefined types above instead. + typedef MaterialU8 Material8; + typedef MaterialU16 Material16; + typedef MaterialU32 Material32; + + template<> + class VoxelTypeTraits< MaterialU8 > + { + public: + const static bool HasDensity; + const static bool HasMaterial; + }; + + template<> + class VoxelTypeTraits< MaterialU16 > + { + public: + const static bool HasDensity; + const static bool HasMaterial; + }; + + template<> + class VoxelTypeTraits< MaterialU32 > + { + public: + const static bool HasDensity; + const static bool HasMaterial; + }; } #endif //__PolyVox_Material_H__ diff --git a/library/PolyVoxCore/include/PolyVoxCore/MaterialDensityPair.h b/library/PolyVoxCore/include/PolyVoxCore/MaterialDensityPair.h index a81981dd..bef6424d 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MaterialDensityPair.h +++ b/library/PolyVoxCore/include/PolyVoxCore/MaterialDensityPair.h @@ -90,6 +90,8 @@ namespace PolyVox class VoxelTypeTraits< MaterialDensityPair44 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static MaterialDensityPair44::DensityType MinDensity; const static MaterialDensityPair44::DensityType MaxDensity; }; @@ -98,6 +100,8 @@ namespace PolyVox class VoxelTypeTraits< MaterialDensityPair88 > { public: + const static bool HasDensity; + const static bool HasMaterial; const static MaterialDensityPair88::DensityType MinDensity; const static MaterialDensityPair88::DensityType MaxDensity; }; diff --git a/library/PolyVoxCore/include/PolyVoxCore/SurfaceExtractor.inl b/library/PolyVoxCore/include/PolyVoxCore/SurfaceExtractor.inl index a5469ff2..bbba8559 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/SurfaceExtractor.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/SurfaceExtractor.inl @@ -445,7 +445,11 @@ namespace PolyVox //Choose one of the two materials to use for the vertex (we don't interpolate as interpolation of //material IDs does not make sense). We take the largest, so that if we are working on a material-only //volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component. - const uint32_t uMaterial = (std::max)(v000.getMaterial(), v100.getMaterial()); + uint32_t uMaterial = 0; + if(VoxelTypeTraits::HasMaterial) + { + uMaterial = (std::max)(v000.getMaterial(), v100.getMaterial()); + } PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast(uMaterial)); uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); @@ -471,7 +475,11 @@ namespace PolyVox //Choose one of the two materials to use for the vertex (we don't interpolate as interpolation of //material IDs does not make sense). We take the largest, so that if we are working on a material-only //volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component. - const uint32_t uMaterial = (std::max)(v000.getMaterial(), v010.getMaterial()); + uint32_t uMaterial = 0; + if(VoxelTypeTraits::HasMaterial) + { + uMaterial = (std::max)(v000.getMaterial(), v010.getMaterial()); + } PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast(uMaterial)); uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); @@ -497,7 +505,11 @@ namespace PolyVox //Choose one of the two materials to use for the vertex (we don't interpolate as interpolation of //material IDs does not make sense). We take the largest, so that if we are working on a material-only //volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component. - const uint32_t uMaterial = (std::max)(v000.getMaterial(), v001.getMaterial()); + uint32_t uMaterial = 0; + if(VoxelTypeTraits::HasMaterial) + { + uMaterial = (std::max)(v000.getMaterial(), v001.getMaterial()); + } PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast(uMaterial)); uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex); diff --git a/library/PolyVoxCore/source/Density.cpp b/library/PolyVoxCore/source/Density.cpp index b4529443..ca6a202b 100644 --- a/library/PolyVoxCore/source/Density.cpp +++ b/library/PolyVoxCore/source/Density.cpp @@ -27,21 +27,33 @@ freely, subject to the following restrictions: namespace PolyVox { + const bool VoxelTypeTraits< DensityI8 >::HasDensity = true; + const bool VoxelTypeTraits< DensityI8 >::HasMaterial = false; const DensityI8::DensityType VoxelTypeTraits< DensityI8 >::MinDensity = -127; const DensityI8::DensityType VoxelTypeTraits< DensityI8 >::MaxDensity = 127; + const bool VoxelTypeTraits< DensityU8 >::HasDensity = true; + const bool VoxelTypeTraits< DensityU8 >::HasMaterial = false; const DensityU8::DensityType VoxelTypeTraits< DensityU8 >::MinDensity = 0; const DensityU8::DensityType VoxelTypeTraits< DensityU8 >::MaxDensity = 255; + const bool VoxelTypeTraits< DensityI16 >::HasDensity = true; + const bool VoxelTypeTraits< DensityI16 >::HasMaterial = false; const DensityI16::DensityType VoxelTypeTraits< DensityI16 >::MinDensity = -32767; const DensityI16::DensityType VoxelTypeTraits< DensityI16 >::MaxDensity = 32767; + const bool VoxelTypeTraits< DensityU16 >::HasDensity = true; + const bool VoxelTypeTraits< DensityU16 >::HasMaterial = false; const DensityU16::DensityType VoxelTypeTraits< DensityU16 >::MinDensity = 0; const DensityU16::DensityType VoxelTypeTraits< DensityU16 >::MaxDensity = 65535; + const bool VoxelTypeTraits< DensityFloat >::HasDensity = true; + const bool VoxelTypeTraits< DensityFloat >::HasMaterial = false; const DensityFloat::DensityType VoxelTypeTraits< DensityFloat >::MinDensity = FLT_MIN; const DensityFloat::DensityType VoxelTypeTraits< DensityFloat >::MaxDensity = FLT_MAX; + const bool VoxelTypeTraits< DensityDouble >::HasDensity = true; + const bool VoxelTypeTraits< DensityDouble >::HasMaterial = false; const DensityDouble::DensityType VoxelTypeTraits< DensityDouble >::MinDensity = DBL_MIN; const DensityDouble::DensityType VoxelTypeTraits< DensityDouble >::MaxDensity = DBL_MAX; } \ No newline at end of file diff --git a/library/PolyVoxCore/source/Material.cpp b/library/PolyVoxCore/source/Material.cpp new file mode 100644 index 00000000..5b3caa6f --- /dev/null +++ b/library/PolyVoxCore/source/Material.cpp @@ -0,0 +1,38 @@ +/******************************************************************************* +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 "PolyVoxCore/Material.h" + +#include //Can't use as we need compile time constants. + +namespace PolyVox +{ + const bool VoxelTypeTraits< MaterialU8 >::HasDensity = false; + const bool VoxelTypeTraits< MaterialU8 >::HasMaterial = true; + + const bool VoxelTypeTraits< MaterialU16 >::HasDensity = false; + const bool VoxelTypeTraits< MaterialU16 >::HasMaterial = true; + + const bool VoxelTypeTraits< MaterialU32 >::HasDensity = false; + const bool VoxelTypeTraits< MaterialU32 >::HasMaterial = true; +} \ No newline at end of file diff --git a/library/PolyVoxCore/source/MaterialDensityPair.cpp b/library/PolyVoxCore/source/MaterialDensityPair.cpp index 7983d4cc..5cc2b9a7 100644 --- a/library/PolyVoxCore/source/MaterialDensityPair.cpp +++ b/library/PolyVoxCore/source/MaterialDensityPair.cpp @@ -25,9 +25,13 @@ freely, subject to the following restrictions: namespace PolyVox { + const bool VoxelTypeTraits< MaterialDensityPair44 >::HasDensity = true; + const bool VoxelTypeTraits< MaterialDensityPair44 >::HasMaterial = true; const MaterialDensityPair44::DensityType VoxelTypeTraits< MaterialDensityPair44 >::MinDensity = 0; const MaterialDensityPair44::DensityType VoxelTypeTraits< MaterialDensityPair44 >::MaxDensity = 15; + const bool VoxelTypeTraits< MaterialDensityPair88 >::HasDensity = true; + const bool VoxelTypeTraits< MaterialDensityPair88 >::HasMaterial = true; const MaterialDensityPair88::DensityType VoxelTypeTraits< MaterialDensityPair88 >::MinDensity = 0; const MaterialDensityPair88::DensityType VoxelTypeTraits< MaterialDensityPair88 >::MaxDensity = 255; }