Initial version of mesh smoothing code.
This commit is contained in:
@ -139,13 +139,13 @@ namespace PolyVox
|
||||
assert(uYPos < getSideLength());
|
||||
assert(uZPos < getSideLength());
|
||||
|
||||
const uint16_t blockX = uXPos >> m_uBlockSideLengthPower;
|
||||
const uint16_t blockY = uYPos >> m_uBlockSideLengthPower;
|
||||
const uint16_t blockZ = uZPos >> m_uBlockSideLengthPower;
|
||||
const boost::uint16_t blockX = uXPos >> m_uBlockSideLengthPower;
|
||||
const boost::uint16_t blockY = uYPos >> m_uBlockSideLengthPower;
|
||||
const boost::uint16_t blockZ = uZPos >> m_uBlockSideLengthPower;
|
||||
|
||||
const uint16_t xOffset = uXPos - (blockX << m_uBlockSideLengthPower);
|
||||
const uint16_t yOffset = uYPos - (blockY << m_uBlockSideLengthPower);
|
||||
const uint16_t zOffset = uZPos - (blockZ << m_uBlockSideLengthPower);
|
||||
const boost::uint16_t xOffset = uXPos - (blockX << m_uBlockSideLengthPower);
|
||||
const boost::uint16_t yOffset = uYPos - (blockY << m_uBlockSideLengthPower);
|
||||
const boost::uint16_t zOffset = uZPos - (blockZ << m_uBlockSideLengthPower);
|
||||
|
||||
const Block<VoxelType>* block = m_pBlocks
|
||||
[
|
||||
|
@ -43,11 +43,11 @@ namespace PolyVox
|
||||
bool operator<=(const BlockVolumeIterator& rhs);
|
||||
bool operator>=(const BlockVolumeIterator& rhs);
|
||||
|
||||
float getAveragedVoxel(boost::uint16_t size) const;
|
||||
VoxelType getMaxedVoxel(boost::uint8_t uLevel) const;
|
||||
boost::uint16_t getPosX(void) const;
|
||||
boost::uint16_t getPosY(void) const;
|
||||
boost::uint16_t getPosZ(void) const;
|
||||
const BlockVolume<VoxelType>& getVolume(void) const;
|
||||
VoxelType getVoxel(void) const;
|
||||
|
||||
void setPosition(const Vector3DInt16& v3dNewPos);
|
||||
|
@ -104,38 +104,6 @@ namespace PolyVox
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Getters
|
||||
template <typename VoxelType>
|
||||
float BlockVolumeIterator<VoxelType>::getAveragedVoxel(boost::uint16_t size) const
|
||||
{
|
||||
assert(mXPosInVolume >= size);
|
||||
assert(mYPosInVolume >= size);
|
||||
assert(mZPosInVolume >= size);
|
||||
assert(mXPosInVolume < mVolume.getSideLength() - (size + 1));
|
||||
assert(mYPosInVolume < mVolume.getSideLength() - (size + 1));
|
||||
assert(mZPosInVolume < mVolume.getSideLength() - (size + 1));
|
||||
|
||||
float sum = 0.0;
|
||||
for(uint16_t z = mZPosInVolume-size; z <= mZPosInVolume+size; ++z)
|
||||
{
|
||||
for(uint16_t y = mYPosInVolume-size; y <= mYPosInVolume+size; ++y)
|
||||
{
|
||||
for(uint16_t x = mXPosInVolume-size; x <= mXPosInVolume+size; ++x)
|
||||
{
|
||||
if(mVolume.getVoxelAt(x,y,z) != 0)
|
||||
{
|
||||
sum += 1.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t kernelSideLength = size * 2 + 1;
|
||||
uint16_t kernelVolume = kernelSideLength * kernelSideLength * kernelSideLength;
|
||||
|
||||
sum /= static_cast<float>(kernelVolume);
|
||||
return sum;
|
||||
}
|
||||
|
||||
template <typename VoxelType>
|
||||
VoxelType BlockVolumeIterator<VoxelType>::getMaxedVoxel(boost::uint8_t uLevel) const
|
||||
{
|
||||
@ -192,6 +160,12 @@ namespace PolyVox
|
||||
return mZPosInVolume;
|
||||
}
|
||||
|
||||
template <typename VoxelType>
|
||||
const BlockVolume<VoxelType>& BlockVolumeIterator<VoxelType>::getVolume(void) const
|
||||
{
|
||||
return mVolume;
|
||||
}
|
||||
|
||||
template <typename VoxelType>
|
||||
VoxelType BlockVolumeIterator<VoxelType>::getVoxel(void) const
|
||||
{
|
||||
|
@ -19,6 +19,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
******************************************************************************/
|
||||
#pragma endregion
|
||||
|
||||
#include "SurfaceAdjusters.h"
|
||||
|
||||
namespace PolyVox
|
||||
{
|
||||
template <typename VoxelType>
|
||||
@ -76,25 +78,25 @@ namespace PolyVox
|
||||
|
||||
//FIXME - bitwise way of doing this?
|
||||
volIter.setPosition(initialX-1, initialY, initialZ);
|
||||
float voxel1nx = volIter.getAveragedVoxel(1);
|
||||
float voxel1nx = computeSmoothedVoxel(volIter);
|
||||
volIter.setPosition(initialX+1, initialY, initialZ);
|
||||
float voxel1px = volIter.getAveragedVoxel(1);
|
||||
float voxel1px = computeSmoothedVoxel(volIter);
|
||||
|
||||
volIter.setPosition(initialX, initialY-1, initialZ);
|
||||
float voxel1ny = volIter.getAveragedVoxel(1);
|
||||
float voxel1ny = computeSmoothedVoxel(volIter);
|
||||
volIter.setPosition(initialX, initialY+1, initialZ);
|
||||
float voxel1py = volIter.getAveragedVoxel(1);
|
||||
float voxel1py = computeSmoothedVoxel(volIter);
|
||||
|
||||
volIter.setPosition(initialX, initialY, initialZ-1);
|
||||
float voxel1nz = volIter.getAveragedVoxel(1);
|
||||
float voxel1nz = computeSmoothedVoxel(volIter);
|
||||
volIter.setPosition(initialX, initialY, initialZ+1);
|
||||
float voxel1pz = volIter.getAveragedVoxel(1);
|
||||
float voxel1pz = computeSmoothedVoxel(volIter);
|
||||
|
||||
return Vector3DFloat
|
||||
(
|
||||
voxel1px - voxel1nx,
|
||||
voxel1py - voxel1ny,
|
||||
voxel1pz - voxel1nz
|
||||
voxel1nx - voxel1px,
|
||||
voxel1ny - voxel1py,
|
||||
voxel1nz - voxel1pz
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
namespace PolyVox
|
||||
{
|
||||
POLYVOX_API void smoothRegionGeometry(BlockVolume<boost::uint8_t>* volumeData, RegionGeometry& regGeom);
|
||||
float computeSmoothedVoxel(BlockVolumeIterator<boost::uint8_t>& volIter);
|
||||
}
|
||||
|
||||
#endif
|
@ -45,9 +45,6 @@ namespace PolyVox
|
||||
POLYVOX_API void generateRoughVerticesForSlice(BlockVolumeIterator<boost::uint8_t>& volIter, Region& regSlice, const Vector3DFloat& offset, boost::uint8_t* bitmask, IndexedSurfacePatch* singleMaterialPatch,boost::int32_t vertexIndicesX[],boost::int32_t vertexIndicesY[],boost::int32_t vertexIndicesZ[]);
|
||||
|
||||
POLYVOX_API void generateReferenceMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch);
|
||||
|
||||
POLYVOX_API void generateSmoothMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch);
|
||||
POLYVOX_API Vector3DFloat computeSmoothNormal(BlockVolume<boost::uint8_t>* volumeData, const Vector3DFloat& position, NormalGenerationMethod normalGenerationMethod);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -30,6 +30,31 @@ namespace PolyVox
|
||||
{
|
||||
POLYVOX_API boost::uint8_t logBase2(boost::uint32_t uInput);
|
||||
POLYVOX_API bool isPowerOf2(boost::uint32_t uInput);
|
||||
|
||||
template <typename Type>
|
||||
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
|
||||
|
Reference in New Issue
Block a user