diff --git a/examples/OpenGL/main.cpp b/examples/OpenGL/main.cpp index 00b4cb5b..80f2ec42 100644 --- a/examples/OpenGL/main.cpp +++ b/examples/OpenGL/main.cpp @@ -103,9 +103,9 @@ int main(int argc, char *argv[]) //Smooth part of the volume RawVolume tempVolume(PolyVox::Region(0,0,0,128, 128, 128)); - LowPassFilter pass1(&volData, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), &tempVolume, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), 3); + LowPassFilter< LargeVolume, RawVolume > pass1(&volData, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), &tempVolume, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), 3); pass1.executeSAT(); - LowPassFilter pass2(&tempVolume, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), &volData, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), 3); + LowPassFilter< RawVolume, LargeVolume > pass2(&tempVolume, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), &volData, PolyVox::Region(Vector3DInt32(62, 62, 62), Vector3DInt32(126, 126, 126)), 3); pass2.executeSAT(); QApplication app(argc, argv); diff --git a/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.h b/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.h index 6379b13b..4b9ec59c 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.h +++ b/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.h @@ -30,22 +30,22 @@ freely, subject to the following restrictions: namespace PolyVox { - template< template class SrcVolumeType, template class DestVolumeType, typename VoxelType> + template< typename SrcVolumeType, typename DestVolumeType> class LowPassFilter { public: - LowPassFilter(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst, uint32_t uKernelSize); + LowPassFilter(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst, uint32_t uKernelSize); void execute(); void executeSAT(); private: //Source data - SrcVolumeType* m_pVolSrc; + SrcVolumeType* m_pVolSrc; Region m_regSrc; //Destination data - DestVolumeType* m_pVolDst; + DestVolumeType* m_pVolDst; Region m_regDst; //Kernel size diff --git a/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.inl b/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.inl index 87eb2edb..c5114c9e 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/LowPassFilter.inl @@ -23,8 +23,8 @@ freely, subject to the following restrictions: namespace PolyVox { - template< template class SrcVolumeType, template class DestVolumeType, typename VoxelType> - LowPassFilter::LowPassFilter(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst, uint32_t uKernelSize) + template< typename SrcVolumeType, typename DestVolumeType> + LowPassFilter::LowPassFilter(SrcVolumeType* pVolSrc, Region regSrc, DestVolumeType* pVolDst, Region regDst, uint32_t uKernelSize) :m_pVolSrc(pVolSrc) ,m_regSrc(regSrc) ,m_pVolDst(pVolDst) @@ -43,8 +43,8 @@ namespace PolyVox } } - template< template class SrcVolumeType, template class DestVolumeType, typename VoxelType> - void LowPassFilter::execute() + template< typename SrcVolumeType, typename DestVolumeType> + void LowPassFilter::execute() { int32_t iSrcMinX = m_regSrc.getLowerCorner().getX(); int32_t iSrcMinY = m_regSrc.getLowerCorner().getY(); @@ -62,7 +62,7 @@ namespace PolyVox //int32_t iDstMaxY = m_regDst.getUpperCorner().getY(); //int32_t iDstMaxZ = m_regDst.getUpperCorner().getZ(); - typename SrcVolumeType::Sampler srcSampler(m_pVolSrc); + typename SrcVolumeType::Sampler srcSampler(m_pVolSrc); for(int32_t iSrcZ = iSrcMinZ, iDstZ = iDstMinZ; iSrcZ <= iSrcMaxZ; iSrcZ++, iDstZ++) { @@ -73,7 +73,7 @@ namespace PolyVox //VoxelType tSrcVoxel = m_pVolSrc->getVoxelAt(iSrcX, iSrcY, iSrcZ); srcSampler.setPosition(iSrcX, iSrcY, iSrcZ); - VoxelType tSrcVoxel = srcSampler.getVoxel(); + SrcVolumeType::VoxelType tSrcVoxel = srcSampler.getVoxel(); uint32_t uDensity = 0; uDensity += convertToDensity(srcSampler.peekVoxel1nx1ny1nz()); @@ -115,8 +115,8 @@ namespace PolyVox } } - template< template class SrcVolumeType, template class DestVolumeType, typename VoxelType> - void LowPassFilter::executeSAT() + template< typename SrcVolumeType, typename DestVolumeType> + void LowPassFilter::executeSAT() { const uint32_t border = (m_uKernelSize - 1) / 2; @@ -148,9 +148,9 @@ namespace PolyVox satIterCont.m_Iter = &satVolumeIter; satIterCont.reset(); - typename SrcVolumeType::Sampler srcVolumeIter(m_pVolSrc); + typename SrcVolumeType::Sampler srcVolumeIter(m_pVolSrc); - IteratorController::Sampler> srcIterCont; + IteratorController srcIterCont; srcIterCont.m_regValid = Region(satLowerCorner, satUpperCorner); srcIterCont.m_Iter = &srcVolumeIter; srcIterCont.reset(); @@ -246,9 +246,10 @@ namespace PolyVox float average = sum / (static_cast(sideLength*sideLength*sideLength)); - VoxelType voxel = m_pVolSrc->getVoxelAt(iDstX, iDstY, iDstZ); + //Note: These lines need consideration if src and dest have different voxel types. + SrcVolumeType::VoxelType voxel = m_pVolSrc->getVoxelAt(iDstX, iDstY, iDstZ); - voxel.setDensity(static_cast(average)); + voxel.setDensity(static_cast(average)); m_pVolDst->setVoxelAt(iDstX, iDstY, iDstZ, voxel); diff --git a/tests/TestLowPassFilter.cpp b/tests/TestLowPassFilter.cpp index 914d3d13..a20db6af 100644 --- a/tests/TestLowPassFilter.cpp +++ b/tests/TestLowPassFilter.cpp @@ -58,7 +58,7 @@ void TestLowPassFilter::testExecute() RawVolume resultVolume(reg); - LowPassFilter pass1(&volData, reg, &resultVolume, reg, 5); + LowPassFilter< RawVolume, RawVolume > pass1(&volData, reg, &resultVolume, reg, 5); pass1.execute();