• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl

Go to the documentation of this file.
00001 /*******************************************************************************
00002 Copyright (c) 2005-2009 David Williams
00003 
00004 This software is provided 'as-is', without any express or implied
00005 warranty. In no event will the authors be held liable for any damages
00006 arising from the use of this software.
00007 
00008 Permission is granted to anyone to use this software for any purpose,
00009 including commercial applications, and to alter it and redistribute it
00010 freely, subject to the following restrictions:
00011 
00012     1. The origin of this software must not be misrepresented; you must not
00013     claim that you wrote the original software. If you use this software
00014     in a product, an acknowledgment in the product documentation would be
00015     appreciated but is not required.
00016 
00017     2. Altered source versions must be plainly marked as such, and must not be
00018     misrepresented as being the original software.
00019 
00020     3. This notice may not be removed or altered from any source
00021     distribution.   
00022 *******************************************************************************/
00023 
00024 namespace PolyVox
00025 {
00026     template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType>
00027     VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::VolumeResampler(SrcVolumeType<VoxelType>* pVolSrc, Region regSrc, DestVolumeType<VoxelType>* pVolDst, Region regDst)
00028         :m_pVolSrc(pVolSrc)
00029         ,m_regSrc(regSrc)
00030         ,m_pVolDst(pVolDst)
00031         ,m_regDst(regDst)
00032     {
00033     }
00034 
00035     template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType>
00036     void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::execute()
00037     {
00038         int32_t uSrcWidth = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX() + 1;
00039         int32_t uSrcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY() + 1;
00040         int32_t uSrcDepth = m_regSrc.getUpperCorner().getZ() - m_regSrc.getLowerCorner().getZ() + 1;
00041 
00042         int32_t uDstWidth = m_regDst.getUpperCorner().getX() - m_regDst.getLowerCorner().getX() + 1;
00043         int32_t uDstHeight = m_regDst.getUpperCorner().getY() - m_regDst.getLowerCorner().getY() + 1;
00044         int32_t uDstDepth = m_regDst.getUpperCorner().getZ() - m_regDst.getLowerCorner().getZ() + 1;
00045 
00046         if((uSrcWidth == uDstWidth) && (uSrcHeight == uDstHeight) && (uSrcDepth == uDstDepth))
00047         {
00048             resampleSameSize();
00049         }
00050         else
00051         {
00052             resampleArbitrary();
00053         }
00054     }
00055 
00056     template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType>
00057     void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::resampleSameSize()
00058     {
00059         for(int32_t sz = m_regSrc.getLowerCorner().getZ(), dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); sz++, dz++)
00060         {
00061             for(int32_t sy = m_regSrc.getLowerCorner().getY(), dy = m_regDst.getLowerCorner().getY(); dy <= m_regDst.getUpperCorner().getY(); sy++, dy++)
00062             {
00063                 for(int32_t sx = m_regSrc.getLowerCorner().getX(), dx = m_regDst.getLowerCorner().getX(); dx <= m_regDst.getUpperCorner().getX(); sx++,dx++)
00064                 {
00065                     VoxelType voxel = m_pVolSrc->getVoxelAt(sx,sy,sz);
00066                     m_pVolDst->setVoxelAt(dx,dy,dz,voxel);
00067                 }
00068             }
00069         }
00070     }
00071 
00072     template< template<typename> class SrcVolumeType, template<typename> class DestVolumeType, typename VoxelType>
00073     void VolumeResampler<SrcVolumeType, DestVolumeType, VoxelType>::resampleArbitrary()
00074     {
00075         float srcWidth  = m_regSrc.getUpperCorner().getX() - m_regSrc.getLowerCorner().getX();
00076         float srcHeight = m_regSrc.getUpperCorner().getY() - m_regSrc.getLowerCorner().getY();
00077         float srcDepth  = m_regSrc.getUpperCorner().getZ() - m_regSrc.getLowerCorner().getZ();
00078 
00079         float dstWidth  = m_regDst.getUpperCorner().getX() - m_regDst.getLowerCorner().getX();
00080         float dstHeight = m_regDst.getUpperCorner().getY() - m_regDst.getLowerCorner().getY();
00081         float dstDepth  = m_regDst.getUpperCorner().getZ() - m_regDst.getLowerCorner().getZ();
00082 
00083         float fScaleX = srcWidth / dstWidth;
00084         float fScaleY = srcHeight / dstHeight;
00085         float fScaleZ = srcDepth / dstDepth;
00086 
00087         typename SrcVolumeType<VoxelType>::Sampler sampler(m_pVolSrc);
00088 
00089         for(int32_t dz = m_regDst.getLowerCorner().getZ(); dz <= m_regDst.getUpperCorner().getZ(); dz++)
00090         {
00091             for(int32_t dy = m_regDst.getLowerCorner().getY(); dy <= m_regDst.getUpperCorner().getY(); dy++)
00092             {
00093                 for(int32_t dx = m_regDst.getLowerCorner().getX(); dx <= m_regDst.getUpperCorner().getX(); dx++)
00094                 {
00095                     float sx = (dx - m_regDst.getLowerCorner().getX()) * fScaleX;
00096                     float sy = (dy - m_regDst.getLowerCorner().getY()) * fScaleY;
00097                     float sz = (dz - m_regDst.getLowerCorner().getZ()) * fScaleZ;
00098 
00099                     sx += m_regSrc.getLowerCorner().getX();
00100                     sy += m_regSrc.getLowerCorner().getY();
00101                     sz += m_regSrc.getLowerCorner().getZ();
00102 
00103                     sampler.setPosition(sx,sy,sz);
00104                     VoxelType voxel000 = sampler.peekVoxel0px0py0pz();
00105                     VoxelType voxel001 = sampler.peekVoxel0px0py1pz();
00106                     VoxelType voxel010 = sampler.peekVoxel0px1py0pz();
00107                     VoxelType voxel011 = sampler.peekVoxel0px1py1pz();
00108                     VoxelType voxel100 = sampler.peekVoxel1px0py0pz();
00109                     VoxelType voxel101 = sampler.peekVoxel1px0py1pz();
00110                     VoxelType voxel110 = sampler.peekVoxel1px1py0pz();
00111                     VoxelType voxel111 = sampler.peekVoxel1px1py1pz();
00112 
00113                     uint8_t voxel000Den = voxel000.getDensity();
00114                     uint8_t voxel001Den = voxel001.getDensity();
00115                     uint8_t voxel010Den = voxel010.getDensity();
00116                     uint8_t voxel011Den = voxel011.getDensity();
00117                     uint8_t voxel100Den = voxel100.getDensity();
00118                     uint8_t voxel101Den = voxel101.getDensity();
00119                     uint8_t voxel110Den = voxel110.getDensity();
00120                     uint8_t voxel111Den = voxel111.getDensity();
00121 
00122                     //FIXME - should accept all float parameters, but GCC complains?
00123                     double dummy;
00124                     sx = modf(sx, &dummy);
00125                     sy = modf(sy, &dummy);
00126                     sz = modf(sz, &dummy);
00127 
00128                     uint8_t uInterpolatedDensity = trilinearlyInterpolate<float>(voxel000Den,voxel100Den,voxel010Den,voxel110Den,voxel001Den,voxel101Den,voxel011Den,voxel111Den,sx,sy,sz);
00129 
00130                     VoxelType result;
00131                     result.setDensity(uInterpolatedDensity);
00132 
00133                     m_pVolDst->setVoxelAt(dx,dy,dz,result);
00134                 }
00135             }
00136         }
00137     }
00138 }

Generated on Sat Nov 19 2011 00:27:31 for PolyVox by  doxygen 1.7.1