Work on refactoring voxel type.

This commit is contained in:
unknown
2012-01-26 18:17:18 +01:00
parent 3c0bbf1d4b
commit d2cd3e7c62
8 changed files with 121 additions and 8 deletions

View File

@ -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<DensityType>::max)(); }
//static DensityType getMinDensity() throw() { return (std::numeric_limits<DensityType>::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;
};

View File

@ -97,9 +97,39 @@ namespace PolyVox
MaterialType m_uMaterial;
};
typedef Material<uint8_t> Material8;
typedef Material<uint16_t> Material16;
typedef Material<uint32_t> Material32;
typedef Material<uint8_t> MaterialU8;
typedef Material<uint16_t> MaterialU16;
typedef Material<uint32_t> 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__

View File

@ -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;
};

View File

@ -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<VoxelType>::HasMaterial)
{
uMaterial = (std::max)(v000.getMaterial(), v100.getMaterial());
}
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast<float>(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<VoxelType>::HasMaterial)
{
uMaterial = (std::max)(v000.getMaterial(), v010.getMaterial());
}
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast<float>(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<VoxelType>::HasMaterial)
{
uMaterial = (std::max)(v000.getMaterial(), v001.getMaterial());
}
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, static_cast<float>(uMaterial));
uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex);