Turned isQuadNeeded() (which was a stl::function) into a function object.

This commit is contained in:
unknown 2012-08-09 16:06:10 +02:00
parent 36a7e37983
commit 301f93d896
9 changed files with 75 additions and 49 deletions

View File

@ -286,8 +286,8 @@ int main(int argc, char *argv[])
//Extract the surface
SurfaceMesh<PositionMaterialNormal> mesh;
//CubicSurfaceExtractorWithNormals<MaterialDensityPair44> surfaceExtractor(&volData, volData.getEnclosingRegion(), &mesh);
MarchingCubesSurfaceExtractor< LargeVolume<MaterialDensityPair44> > surfaceExtractor(&volData, reg, &mesh);
CubicSurfaceExtractorWithNormals< LargeVolume<MaterialDensityPair44> > surfaceExtractor(&volData, reg, &mesh);
//MarchingCubesSurfaceExtractor< LargeVolume<MaterialDensityPair44> > surfaceExtractor(&volData, reg, &mesh);
//CubicSurfaceExtractorWithNormals<MaterialDensityPair44> surfaceExtractor(&volData, reg, &mesh);
surfaceExtractor.execute();
std::cout << "#vertices: " << mesh.getNoOfVertices() << std::endl;

View File

@ -32,6 +32,7 @@ SET(CORE_INC_FILES
include/PolyVoxCore/CubicSurfaceExtractor.inl
include/PolyVoxCore/CubicSurfaceExtractorWithNormals.h
include/PolyVoxCore/CubicSurfaceExtractorWithNormals.inl
include/PolyVoxCore/DefaultIsQuadNeeded.h
include/PolyVoxCore/DefaultMarchingCubesController.h
include/PolyVoxCore/Density.h
include/PolyVoxCore/GradientEstimators.h

View File

@ -24,39 +24,24 @@ freely, subject to the following restrictions:
#ifndef __PolyVox_CubicSurfaceExtractorWithNormals_H__
#define __PolyVox_CubicSurfaceExtractorWithNormals_H__
#include "PolyVoxImpl/MarchingCubesTables.h"
#include "PolyVoxCore/DefaultIsQuadNeeded.h"
#include "PolyVoxCore/Array.h"
#include "PolyVoxCore/SurfaceMesh.h"
namespace PolyVox
{
//FIXME - Make this a member of CubicSurfaceExtractorWithNormals?
template<typename VoxelType>
bool defaultIsQuadNeeded(VoxelType back, VoxelType front, float& materialToUse)
{
if((back > 0) && (front == 0))
{
materialToUse = static_cast<float>(back);
return true;
}
else
{
return false;
}
}
template<typename VolumeType>
template<typename VolumeType, typename IsQuadNeeded = DefaultIsQuadNeeded<typename VolumeType::VoxelType> >
class CubicSurfaceExtractorWithNormals
{
public:
CubicSurfaceExtractorWithNormals(VolumeType* volData, Region region, SurfaceMesh<PositionMaterialNormal>* result, polyvox_function<bool(typename VolumeType::VoxelType from, typename VolumeType::VoxelType to, float& materialToUse)> funcIsQuadNeededCallback = defaultIsQuadNeeded<typename VolumeType::VoxelType>);
CubicSurfaceExtractorWithNormals(VolumeType* volData, Region region, SurfaceMesh<PositionMaterialNormal>* result, IsQuadNeeded isQuadNeeded = IsQuadNeeded());
void execute();
private:
polyvox_function<bool(typename VolumeType::VoxelType voxel0, typename VolumeType::VoxelType voxel1, float& materialToUse)> m_funcIsQuadNeededCallback;
//polyvox_function<bool(typename VolumeType::VoxelType voxel0, typename VolumeType::VoxelType voxel1, float& materialToUse)> m_funcIsQuadNeededCallback;
IsQuadNeeded m_funcIsQuadNeededCallback;
//The volume data and a sampler to access it.
VolumeType* m_volData;

View File

@ -23,19 +23,18 @@ freely, subject to the following restrictions:
namespace PolyVox
{
template<typename VolumeType>
CubicSurfaceExtractorWithNormals<VolumeType>::CubicSurfaceExtractorWithNormals(VolumeType* volData, Region region, SurfaceMesh<PositionMaterialNormal>* result, polyvox_function<bool(typename VolumeType::VoxelType from, typename VolumeType::VoxelType to, float& materialToUse)> funcIsQuadNeededCallback)
:m_funcIsQuadNeededCallback(funcIsQuadNeededCallback)
,m_volData(volData)
template<typename VolumeType, typename IsQuadNeeded>
CubicSurfaceExtractorWithNormals<VolumeType, IsQuadNeeded>::CubicSurfaceExtractorWithNormals(VolumeType* volData, Region region, SurfaceMesh<PositionMaterialNormal>* result, IsQuadNeeded isQuadNeeded)
:m_volData(volData)
,m_sampVolume(volData)
,m_meshCurrent(result)
,m_regSizeInVoxels(region)
{
assert(m_funcIsQuadNeededCallback);
m_funcIsQuadNeededCallback = isQuadNeeded;
}
template<typename VolumeType>
void CubicSurfaceExtractorWithNormals<VolumeType>::execute()
template<typename VolumeType, typename IsQuadNeeded>
void CubicSurfaceExtractorWithNormals<VolumeType, IsQuadNeeded>::execute()
{
m_meshCurrent->clear();

View File

@ -0,0 +1,48 @@
/*******************************************************************************
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.
*******************************************************************************/
#ifndef __PolyVox_DefaultIsQuadNeeded_H__
#define __PolyVox_DefaultIsQuadNeeded_H__
namespace PolyVox
{
template<typename VoxelType>
class DefaultIsQuadNeeded
{
public:
bool operator()(VoxelType back, VoxelType front, float& materialToUse)
{
if((back > 0) && (front == 0))
{
materialToUse = static_cast<float>(back);
return true;
}
else
{
return false;
}
}
};
}
#endif //__PolyVox_DefaultIsQuadNeeded_H__

View File

@ -73,19 +73,6 @@ namespace PolyVox
MaterialType getMaterial() const throw() { return m_uMaterial; }
void setMaterial(MaterialType uMaterial) { m_uMaterial = uMaterial; }
static bool isQuadNeeded(Material<Type> back, Material<Type> front, float& materialToUse)
{
if((back.getMaterial() > 0) && (front.getMaterial() == 0))
{
materialToUse = static_cast<float>(back.getMaterial());
return true;
}
else
{
return false;
}
}
private:
MaterialType m_uMaterial;
};

View File

@ -24,6 +24,7 @@ freely, subject to the following restrictions:
#ifndef __PolyVox_MaterialDensityPair_H__
#define __PolyVox_MaterialDensityPair_H__
#include "PolyVoxCore/DefaultIsQuadNeeded.h" //we'll specialise this function for this voxel type
#include "PolyVoxCore/DefaultMarchingCubesController.h" //We'll specialise the controller contained in here
#include "PolyVoxImpl/TypeDef.h"
@ -95,7 +96,16 @@ namespace PolyVox
static DensityType getMaxDensity() throw() { return (0x01 << NoOfDensityBits) - 1; }
static DensityType getMinDensity() throw() { return 0; }
static bool isQuadNeeded(MaterialDensityPair<Type, NoOfMaterialBits, NoOfDensityBits> back, MaterialDensityPair<Type, NoOfMaterialBits, NoOfDensityBits> front, float& materialToUse)
private:
MaterialType m_uMaterial : NoOfMaterialBits;
DensityType m_uDensity : NoOfDensityBits;
};
template<typename Type, uint8_t NoOfMaterialBits, uint8_t NoOfDensityBits>
class DefaultIsQuadNeeded< MaterialDensityPair<Type, NoOfMaterialBits, NoOfDensityBits> >
{
public:
bool operator()(MaterialDensityPair<Type, NoOfMaterialBits, NoOfDensityBits> back, MaterialDensityPair<Type, NoOfMaterialBits, NoOfDensityBits> front, float& materialToUse)
{
if((back.getMaterial() > 0) && (front.getMaterial() == 0))
{
@ -107,10 +117,6 @@ namespace PolyVox
return false;
}
}
private:
MaterialType m_uMaterial : NoOfMaterialBits;
DensityType m_uDensity : NoOfDensityBits;
};
template <typename Type, uint8_t NoOfMaterialBits, uint8_t NoOfDensityBits>

View File

@ -31,7 +31,7 @@ namespace PolyVox
{
void extractCubicMesh(Volume& volume, const Region& region, Mesh& resultMesh)
{
CubicSurfaceExtractorWithNormals< SimpleVolume<MaterialDensityPair88> > surfaceExtractor(&volume, region, &resultMesh, MaterialDensityPair88::isQuadNeeded);
CubicSurfaceExtractorWithNormals< SimpleVolume<MaterialDensityPair88> > surfaceExtractor(&volume, region, &resultMesh);
surfaceExtractor.execute();
}

View File

@ -94,7 +94,7 @@ void testForType(SurfaceMesh<PositionMaterialNormal>& result)
}
}
CubicSurfaceExtractorWithNormals< SimpleVolume<VoxelType> > extractor(&volData, volData.getEnclosingRegion(), &result, VoxelType::isQuadNeeded);
CubicSurfaceExtractorWithNormals< SimpleVolume<VoxelType> > extractor(&volData, volData.getEnclosingRegion(), &result);
extractor.execute();
}