Tidying up unclassed ambient occlusion calculator.

This commit is contained in:
David Williams 2012-10-05 15:57:41 +02:00
parent 3b61adefaa
commit b86a3552e6
2 changed files with 25 additions and 22 deletions

View File

@ -68,40 +68,31 @@ namespace PolyVox
polyvox_function<bool(const typename VolumeType::VoxelType& voxel)> m_funcIsTransparent; polyvox_function<bool(const typename VolumeType::VoxelType& voxel)> m_funcIsTransparent;
}; };
class IsVoxelTransparent template<typename IsVoxelTransparentCallback>
{
public:
bool operator()(uint8_t voxel)
{
return voxel == 0;
}
};
template<typename IsTransparentCallback>
class AmbientOcclusionCalculatorRaycastCallback class AmbientOcclusionCalculatorRaycastCallback
{ {
public: public:
AmbientOcclusionCalculatorRaycastCallback() AmbientOcclusionCalculatorRaycastCallback(IsVoxelTransparentCallback isVoxelTransparentCallback)
{ {
mIsVoxelTransparentCallback = isVoxelTransparentCallback;
} }
bool operator()(const SimpleVolume<uint8_t>::Sampler& sampler) bool operator()(const SimpleVolume<uint8_t>::Sampler& sampler)
{ {
//return sampler.getVoxel() == 0;
//return IsTransparentCallback(sampler.getVoxel());
uint8_t sample = sampler.getVoxel(); uint8_t sample = sampler.getVoxel();
bool direct = sample == 0; bool direct = sample == 0;
IsTransparentCallback funcToCall; bool func = mIsVoxelTransparentCallback(sample);
bool func = funcToCall(sample);
assert(direct == func); assert(direct == func);
return direct; return direct;
} }
IsVoxelTransparentCallback mIsVoxelTransparentCallback;
}; };
template<typename VolumeType/*, typename IsTransparentCallback*/> template<typename VolumeType, typename IsVoxelTransparentCallback>
void calculateAmbientOcclusion(VolumeType* volInput, Array<3, uint8_t>* arrayResult, Region region, float fRayLength, uint8_t uNoOfSamplesPerOutputElement/*, IsTransparentCallback funcIsTransparent*/) void calculateAmbientOcclusion(VolumeType* volInput, Array<3, uint8_t>* arrayResult, Region region, float fRayLength, uint8_t uNoOfSamplesPerOutputElement, IsVoxelTransparentCallback isVoxelTransparentCallback)
{ {
Region m_region = region; Region m_region = region;
typename VolumeType::Sampler m_sampVolume(volInput); typename VolumeType::Sampler m_sampVolume(volInput);
@ -186,7 +177,11 @@ namespace PolyVox
++uVisibleDirections; ++uVisibleDirections;
}*/ }*/
MyRaycastResult result = raycastWithDirection(m_volInput, v3dRayStart, v3dRayDirection, AmbientOcclusionCalculatorRaycastCallback<IsVoxelTransparent>()); //IsVoxelTransparent isVoxelTransparent;
AmbientOcclusionCalculatorRaycastCallback<IsVoxelTransparentCallback> ambientOcclusionCalculatorRaycastCallback(isVoxelTransparentCallback);
MyRaycastResult result = raycastWithDirection(m_volInput, v3dRayStart, v3dRayDirection, ambientOcclusionCalculatorRaycastCallback);
if(result == MyRaycastResults::Completed) if(result == MyRaycastResults::Completed)
{ {
++uVisibleDirections; ++uVisibleDirections;

View File

@ -30,7 +30,14 @@ freely, subject to the following restrictions:
using namespace PolyVox; using namespace PolyVox;
class IsVoxelTransparent
{
public:
bool operator()(uint8_t voxel)
{
return voxel == 0;
}
};
void TestAmbientOcclusionGenerator::testExecute() void TestAmbientOcclusionGenerator::testExecute()
{ {
@ -59,7 +66,8 @@ void TestAmbientOcclusionGenerator::testExecute()
Array<3, uint8_t> ambientOcclusionResult(ArraySizes(g_uArraySideLength)(g_uArraySideLength)(g_uArraySideLength)); Array<3, uint8_t> ambientOcclusionResult(ArraySizes(g_uArraySideLength)(g_uArraySideLength)(g_uArraySideLength));
// Calculate the ambient occlusion values // Calculate the ambient occlusion values
calculateAmbientOcclusion(&volData, &ambientOcclusionResult, volData.getEnclosingRegion(), 32.0f, 255/*, isVoxelTransparent*/); IsVoxelTransparent isVoxelTransparent;
calculateAmbientOcclusion(&volData, &ambientOcclusionResult, volData.getEnclosingRegion(), 32.0f, 255, isVoxelTransparent);
//Check the results by sampling along a line though the centre of the volume. Because //Check the results by sampling along a line though the centre of the volume. Because
//of the two walls we added, samples in the middle are darker than those at the edge. //of the two walls we added, samples in the middle are darker than those at the edge.