Templatizing marching cubes extractor on mesh type.

This commit is contained in:
David Williams 2014-08-10 09:18:27 +02:00
parent 29baac9d6d
commit eaea74b7f8
4 changed files with 24 additions and 19 deletions

View File

@ -147,11 +147,11 @@ namespace PolyVox
return result;
}
template< typename VolumeType, typename Controller = DefaultMarchingCubesController<typename VolumeType::VoxelType>, typename IndexType = DefaultIndexType >
template< typename VolumeType, typename MeshType, typename Controller = DefaultMarchingCubesController<typename VolumeType::VoxelType> >
class MarchingCubesSurfaceExtractor
{
public:
MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, Mesh<MarchingCubesVertex<typename VolumeType::VoxelType>, IndexType >* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller());
MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller());
void execute();
@ -318,12 +318,18 @@ namespace PolyVox
typename Controller::DensityType m_tThreshold;
};
template< typename VolumeType, typename MeshType, typename Controller = DefaultMarchingCubesController<typename VolumeType::VoxelType> >
void extractMarchingCubesMesh(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller())
{
MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller> extractor(volData, region, result, eWrapMode, tBorderValue, controller);
extractor.execute();
}
template< typename VolumeType, typename Controller = DefaultMarchingCubesController<typename VolumeType::VoxelType>, typename IndexType = DefaultIndexType >
Mesh<MarchingCubesVertex<typename VolumeType::VoxelType> > extractMarchingCubesMesh(VolumeType* volData, Region region, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), Controller controller = Controller())
{
Mesh<MarchingCubesVertex<typename VolumeType::VoxelType>, IndexType > result;
MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType> extractor(volData, region, &result, eWrapMode, tBorderValue, controller);
extractor.execute();
extractMarchingCubesMesh(volData, region, &result, eWrapMode, tBorderValue, controller);
return result;
}
}

View File

@ -25,8 +25,8 @@ freely, subject to the following restrictions:
namespace PolyVox
{
template<typename VolumeType, typename Controller, typename IndexType>
MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, Mesh<MarchingCubesVertex<typename VolumeType::VoxelType>, IndexType >* result, WrapMode eWrapMode, typename VolumeType::VoxelType tBorderValue, Controller controller)
template<typename VolumeType, typename MeshType, typename Controller>
MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, WrapMode eWrapMode, typename VolumeType::VoxelType tBorderValue, Controller controller)
:m_volData(volData)
,m_sampVolume(volData)
,m_meshCurrent(result)
@ -41,8 +41,8 @@ namespace PolyVox
m_sampVolume.setWrapMode(eWrapMode, tBorderValue);
}
template<typename VolumeType, typename Controller, typename IndexType>
void MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::execute()
template<typename VolumeType, typename MeshType, typename Controller>
void MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::execute()
{
Timer timer;
m_meshCurrent->clear();
@ -129,9 +129,9 @@ namespace PolyVox
<< "x" << m_regSizeInVoxels.getDepthInVoxels() << ")");
}
template<typename VolumeType, typename Controller, typename IndexType>
template<typename VolumeType, typename MeshType, typename Controller>
template<bool isPrevZAvail>
uint32_t MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask)
uint32_t MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask)
{
m_uNoOfOccupiedCells = 0;
@ -195,9 +195,9 @@ namespace PolyVox
return m_uNoOfOccupiedCells;
}
template<typename VolumeType, typename Controller, typename IndexType>
template<typename VolumeType, typename MeshType, typename Controller>
template<bool isPrevXAvail, bool isPrevYAvail, bool isPrevZAvail>
void MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace)
void MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace)
{
uint8_t iCubeIndex = 0;
@ -395,8 +395,8 @@ namespace PolyVox
}
}
template<typename VolumeType, typename Controller, typename IndexType>
void MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::generateVerticesForSlice(const Array2DUint8& pCurrentBitmask,
template<typename VolumeType, typename MeshType, typename Controller>
void MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::generateVerticesForSlice(const Array2DUint8& pCurrentBitmask,
Array2DInt32& m_pCurrentVertexIndicesX,
Array2DInt32& m_pCurrentVertexIndicesY,
Array2DInt32& m_pCurrentVertexIndicesZ)
@ -535,8 +535,8 @@ namespace PolyVox
}
}
template<typename VolumeType, typename Controller, typename IndexType>
void MarchingCubesSurfaceExtractor<VolumeType, Controller, IndexType>::generateIndicesForSlice(const Array2DUint8& pPreviousBitmask,
template<typename VolumeType, typename MeshType, typename Controller>
void MarchingCubesSurfaceExtractor<VolumeType, MeshType, Controller>::generateIndicesForSlice(const Array2DUint8& pPreviousBitmask,
const Array2DInt32& m_pPreviousVertexIndicesX,
const Array2DInt32& m_pPreviousVertexIndicesY,
const Array2DInt32& m_pPreviousVertexIndicesZ,

View File

@ -111,7 +111,7 @@ namespace PolyVox
////////////////////////////////////////////////////////////////////////////////
// MarchingCubesSurfaceExtractor
////////////////////////////////////////////////////////////////////////////////
template<typename VolumeType, typename Controller, typename IndexType > class MarchingCubesSurfaceExtractor;
template<typename VolumeType, typename MeshType, typename Controller> class MarchingCubesSurfaceExtractor;
////////////////////////////////////////////////////////////////////////////////
// MarchingCubesVertex

View File

@ -153,8 +153,7 @@ void testCustomController(Mesh<MarchingCubesVertex<float> >& result)
}
CustomMarchingCubesController controller;
MarchingCubesSurfaceExtractor< SimpleVolume<float>, CustomMarchingCubesController > extractor(&volData, volData.getEnclosingRegion(), &result, WrapModes::Border, 0, controller);
extractor.execute();
extractMarchingCubesMesh(&volData, volData.getEnclosingRegion(), &result, WrapModes::Border, 0, controller);
}
void TestSurfaceExtractor::testExecute()