00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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 }