From e93d568cb4403d0959cdf4313f539c3ba254c00e Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 2 Nov 2012 16:34:31 +0100 Subject: [PATCH] Exposed linear and bilinear interpolation, in addition to trilinear. Moved them somewhere publically accessable. --- library/PolyVoxCore/CMakeLists.txt | 1 + .../include/PolyVoxCore/Interpolation.h | 82 +++++++++++++++++++ .../include/PolyVoxCore/VolumeResampler.inl | 4 +- .../PolyVoxCore/include/PolyVoxImpl/Utility.h | 25 ------ 4 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 library/PolyVoxCore/include/PolyVoxCore/Interpolation.h diff --git a/library/PolyVoxCore/CMakeLists.txt b/library/PolyVoxCore/CMakeLists.txt index 6e178ca0..5ba8bc68 100644 --- a/library/PolyVoxCore/CMakeLists.txt +++ b/library/PolyVoxCore/CMakeLists.txt @@ -59,6 +59,7 @@ SET(CORE_INC_FILES include/PolyVoxCore/Density.h include/PolyVoxCore/GradientEstimators.h include/PolyVoxCore/GradientEstimators.inl + include/PolyVoxCore/Interpolation.h include/PolyVoxCore/IteratorController.h include/PolyVoxCore/IteratorController.inl include/PolyVoxCore/LargeVolume.h diff --git a/library/PolyVoxCore/include/PolyVoxCore/Interpolation.h b/library/PolyVoxCore/include/PolyVoxCore/Interpolation.h new file mode 100644 index 00000000..29d642ee --- /dev/null +++ b/library/PolyVoxCore/include/PolyVoxCore/Interpolation.h @@ -0,0 +1,82 @@ +/******************************************************************************* +Copyright (c) 2005-2009 David Williams + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*******************************************************************************/ + +#ifndef __PolyVox_Interpolation_H__ +#define __PolyVox_Interpolation_H__ + +#include + +namespace PolyVox +{ + template + Type lerp( + const Type& v0,const Type& v1, + const float x) + { + assert((x >= 0.0f) && (x <= 1.0f)); + + //Interpolate along X + Type v0_1 = v0 + x * (v1 - v0); + + return v0_1; + } + + template + Type bilerp( + const Type& v00,const Type& v10,const Type& v01,const Type& v11, + const float x, const float y) + { + assert((x >= 0.0f) && (y >= 0.0f) && + (x <= 1.0f) && (y <= 1.0f)); + + // Linearly interpolate along x + Type v00_10 = lerp(v00, v10, x); + Type v01_11 = lerp(v01, v11, x); + + // And linearly interpolate the results along y + Type v00_10__v01_11 = lerp(v00_10, v01_11, y); + + return v00_10__v01_11; + } + + template + Type trilerp( + const Type& v000,const Type& v100,const Type& v010,const Type& v110, + const Type& v001,const Type& v101,const Type& v011,const Type& v111, + const float x, const float y, const float z) + { + assert((x >= 0.0f) && (y >= 0.0f) && (z >= 0.0f) && + (x <= 1.0f) && (y <= 1.0f) && (z <= 1.0f)); + + // Bilinearly interpolate along Y + Type v000_v100__v010_v110 = bilerp(v000, v100, v010, v110, x, y); + Type v001_v101__v011_v111 = bilerp(v001, v101, v011, v111, x, y); + + // And linearly interpolate the results along z + Type v000_v100__v010_v110____v001_v101__v011_v111 = lerp(v000_v100__v010_v110, v001_v101__v011_v111, z); + + return v000_v100__v010_v110____v001_v101__v011_v111; + } +} + +#endif //__PolyVox_Interpolation_H__ diff --git a/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl b/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl index 9945ec62..15ec0457 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/VolumeResampler.inl @@ -21,7 +21,7 @@ freely, subject to the following restrictions: distribution. *******************************************************************************/ -#include "PolyVoxImpl/Utility.h" +#include "PolyVoxCore/Interpolation.h" namespace PolyVox { @@ -125,7 +125,7 @@ namespace PolyVox sy = modf(sy, &dummy); sz = modf(sz, &dummy); - typename SrcVolumeType::VoxelType tInterpolatedValue = trilinearlyInterpolate(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,sx,sy,sz); + typename SrcVolumeType::VoxelType tInterpolatedValue = trilerp(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,sx,sy,sz); typename DstVolumeType::VoxelType result = static_cast(tInterpolatedValue); m_pVolDst->setVoxelAt(dx,dy,dz,result); diff --git a/library/PolyVoxCore/include/PolyVoxImpl/Utility.h b/library/PolyVoxCore/include/PolyVoxImpl/Utility.h index 75f755fe..d2ad594a 100644 --- a/library/PolyVoxCore/include/PolyVoxImpl/Utility.h +++ b/library/PolyVoxCore/include/PolyVoxImpl/Utility.h @@ -32,31 +32,6 @@ namespace PolyVox { POLYVOX_API uint8_t logBase2(uint32_t uInput); POLYVOX_API bool isPowerOf2(uint32_t uInput); - - template - Type trilinearlyInterpolate( - const Type& v000,const Type& v100,const Type& v010,const Type& v110, - const Type& v001,const Type& v101,const Type& v011,const Type& v111, - const float x, const float y, const float z) - { - assert((x >= 0.0f) && (y >= 0.0f) && (z >= 0.0f) && - (x <= 1.0f) && (y <= 1.0f) && (z <= 1.0f)); - - //Interpolate along X - Type v000_v100 = (v100 - v000) * x + v000; - Type v001_v101 = (v101 - v001) * x + v001; - Type v010_v110 = (v110 - v010) * x + v010; - Type v011_v111 = (v111 - v011) * x + v011; - - //Interpolate along Y - Type v000_v100__v010_v110 = (v010_v110 - v000_v100) * y + v000_v100; - Type v001_v101__v011_v111 = (v011_v111 - v001_v101) * y + v001_v101; - - //Interpolate along Z - Type v000_v100__v010_v110____v001_v101__v011_v111 = (v001_v101__v011_v111 - v000_v100__v010_v110) * z + v000_v100__v010_v110; - - return v000_v100__v010_v110____v001_v101__v011_v111; - } } #endif