Removed use of template template parameters from VolumeResampler.

This commit is contained in:
unknown 2012-06-07 16:56:54 +02:00
parent fbdfe3a4ec
commit fcefe27192
3 changed files with 36 additions and 33 deletions

View File

@ -93,7 +93,7 @@ int main(int argc, char *argv[])
RawVolume<uint8_t> volDataLowLOD(PolyVox::Region(Vector3DInt32(0,0,0), Vector3DInt32(15, 31, 31))); RawVolume<uint8_t> volDataLowLOD(PolyVox::Region(Vector3DInt32(0,0,0), Vector3DInt32(15, 31, 31)));
VolumeResampler<SimpleVolume, RawVolume, uint8_t> volumeResampler(&volData, PolyVox::Region(Vector3DInt32(0,0,0), Vector3DInt32(31, 63, 63)), &volDataLowLOD, volDataLowLOD.getEnclosingRegion()); VolumeResampler< SimpleVolume<uint8_t>, RawVolume<uint8_t> > volumeResampler(&volData, PolyVox::Region(Vector3DInt32(0,0,0), Vector3DInt32(31, 63, 63)), &volDataLowLOD, volDataLowLOD.getEnclosingRegion());
volumeResampler.execute(); volumeResampler.execute();
//Extract the surface //Extract the surface

View File

