diff --git a/library/PolyVoxCore/include/PolyVoxCore/AmbientOcclusionCalculator.inl b/library/PolyVoxCore/include/PolyVoxCore/AmbientOcclusionCalculator.inl index 5434c8fb..17072923 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/AmbientOcclusionCalculator.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/AmbientOcclusionCalculator.inl @@ -40,6 +40,8 @@ namespace PolyVox ,m_arrayResult(arrayResult) ,m_fRayLength(fRayLength) ,m_uNoOfSamplesPerOutputElement(uNoOfSamplesPerOutputElement) + ,mRandomUnitVectorIndex(0) //Although these could be uninitialised, we + ,mRandomVectorIndex(0) //initialise for consistant results in the tests. { //Make sure that the size of the volume is an exact multiple of the size of the array. assert(m_volInput->getWidth() % arrayResult->getDimension(0) == 0); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d911fcd2..1352f1a2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -29,6 +29,16 @@ ENDIF() INCLUDE_DIRECTORIES(${PolyVox_SOURCE_DIR}/PolyVoxCore/include ${CMAKE_CURRENT_BINARY_DIR}) REMOVE_DEFINITIONS(-DQT_GUI_LIB) #Make sure the tests don't link to the QtGui +# Test Template. Copy and paste this template for consistant naming. +# # ClassName tests +# CREATE_TEST(TestClassName.h TestClassName.cpp TestClassName) +# ADD_TEST(ClassNameFeature1Test ${LATEST_TEST} testFeature1) +# ADD_TEST(ClassNameFeature2Test ${LATEST_TEST} testFeature2) + +# AmbientOcclusionGenerator tests +CREATE_TEST(TestAmbientOcclusionGenerator.h TestAmbientOcclusionGenerator.cpp TestAmbientOcclusionGenerator) +ADD_TEST(AmbientOcclusionGeneratorExecuteTest ${LATEST_TEST} testExecute) + # Array tests CREATE_TEST(TestArray.h TestArray.cpp TestArray) ADD_TEST(ArrayReadWriteTest ${LATEST_TEST} testReadWrite) diff --git a/tests/TestAmbientOcclusionGenerator.cpp b/tests/TestAmbientOcclusionGenerator.cpp new file mode 100644 index 00000000..6c2398cc --- /dev/null +++ b/tests/TestAmbientOcclusionGenerator.cpp @@ -0,0 +1,76 @@ +/******************************************************************************* +Copyright (c) 2010 Matt 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. +*******************************************************************************/ + +#include "TestAmbientOcclusionGenerator.h" + +#include "PolyVoxCore/AmbientOcclusionCalculator.h" +#include "PolyVoxCore/Material.h" +#include "PolyVoxCore/SimpleVolume.h" + +#include + +using namespace PolyVox; + +void TestAmbientOcclusionGenerator::testExecute() +{ + const int32_t g_uVolumeSideLength = 64; + + //Create empty volume + SimpleVolume volData(Region(Vector3DInt32(0,0,0), Vector3DInt32(g_uVolumeSideLength-1, g_uVolumeSideLength-1, g_uVolumeSideLength-1))); + + //Create two solid walls at opposite sides of the volume + for (int32_t z = 0; z < g_uVolumeSideLength; z++) + { + if((z < 20) || (z > g_uVolumeSideLength - 20)) + { + for (int32_t y = 0; y < g_uVolumeSideLength; y++) + { + for (int32_t x = 0; x < g_uVolumeSideLength; x++) + { + Material8 voxel(1); + volData.setVoxelAt(x, y, z, voxel); + } + } + } + } + + //Create an array to store the result. Array can be smaller than the volume by an integer amount. + const int32_t g_uArraySideLength = g_uVolumeSideLength / 2; + Array<3, uint8_t> ambientOcclusionResult(ArraySizes(g_uArraySideLength)(g_uArraySideLength)(g_uArraySideLength)); + + //Create the ambient occlusion calculator + AmbientOcclusionCalculator calculator(&volData, &ambientOcclusionResult, volData.getEnclosingRegion(), 32.0f, 255); + + //Execute the calculator + calculator.execute(); + + //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. + QCOMPARE(static_cast(ambientOcclusionResult[16][ 0][16]), 178); + QCOMPARE(static_cast(ambientOcclusionResult[16][ 8][16]), 109); + QCOMPARE(static_cast(ambientOcclusionResult[16][16][16]), 103); + QCOMPARE(static_cast(ambientOcclusionResult[16][24][16]), 123); + QCOMPARE(static_cast(ambientOcclusionResult[16][31][16]), 173); +} + +QTEST_MAIN(TestAmbientOcclusionGenerator) diff --git a/tests/TestAmbientOcclusionGenerator.h b/tests/TestAmbientOcclusionGenerator.h new file mode 100644 index 00000000..8d74ea14 --- /dev/null +++ b/tests/TestAmbientOcclusionGenerator.h @@ -0,0 +1,37 @@ +/******************************************************************************* +Copyright (c) 2010 Matt 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_TestVolume_H__ +#define __PolyVox_TestVolume_H__ + +#include + +class TestAmbientOcclusionGenerator: public QObject +{ + Q_OBJECT + + private slots: + void testExecute(); +}; + +#endif