Making Cubiquity version of PolyVox more closely match develop version.
This commit is contained in:
parent
6a009825b5
commit
fcf5b2b055
@ -118,6 +118,7 @@ namespace PolyVox
|
|||||||
CubicSurfaceExtractor(VolumeType* volData, Region region, SurfaceMesh<PositionMaterial<typename VolumeType::VoxelType> >* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), bool bMergeQuads = true, IsQuadNeeded isQuadNeeded = IsQuadNeeded());
|
CubicSurfaceExtractor(VolumeType* volData, Region region, SurfaceMesh<PositionMaterial<typename VolumeType::VoxelType> >* result, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType(), bool bMergeQuads = true, IsQuadNeeded isQuadNeeded = IsQuadNeeded());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void execute();
|
void execute();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -43,16 +43,16 @@ namespace PolyVox
|
|||||||
Timer timer;
|
Timer timer;
|
||||||
m_meshCurrent->clear();
|
m_meshCurrent->clear();
|
||||||
|
|
||||||
for(int32_t z = m_regSizeInVoxels.getLowerCorner().getZ(); z < m_regSizeInVoxels.getUpperCorner().getZ(); z++)
|
for(int32_t z = m_regSizeInVoxels.getLowerZ(); z < m_regSizeInVoxels.getUpperZ(); z++)
|
||||||
{
|
{
|
||||||
for(int32_t y = m_regSizeInVoxels.getLowerCorner().getY(); y < m_regSizeInVoxels.getUpperCorner().getY(); y++)
|
for(int32_t y = m_regSizeInVoxels.getLowerY(); y < m_regSizeInVoxels.getUpperY(); y++)
|
||||||
{
|
{
|
||||||
for(int32_t x = m_regSizeInVoxels.getLowerCorner().getX(); x < m_regSizeInVoxels.getUpperCorner().getX(); x++)
|
for(int32_t x = m_regSizeInVoxels.getLowerX(); x < m_regSizeInVoxels.getUpperX(); x++)
|
||||||
{
|
{
|
||||||
// these are always positive anyway
|
// these are always positive anyway
|
||||||
float regX = static_cast<float>(x - m_regSizeInVoxels.getLowerCorner().getX());
|
float regX = static_cast<float>(x - m_regSizeInVoxels.getLowerX());
|
||||||
float regY = static_cast<float>(y - m_regSizeInVoxels.getLowerCorner().getY());
|
float regY = static_cast<float>(y - m_regSizeInVoxels.getLowerY());
|
||||||
float regZ = static_cast<float>(z - m_regSizeInVoxels.getLowerCorner().getZ());
|
float regZ = static_cast<float>(z - m_regSizeInVoxels.getLowerZ());
|
||||||
|
|
||||||
uint32_t material = 0;
|
uint32_t material = 0;
|
||||||
|
|
||||||
|
@ -32,11 +32,11 @@ namespace PolyVox
|
|||||||
class DefaultIsQuadNeeded
|
class DefaultIsQuadNeeded
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool operator()(VoxelType back, VoxelType front, float& materialToUse)
|
bool operator()(VoxelType back, VoxelType front, uint32_t& materialToUse)
|
||||||
{
|
{
|
||||||
if((back > 0) && (front == 0))
|
if((back > 0) && (front == 0))
|
||||||
{
|
{
|
||||||
materialToUse = static_cast<float>(back);
|
materialToUse = static_cast<uint32_t>(back);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
// is a recent version) then assume support for these.
|
// is a recent version) then assume support for these.
|
||||||
#if !defined(_MSC_VER) || (_MSC_VER >= 1600)
|
#if !defined(_MSC_VER) || (_MSC_VER >= 1600)
|
||||||
#define HAS_CXX11_CONSTEXPR
|
#define HAS_CXX11_CONSTEXPR
|
||||||
//#define HAS_CXX11_STATIC_ASSERT //This seems to cause issues on Android.
|
#define HAS_CXX11_STATIC_ASSERT
|
||||||
#define HAS_CXX11_CSTDINT_H
|
#define HAS_CXX11_CSTDINT_H
|
||||||
#define HAS_CXX11_SHARED_PTR
|
#define HAS_CXX11_SHARED_PTR
|
||||||
#endif
|
#endif
|
||||||
|
@ -52,8 +52,6 @@ namespace PolyVox
|
|||||||
{
|
{
|
||||||
return (std::min)(high, (std::max)(low, value));
|
return (std::min)(high, (std::max)(low, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
float triangleFilter(float fInput);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -461,7 +461,6 @@ namespace PolyVox
|
|||||||
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
||||||
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
||||||
const typename Controller::MaterialType uMaterial100 = m_controller.convertToMaterial(v100);
|
const typename Controller::MaterialType uMaterial100 = m_controller.convertToMaterial(v100);
|
||||||
//const typename Controller::MaterialType uMaterial = (std::max)(uMaterial000, uMaterial100);
|
|
||||||
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial100, fInterp);
|
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial100, fInterp);
|
||||||
|
|
||||||
const PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
const PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
||||||
@ -495,7 +494,6 @@ namespace PolyVox
|
|||||||
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
||||||
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
||||||
const typename Controller::MaterialType uMaterial010 = m_controller.convertToMaterial(v010);
|
const typename Controller::MaterialType uMaterial010 = m_controller.convertToMaterial(v010);
|
||||||
//const typename Controller::MaterialType uMaterial = (std::max)(uMaterial000, uMaterial010);
|
|
||||||
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial010, fInterp);
|
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial010, fInterp);
|
||||||
|
|
||||||
PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
||||||
@ -528,7 +526,6 @@ namespace PolyVox
|
|||||||
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
//volume we get the one which is non-zero. Both materials can be non-zero if our volume has a density component.
|
||||||
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
const typename Controller::MaterialType uMaterial000 = m_controller.convertToMaterial(v000);
|
||||||
const typename Controller::MaterialType uMaterial001 = m_controller.convertToMaterial(v001);
|
const typename Controller::MaterialType uMaterial001 = m_controller.convertToMaterial(v001);
|
||||||
//const typename Controller::MaterialType uMaterial = (std::max)(uMaterial000, uMaterial001);
|
|
||||||
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial001, fInterp);
|
const typename Controller::MaterialType uMaterial = m_controller.blendMaterials(uMaterial000, uMaterial001, fInterp);
|
||||||
|
|
||||||
const PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
const PositionMaterialNormal<typename Controller::MaterialType> surfaceVertex(v3dPosition, v3dNormal, uMaterial);
|
||||||
@ -640,4 +637,4 @@ namespace PolyVox
|
|||||||
}//For each cell
|
}//For each cell
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -141,21 +141,21 @@ namespace PolyVox
|
|||||||
/// Tests whether the given point is contained in this Region.
|
/// Tests whether the given point is contained in this Region.
|
||||||
bool containsPoint(const Vector3DFloat& pos, float boundary = 0.0f) const;
|
bool containsPoint(const Vector3DFloat& pos, float boundary = 0.0f) const;
|
||||||
/// Tests whether the given point is contained in this Region.
|
/// Tests whether the given point is contained in this Region.
|
||||||
bool containsPoint(int32_t iX, int32_t iY, int32_t iZ, int8_t boundary = 0) const;
|
bool containsPoint(int32_t iX, int32_t iY, int32_t iZ, uint8_t boundary = 0) const;
|
||||||
/// Tests whether the given point is contained in this Region.
|
/// Tests whether the given point is contained in this Region.
|
||||||
bool containsPoint(const Vector3DInt32& pos, int8_t boundary = 0) const;
|
bool containsPoint(const Vector3DInt32& pos, uint8_t boundary = 0) const;
|
||||||
/// Tests whether the given position is contained in the 'x' range of this Region.
|
/// Tests whether the given position is contained in the 'x' range of this Region.
|
||||||
bool containsPointInX(float pos, float boundary = 0.0f) const;
|
bool containsPointInX(float pos, float boundary = 0.0f) const;
|
||||||
/// Tests whether the given position is contained in the 'x' range of this Region.
|
/// Tests whether the given position is contained in the 'x' range of this Region.
|
||||||
bool containsPointInX(int32_t pos, int8_t boundary = 0) const;
|
bool containsPointInX(int32_t pos, uint8_t boundary = 0) const;
|
||||||
/// Tests whether the given position is contained in the 'y' range of this Region.
|
/// Tests whether the given position is contained in the 'y' range of this Region.
|
||||||
bool containsPointInY(float pos, float boundary = 0.0f) const;
|
bool containsPointInY(float pos, float boundary = 0.0f) const;
|
||||||
/// Tests whether the given position is contained in the 'y' range of this Region.
|
/// Tests whether the given position is contained in the 'y' range of this Region.
|
||||||
bool containsPointInY(int32_t pos, int8_t boundary = 0) const;
|
bool containsPointInY(int32_t pos, uint8_t boundary = 0) const;
|
||||||
/// Tests whether the given position is contained in the 'z' range of this Region.
|
/// Tests whether the given position is contained in the 'z' range of this Region.
|
||||||
bool containsPointInZ(float pos, float boundary = 0.0f) const;
|
bool containsPointInZ(float pos, float boundary = 0.0f) const;
|
||||||
/// Tests whether the given position is contained in the 'z' range of this Region.
|
/// Tests whether the given position is contained in the 'z' range of this Region.
|
||||||
bool containsPointInZ(int32_t pos, int8_t boundary = 0) const;
|
bool containsPointInZ(int32_t pos, uint8_t boundary = 0) const;
|
||||||
|
|
||||||
/// Tests whether the given Region is contained in this Region.
|
/// Tests whether the given Region is contained in this Region.
|
||||||
bool containsRegion(const Region& reg, uint8_t boundary = 0) const;
|
bool containsRegion(const Region& reg, uint8_t boundary = 0) const;
|
||||||
|
@ -95,8 +95,8 @@ namespace PolyVox
|
|||||||
std::vector<LodRecord> m_vecLodRecords;
|
std::vector<LodRecord> m_vecLodRecords;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*template <typename VertexType>
|
template <typename VertexType>
|
||||||
polyvox_shared_ptr< SurfaceMesh<VertexType> > extractSubset(SurfaceMesh<VertexType>& inputMesh, std::set<uint8_t> setMaterials);*/
|
polyvox_shared_ptr< SurfaceMesh<VertexType> > extractSubset(SurfaceMesh<VertexType>& inputMesh, std::set<uint8_t> setMaterials);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "PolyVoxCore/SurfaceMesh.inl"
|
#include "PolyVoxCore/SurfaceMesh.inl"
|
||||||
|
@ -394,7 +394,7 @@ namespace PolyVox
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Currently a free function - think where this needs to go.
|
//Currently a free function - think where this needs to go.
|
||||||
/*template <typename VertexType>
|
template <typename VertexType>
|
||||||
polyvox_shared_ptr< SurfaceMesh<VertexType> > extractSubset(SurfaceMesh<VertexType>& inputMesh, std::set<uint8_t> setMaterials)
|
polyvox_shared_ptr< SurfaceMesh<VertexType> > extractSubset(SurfaceMesh<VertexType>& inputMesh, std::set<uint8_t> setMaterials)
|
||||||
{
|
{
|
||||||
polyvox_shared_ptr< SurfaceMesh<VertexType> > result(new SurfaceMesh<VertexType>);
|
polyvox_shared_ptr< SurfaceMesh<VertexType> > result(new SurfaceMesh<VertexType>);
|
||||||
@ -460,7 +460,7 @@ namespace PolyVox
|
|||||||
result->m_vecLodRecords.push_back(lodRecord);
|
result->m_vecLodRecords.push_back(lodRecord);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
template <typename VertexType>
|
template <typename VertexType>
|
||||||
void SurfaceMesh<VertexType>::scaleVertices(float amount)
|
void SurfaceMesh<VertexType>::scaleVertices(float amount)
|
||||||
|
@ -28,9 +28,6 @@ freely, subject to the following restrictions:
|
|||||||
|
|
||||||
namespace PolyVox
|
namespace PolyVox
|
||||||
{
|
{
|
||||||
template<typename VolumeType>
|
|
||||||
typename VolumeType::VoxelType interpolatedSample(VolumeType* pVolume, float fPosX, float fPosY, float fPosZ, WrapMode eWrapMode, typename VolumeType::VoxelType tBorder);
|
|
||||||
|
|
||||||
template< typename SrcVolumeType, typename DstVolumeType>
|
template< typename SrcVolumeType, typename DstVolumeType>
|
||||||
class VolumeResampler
|
class VolumeResampler
|
||||||
{
|
{
|
||||||
@ -42,7 +39,6 @@ namespace PolyVox
|
|||||||
private:
|
private:
|
||||||
void resampleSameSize();
|
void resampleSameSize();
|
||||||
void resampleArbitrary();
|
void resampleArbitrary();
|
||||||
void resampleBetter();
|
|
||||||
|
|
||||||
//Source data
|
//Source data
|
||||||
SrcVolumeType* m_pVolSrc;
|
SrcVolumeType* m_pVolSrc;
|
||||||
|
@ -23,43 +23,10 @@ freely, subject to the following restrictions:
|
|||||||
|
|
||||||
#include "PolyVoxCore/Interpolation.h"
|
#include "PolyVoxCore/Interpolation.h"
|
||||||
|
|
||||||
#include "PolyVoxCore/Impl/Utility.h"
|
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
namespace PolyVox
|
namespace PolyVox
|
||||||
{
|
{
|
||||||
// Takes an interpolated sample of the volume data.
|
|
||||||
template<typename VolumeType>
|
|
||||||
typename VolumeType::VoxelType interpolatedSample(VolumeType* pVolume, float fPosX, float fPosY, float fPosZ, WrapMode eWrapMode, typename VolumeType::VoxelType tBorder)
|
|
||||||
{
|
|
||||||
float fFloorX = floor(fPosX);
|
|
||||||
float fFloorY = floor(fPosY);
|
|
||||||
float fFloorZ = floor(fPosZ);
|
|
||||||
|
|
||||||
float fInterpX = fPosX - fFloorX;
|
|
||||||
float fInterpY = fPosY - fFloorY;
|
|
||||||
float fInterpZ = fPosZ - fFloorZ;
|
|
||||||
|
|
||||||
// Conditional logic required to round negative floats correctly
|
|
||||||
int32_t iX = static_cast<int32_t>(fFloorX > 0.0f ? fFloorX + 0.5f : fFloorX - 0.5f);
|
|
||||||
int32_t iY = static_cast<int32_t>(fFloorY > 0.0f ? fFloorY + 0.5f : fFloorY - 0.5f);
|
|
||||||
int32_t iZ = static_cast<int32_t>(fFloorZ > 0.0f ? fFloorZ + 0.5f : fFloorZ - 0.5f);
|
|
||||||
|
|
||||||
const typename VolumeType::VoxelType& voxel000 = pVolume->getVoxelWithWrapping(iX, iY, iZ, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel001 = pVolume->getVoxelWithWrapping(iX, iY, iZ + 1, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel010 = pVolume->getVoxelWithWrapping(iX, iY + 1, iZ, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel011 = pVolume->getVoxelWithWrapping(iX, iY + 1, iZ + 1, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel100 = pVolume->getVoxelWithWrapping(iX + 1, iY, iZ, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel101 = pVolume->getVoxelWithWrapping(iX + 1, iY, iZ + 1, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel110 = pVolume->getVoxelWithWrapping(iX + 1, iY + 1, iZ, eWrapMode, tBorder);
|
|
||||||
const typename VolumeType::VoxelType& voxel111 = pVolume->getVoxelWithWrapping(iX + 1, iY + 1, iZ + 1, eWrapMode, tBorder);
|
|
||||||
|
|
||||||
typename VolumeType::VoxelType tInterpolatedValue = PolyVox::trilerp(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,fInterpX,fInterpY,fInterpZ);
|
|
||||||
|
|
||||||
return tInterpolatedValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \param pVolSrc
|
* \param pVolSrc
|
||||||
* \param regSrc
|
* \param regSrc
|
||||||
@ -86,16 +53,14 @@ namespace PolyVox
|
|||||||
int32_t uDstHeight = m_regDst.getUpperY() - m_regDst.getLowerY() + 1;
|
int32_t uDstHeight = m_regDst.getUpperY() - m_regDst.getLowerY() + 1;
|
||||||
int32_t uDstDepth = m_regDst.getUpperZ() - m_regDst.getLowerZ() + 1;
|
int32_t uDstDepth = m_regDst.getUpperZ() - m_regDst.getLowerZ() + 1;
|
||||||
|
|
||||||
/*if((uSrcWidth == uDstWidth) && (uSrcHeight == uDstHeight) && (uSrcDepth == uDstDepth))
|
if((uSrcWidth == uDstWidth) && (uSrcHeight == uDstHeight) && (uSrcDepth == uDstDepth))
|
||||||
{
|
{
|
||||||
resampleSameSize();
|
resampleSameSize();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resampleArbitrary();
|
resampleArbitrary();
|
||||||
}*/
|
}
|
||||||
|
|
||||||
resampleBetter();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template< typename SrcVolumeType, typename DstVolumeType>
|
template< typename SrcVolumeType, typename DstVolumeType>
|
||||||
@ -162,7 +127,7 @@ namespace PolyVox
|
|||||||
sy = modf(sy, &dummy);
|
sy = modf(sy, &dummy);
|
||||||
sz = modf(sz, &dummy);
|
sz = modf(sz, &dummy);
|
||||||
|
|
||||||
typename SrcVolumeType::VoxelType tInterpolatedValue = trilerp(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,sx,sy,sz);
|
typename SrcVolumeType::VoxelType tInterpolatedValue = trilerp<float>(voxel000,voxel100,voxel010,voxel110,voxel001,voxel101,voxel011,voxel111,sx,sy,sz);
|
||||||
|
|
||||||
typename DstVolumeType::VoxelType result = static_cast<typename DstVolumeType::VoxelType>(tInterpolatedValue);
|
typename DstVolumeType::VoxelType result = static_cast<typename DstVolumeType::VoxelType>(tInterpolatedValue);
|
||||||
m_pVolDst->setVoxelAt(dx,dy,dz,result);
|
m_pVolDst->setVoxelAt(dx,dy,dz,result);
|
||||||
@ -170,108 +135,4 @@ namespace PolyVox
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template< typename SrcVolumeType, typename DstVolumeType>
|
|
||||||
void VolumeResampler<SrcVolumeType, DstVolumeType>::resampleBetter()
|
|
||||||
{
|
|
||||||
float srcWidth = m_regSrc.getWidthInCells();
|
|
||||||
float srcHeight = m_regSrc.getHeightInCells();
|
|
||||||
float srcDepth = m_regSrc.getDepthInCells();
|
|
||||||
|
|
||||||
float dstWidth = m_regDst.getWidthInCells();
|
|
||||||
float dstHeight = m_regDst.getHeightInCells();
|
|
||||||
float dstDepth = m_regDst.getDepthInCells();
|
|
||||||
|
|
||||||
float fScaleX = srcWidth / dstWidth;
|
|
||||||
float fScaleY = srcHeight / dstHeight;
|
|
||||||
float fScaleZ = srcDepth / dstDepth;
|
|
||||||
|
|
||||||
typename SrcVolumeType::Sampler sampler(m_pVolSrc);
|
|
||||||
|
|
||||||
// Should use SrcVolumeType? Or new template parameter?
|
|
||||||
Region regDownscaledX(0, 0, 0, m_regDst.getWidthInVoxels()-1, m_regSrc.getHeightInVoxels()-1, m_regSrc.getDepthInVoxels()-1);
|
|
||||||
SrcVolumeType volDownscaledX(regDownscaledX);
|
|
||||||
|
|
||||||
for(int32_t tz = regDownscaledX.getLowerZ(); tz <= regDownscaledX.getUpperZ(); tz++)
|
|
||||||
{
|
|
||||||
for(int32_t ty = regDownscaledX.getLowerY(); ty <= regDownscaledX.getUpperY(); ty++)
|
|
||||||
{
|
|
||||||
for(int32_t tx = regDownscaledX.getLowerX(); tx <= regDownscaledX.getUpperX(); tx++)
|
|
||||||
{
|
|
||||||
float sx = (tx * fScaleX) + m_regSrc.getLowerCorner().getX();
|
|
||||||
float sy = (ty ) + m_regSrc.getLowerCorner().getY();
|
|
||||||
float sz = (tz ) + m_regSrc.getLowerCorner().getZ();
|
|
||||||
|
|
||||||
typename SrcVolumeType::VoxelType result = m_pVolSrc->getVoxelWithWrapping(sx, sy, sz, WrapModes::Border);
|
|
||||||
|
|
||||||
//typename SrcVolumeType::VoxelType result = interpolatedSample(m_pVolSrc, sx, sy, sz, WrapModes::Border, SrcVolumeType::VoxelType(0));
|
|
||||||
|
|
||||||
volDownscaledX.setVoxelAt(tx, ty, tz, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Now downscale in y
|
|
||||||
Region regDownscaledXAndY(0, 0, 0, m_regDst.getWidthInVoxels()-1, m_regDst.getHeightInVoxels()-1, m_regSrc.getDepthInVoxels()-1);
|
|
||||||
SrcVolumeType volDownscaledXAndY(regDownscaledXAndY);
|
|
||||||
|
|
||||||
for(int32_t tz = regDownscaledXAndY.getLowerZ(); tz <= regDownscaledXAndY.getUpperZ(); tz++)
|
|
||||||
{
|
|
||||||
for(int32_t ty = regDownscaledXAndY.getLowerY(); ty <= regDownscaledXAndY.getUpperY(); ty++)
|
|
||||||
{
|
|
||||||
for(int32_t tx = regDownscaledXAndY.getLowerX(); tx <= regDownscaledXAndY.getUpperX(); tx++)
|
|
||||||
{
|
|
||||||
float sx = (tx );
|
|
||||||
float sy = (ty * fScaleY);
|
|
||||||
float sz = (tz );
|
|
||||||
|
|
||||||
typename SrcVolumeType::VoxelType result = volDownscaledX.getVoxelWithWrapping(sx, sy, sz, WrapModes::Border);
|
|
||||||
|
|
||||||
volDownscaledXAndY.setVoxelAt(tx, ty, tz, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Now copy and downscale to dst.
|
|
||||||
//Region regDst = m_pVolDst->getEnclosingRegion();
|
|
||||||
|
|
||||||
for(int32_t tz = m_regDst.getLowerZ(); tz <= m_regDst.getUpperZ(); tz++)
|
|
||||||
{
|
|
||||||
for(int32_t ty = m_regDst.getLowerY(); ty <= m_regDst.getUpperY(); ty++)
|
|
||||||
{
|
|
||||||
for(int32_t tx = m_regDst.getLowerX(); tx <= m_regDst.getUpperX(); tx++)
|
|
||||||
{
|
|
||||||
float sx = (tx - m_regDst.getLowerX());
|
|
||||||
float sy = (ty - m_regDst.getLowerY());
|
|
||||||
float sLowerZ = ((tz - 1) - m_regDst.getLowerZ()) * fScaleZ;
|
|
||||||
float sCentreZ = ((tz ) - m_regDst.getLowerZ()) * fScaleZ;
|
|
||||||
float sUpperZ = ((tz + 1) - m_regDst.getLowerZ()) * fScaleZ;
|
|
||||||
|
|
||||||
float sumOfWeights = 0.0f;
|
|
||||||
//typename SrcVolumeType::VoxelType tSum = SrcVolumeType::VoxelType(0);
|
|
||||||
|
|
||||||
//We should be able to use a higher range MultiMaterial rather than needing to use a Vector of floats.
|
|
||||||
//We shouold also probably support an Accumulation type rather than hard coding.
|
|
||||||
Vector<4, float> vecSum(0.0, 0.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
for(float sz = sLowerZ; sz <= sUpperZ; sz += 1.0)
|
|
||||||
{
|
|
||||||
float weight = triangleFilter(sz - sCentreZ);
|
|
||||||
sumOfWeights += weight;
|
|
||||||
|
|
||||||
//This is wrong! There's no need to do interpolation. Just multiply the sameple by the correct kernel value.
|
|
||||||
Vector<4, float> sample = interpolatedSample(&volDownscaledXAndY, sx, sy, sz, WrapModes::Border, SrcVolumeType::VoxelType());
|
|
||||||
|
|
||||||
vecSum += (sample * weight);
|
|
||||||
}
|
|
||||||
|
|
||||||
vecSum /= sumOfWeights; //Should divide by 'norm'
|
|
||||||
|
|
||||||
typename SrcVolumeType::VoxelType tResult = vecSum; //Should divide by 'norm'
|
|
||||||
|
|
||||||
m_pVolDst->setVoxelAt(tx, ty, tz, tResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -69,9 +69,4 @@ namespace PolyVox
|
|||||||
v++;
|
v++;
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
float triangleFilter(float fInput)
|
|
||||||
{
|
|
||||||
return (std::max)(1.0f - (std::abs)(fInput), 0.0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ namespace PolyVox
|
|||||||
* \param iZ The 'z' position of the point to test.
|
* \param iZ The 'z' position of the point to test.
|
||||||
* \param boundary The desired boundary value.
|
* \param boundary The desired boundary value.
|
||||||
*/
|
*/
|
||||||
bool Region::containsPoint(int32_t iX, int32_t iY, int32_t iZ, int8_t boundary) const
|
bool Region::containsPoint(int32_t iX, int32_t iY, int32_t iZ, uint8_t boundary) const
|
||||||
{
|
{
|
||||||
return (iX <= m_iUpperX - boundary)
|
return (iX <= m_iUpperX - boundary)
|
||||||
&& (iY <= m_iUpperY - boundary)
|
&& (iY <= m_iUpperY - boundary)
|
||||||
@ -218,7 +218,7 @@ namespace PolyVox
|
|||||||
* \param pos The position to test.
|
* \param pos The position to test.
|
||||||
* \param boundary The desired boundary value.
|
* \param boundary The desired boundary value.
|
||||||
*/
|
*/
|
||||||
bool Region::containsPoint(const Vector3DInt32& pos, int8_t boundary) const
|
bool Region::containsPoint(const Vector3DInt32& pos, uint8_t boundary) const
|
||||||
{
|
{
|
||||||
return containsPoint(pos.getX(), pos.getY(), pos.getZ(), boundary);
|
return containsPoint(pos.getX(), pos.getY(), pos.getZ(), boundary);
|
||||||
}
|
}
|
||||||
@ -243,7 +243,7 @@ namespace PolyVox
|
|||||||
* \param pos The position to test.
|
* \param pos The position to test.
|
||||||
* \param boundary The desired boundary value.
|
* \param boundary The desired boundary value.
|
||||||
*/
|
*/
|
||||||
bool Region::containsPointInX(int32_t pos, int8_t boundary) const
|
bool Region::containsPointInX(int32_t pos, uint8_t boundary) const
|
||||||
{
|
{
|
||||||
return (pos <= m_iUpperX - boundary)
|
return (pos <= m_iUpperX - boundary)
|
||||||
&& (pos >= m_iLowerX + boundary);
|
&& (pos >= m_iLowerX + boundary);
|
||||||
@ -269,7 +269,7 @@ namespace PolyVox
|
|||||||
* \param pos The position to test.
|
* \param pos The position to test.
|
||||||
* \param boundary The desired boundary value.
|
* \param boundary The desired boundary value.
|
||||||
*/
|
*/
|
||||||
bool Region::containsPointInY(int32_t pos, int8_t boundary) const
|
bool Region::containsPointInY(int32_t pos, uint8_t boundary) const
|
||||||
{
|
{
|
||||||
return (pos <= m_iUpperY - boundary)
|
return (pos <= m_iUpperY - boundary)
|
||||||
&& (pos >= m_iLowerY + boundary);
|
&& (pos >= m_iLowerY + boundary);
|
||||||
@ -295,7 +295,7 @@ namespace PolyVox
|
|||||||
* \param pos The position to test.
|
* \param pos The position to test.
|
||||||
* \param boundary The desired boundary value.
|
* \param boundary The desired boundary value.
|
||||||
*/
|
*/
|
||||||
bool Region::containsPointInZ(int32_t pos, int8_t boundary) const
|
bool Region::containsPointInZ(int32_t pos, uint8_t boundary) const
|
||||||
{
|
{
|
||||||
return (pos <= m_iUpperZ - boundary)
|
return (pos <= m_iUpperZ - boundary)
|
||||||
&& (pos >= m_iLowerZ + boundary);
|
&& (pos >= m_iLowerZ + boundary);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user