@ -28,11 +28,11 @@ freely, subject to the following restrictions:
namespace PolyVox namespace PolyVox
{ {
template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType> template< typename SrcVolumeType, typename DestVolumeType>
class VolumeResampler class VolumeResampler
{ {
public: public:
VolumeResampler(SrcVolumeType<VoxelType>* pVolSrc, Region regSrc, DestVolumeType<VoxelType>* pVolDst, Region regDst); VolumeResampler(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst);
void execute(); void execute();
@ -41,11 +41,11 @@ namespace PolyVox
void resampleArbitrary(); void resampleArbitrary();
//Source data //Source data
SrcVolumeType<VoxelType>* m_pVolSrc; SrcVolumeType* m_pVolSrc;
Region m_regSrc; Region m_regSrc;
//Destination data //Destination data
DestVolumeType<VoxelType>* m_pVolDst; DestVolumeType* m_pVolDst;
Region m_regDst; Region m_regDst;
}; };

View File

@ -25,8 +25,8 @@ freely, subject to the following restrictions:
namespace PolyVox namespace PolyVox
{ {
template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType> template< typename SrcVolumeType, typename DestVolumeType>
VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::VolumeResampler(SrcVolumeType<VoxelType>* pVolSrc, Region regSrc, DestVolumeType<VoxelType>* pVolDst, Region regDst) VolumeResampler<SrcVolumeType, DestVolumeType>::VolumeResampler(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst)
:m_pVolSrc(pVolSrc) :m_pVolSrc(pVolSrc)
,m_regSrc(regSrc) ,m_regSrc(regSrc)
,m_pVolDst(pVolDst) ,m_pVolDst(pVolDst)
@ -34,8 +34,8 @@ namespace PolyVox
{ {
} }
template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType> template< typename SrcVolumeType, typename DestVolumeType>
void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::execute() void VolumeResampler<SrcVolumeType, DestVolumeType>::execute()
{ {
int32_t uSrcWidth = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX() + 1; int32_t uSrcWidth = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX() + 1;
int32_t uSrcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY() + 1; int32_t uSrcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY() + 1;
@ -55,8 +55,8 @@ namespace PolyVox
} }
} }
template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType> template< typename SrcVolumeType, typename DestVolumeType>
void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::resampleSameSize() void VolumeResampler<SrcVolumeType, DestVolumeType>::resampleSameSize()
{ {
for(int32_t sz = m_regSrc.getLowerCorner().getZ(), dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); sz++, dz++) for(int32_t sz = m_regSrc.getLowerCorner().getZ(), dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); sz++, dz++)
{ {
@ -64,15 +64,16 @@ namespace PolyVox
{ {
for(int32_t sx = m_regSrc.getLowerCorner().getX(), dx = m_regDst.getLowerCorner().getX(); dx <= m_regDst.getUpperCorner().getX(); sx++,dx++) for(int32_t sx = m_regSrc.getLowerCorner().getX(), dx = m_regDst.getLowerCorner().getX(); dx <= m_regDst.getUpperCorner().getX(); sx++,dx++)
{ {
VoxelType voxel = m_pVolSrc->getVoxelAt(sx,sy,sz); //Note: Consider what should happen if src and dest have different voxel types.
SrcVolumeType::VoxelType voxel = m_pVolSrc->getVoxelAt(sx,sy,sz);
m_pVolDst->setVoxelAt(dx,dy,dz,voxel); m_pVolDst->setVoxelAt(dx,dy,dz,voxel);
} }
} }
} }
} }
template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType> template< typename SrcVolumeType, typename DestVolumeType>
void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::resampleArbitrary() void VolumeResampler<SrcVolumeType, DestVolumeType>::resampleArbitrary()
{ {
float srcWidth = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX(); float srcWidth = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX();
float srcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY(); float srcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY();
@ -86,7 +87,7 @@ namespace PolyVox
float fScaleY = srcHeight / dstHeight; float fScaleY = srcHeight / dstHeight;
float fScaleZ = srcDepth / dstDepth; float fScaleZ = srcDepth / dstDepth;
typename SrcVolumeType<VoxelType>::Sampler sampler(m_pVolSrc); typename SrcVolumeType::Sampler sampler(m_pVolSrc);
for(int32_t dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); dz++) for(int32_t dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); dz++)
{ {
@ -103,23 +104,23 @@ namespace PolyVox
sz += m_regSrc.getLowerCorner().getZ(); sz += m_regSrc.getLowerCorner().getZ();
sampler.setPosition(sx,sy,sz); sampler.setPosition(sx,sy,sz);
VoxelType voxel000 = sampler.peekVoxel0px0py0pz(); SrcVolumeType::VoxelType voxel000 = sampler.peekVoxel0px0py0pz();
VoxelType voxel001 = sampler.peekVoxel0px0py1pz(); SrcVolumeType::VoxelType voxel001 = sampler.peekVoxel0px0py1pz();
VoxelType voxel010 = sampler.peekVoxel0px1py0pz(); SrcVolumeType::VoxelType voxel010 = sampler.peekVoxel0px1py0pz();
VoxelType voxel011 = sampler.peekVoxel0px1py1pz(); SrcVolumeType::VoxelType voxel011 = sampler.peekVoxel0px1py1pz();
VoxelType voxel100 = sampler.peekVoxel1px0py0pz(); SrcVolumeType::VoxelType voxel100 = sampler.peekVoxel1px0py0pz();
VoxelType voxel101 = sampler.peekVoxel1px0py1pz(); SrcVolumeType::VoxelType voxel101 = sampler.peekVoxel1px0py1pz();
VoxelType voxel110 = sampler.peekVoxel1px1py0pz(); SrcVolumeType::VoxelType voxel110 = sampler.peekVoxel1px1py0pz();
VoxelType voxel111 = sampler.peekVoxel1px1py1pz(); SrcVolumeType::VoxelType voxel111 = sampler.peekVoxel1px1py1pz();
typename VoxelTypeTraits<VoxelType>::DensityType voxel000Den = convertToDensity(voxel000); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel000Den = convertToDensity(voxel000);
typename VoxelTypeTraits<VoxelType>::DensityType voxel001Den = convertToDensity(voxel001); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel001Den = convertToDensity(voxel001);
typename VoxelTypeTraits<VoxelType>::DensityType voxel010Den = convertToDensity(voxel010); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel010Den = convertToDensity(voxel010);
typename VoxelTypeTraits<VoxelType>::DensityType voxel011Den = convertToDensity(voxel011); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel011Den = convertToDensity(voxel011);
typename VoxelTypeTraits<VoxelType>::DensityType voxel100Den = convertToDensity(voxel100); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel100Den = convertToDensity(voxel100);
typename VoxelTypeTraits<VoxelType>::DensityType voxel101Den = convertToDensity(voxel101); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel101Den = convertToDensity(voxel101);
typename VoxelTypeTraits<VoxelType>::DensityType voxel110Den = convertToDensity(voxel110); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel110Den = convertToDensity(voxel110);
typename VoxelTypeTraits<VoxelType>::DensityType voxel111Den = convertToDensity(voxel111); typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType voxel111Den = convertToDensity(voxel111);
//FIXME - should accept all float parameters, but GCC complains? //FIXME - should accept all float parameters, but GCC complains?
double dummy; double dummy;
@ -127,9 +128,11 @@ namespace PolyVox
sy = modf(sy, &dummy); sy = modf(sy, &dummy);
sz = modf(sz, &dummy); sz = modf(sz, &dummy);
typename VoxelTypeTraits<VoxelType>::DensityType uInterpolatedDensity = trilinearlyInterpolate<float>(voxel000Den,voxel100Den,voxel010Den,voxel110Den,voxel001Den,voxel101Den,voxel011Den,voxel111Den,sx,sy,sz); //Note: Consider what should happen if src and dest have different voxel types.
typename VoxelTypeTraits<SrcVolumeType::VoxelType>::DensityType uInterpolatedDensity = trilinearlyInterpolate<float>(voxel000Den,voxel100Den,voxel010Den,voxel110Den,voxel001Den,voxel101Den,voxel011Den,voxel111Den,sx,sy,sz);
VoxelType result; //Note: Consider what should happen if src and dest have different voxel types.
DestVolumeType::VoxelType result;
//result.setDensity(uInterpolatedDensity); //result.setDensity(uInterpolatedDensity);
result = uInterpolatedDensity; result = uInterpolatedDensity;