diff --git a/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl b/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl index e5db62d0..8a3b199d 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl @@ -64,9 +64,9 @@ namespace PolyVox { for(int32_t sx = m_regSrc.getLowerCorner().getX(), dx = m_regDst.getLowerCorner().getX(); dx <= m_regDst.getUpperCorner().getX(); sx++,dx++) { - //Note: Consider what should happen if src and dest have different voxel types. - typename SrcVolumeType::VoxelType voxel = m_pVolSrc->getVoxelAt(sx,sy,sz); - m_pVolDst->setVoxelAt(dx,dy,dz,voxel); + const typename SrcVolumeType::VoxelType& tSrcVoxel = m_pVolSrc->getVoxelAt(sx,sy,sz); + const typename DestVolumeType::VoxelType& tDestVoxel = static_cast(m_pVolSrc->getVoxelAt(sx,sy,sz)); + m_pVolDst->setVoxelAt(dx,dy,dz,tDestVoxel); } } } @@ -104,23 +104,14 @@ namespace PolyVox sz += m_regSrc.getLowerCorner().getZ(); sampler.setPosition(sx,sy,sz); - typename SrcVolumeType::VoxelType voxel000 = sampler.peekVoxel0px0py0pz(); - typename SrcVolumeType::VoxelType voxel001 = sampler.peekVoxel0px0py1pz(); - typename SrcVolumeType::VoxelType voxel010 = sampler.peekVoxel0px1py0pz(); - typename SrcVolumeType::VoxelType voxel011 = sampler.peekVoxel0px1py1pz(); - typename SrcVolumeType::VoxelType voxel100 = sampler.peekVoxel1px0py0pz(); - typename SrcVolumeType::VoxelType voxel101 = sampler.peekVoxel1px0py1pz(); - typename SrcVolumeType::VoxelType voxel110 = sampler.peekVoxel1px1py0pz(); - typename SrcVolumeType::VoxelType voxel111 = sampler.peekVoxel1px1py1pz(); - - typename VoxelTypeTraits::DensityType voxel000Den = convertToDensity(voxel000); - typename VoxelTypeTraits::DensityType voxel001Den = convertToDensity(voxel001); - typename VoxelTypeTraits::DensityType voxel010Den = convertToDensity(voxel010); - typename VoxelTypeTraits::DensityType voxel011Den = convertToDensity(voxel011); - typename VoxelTypeTraits::DensityType voxel100Den = convertToDensity(voxel100); - typename VoxelTypeTraits::DensityType voxel101Den = convertToDensity(voxel101); - typename VoxelTypeTraits::DensityType voxel110Den = convertToDensity(voxel110); - typename VoxelTypeTraits::DensityType voxel111Den = convertToDensity(voxel111); + const typename SrcVolumeType::VoxelType& voxel000 = sampler.peekVoxel0px0py0pz(); + const typename SrcVolumeType::VoxelType& voxel001 = sampler.peekVoxel0px0py1pz(); + const typename SrcVolumeType::VoxelType& voxel010 = sampler.peekVoxel0px1py0pz(); + const typename SrcVolumeType::VoxelType& voxel011 = sampler.peekVoxel0px1py1pz(); + const typename SrcVolumeType::VoxelType& voxel100 = sampler.peekVoxel1px0py0pz(); + const typename SrcVolumeType::VoxelType& voxel101 = sampler.peekVoxel1px0py1pz(); + const typename SrcVolumeType::VoxelType& voxel110 = sampler.peekVoxel1px1py0pz(); + const typename SrcVolumeType::VoxelType& voxel111 = sampler.peekVoxel1px1py1pz(); //FIXME - should accept all float parameters, but GCC complains? double dummy; @@ -128,14 +119,9 @@ namespace PolyVox sy = modf(sy, &dummy); sz = modf(sz, &dummy); - //Note: Consider what should happen if src and dest have different voxel types. - typename VoxelTypeTraits::DensityType uInterpolatedDensity = trilinearlyInterpolate(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 DestVolumeType::VoxelType result; - //result.setDensity(uInterpolatedDensity); - result = uInterpolatedDensity; + typename SrcVolumeType::VoxelType tInterpolatedValue = trilinearlyInterpolate(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,sx,sy,sz); + typename DestVolumeType::VoxelType result = static_cast(tInterpolatedValue); m_pVolDst->setVoxelAt(dx,dy,dz,result); } }