From d2a94ac6f4fbfd000237566cdb1a2ef21e3b73ee Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Feb 2012 17:08:00 +0100 Subject: [PATCH] Added test for raycast. --- tests/CMakeLists.txt | 6 +++- tests/TestRaycast.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++ tests/TestRaycast.h | 37 +++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 tests/TestRaycast.cpp create mode 100644 tests/TestRaycast.h diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index cc176a07..4f1f6179 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -59,6 +59,10 @@ ADD_TEST(VolumeSizeTest ${LATEST_TEST} testSize) CREATE_TEST(testmaterial.h testmaterial.cpp testmaterial) ADD_TEST(MaterialTestCompile ${LATEST_TEST} testCompile) +# Raycast tests +CREATE_TEST(TestRaycast.h TestRaycast.cpp TestRaycast) +ADD_TEST(RaycastExecuteTest ${LATEST_TEST} testExecute) + # Region tests CREATE_TEST(TestRegion.h TestRegion.cpp TestRegion) ADD_TEST(RegionEqualityTest ${LATEST_TEST} testEquality) @@ -76,6 +80,6 @@ ADD_TEST(VectorEqualityTest ${LATEST_TEST} testEquality) CREATE_TEST(TestVolumeSubclass.h TestVolumeSubclass.cpp TestVolumeSubclass) ADD_TEST(VolumeSubclassExtractSurfaceTest ${LATEST_TEST} testExtractSurface) -# ClassName tests +# Voxel tests CREATE_TEST(TestVoxels.h TestVoxels.cpp TestVoxels) ADD_TEST(VoxelsTraitsTest ${LATEST_TEST} testVoxelTypeLimits) diff --git a/tests/TestRaycast.cpp b/tests/TestRaycast.cpp new file mode 100644 index 00000000..e523da4a --- /dev/null +++ b/tests/TestRaycast.cpp @@ -0,0 +1,82 @@ +/******************************************************************************* +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 "TestRaycast.h" + +#include "PolyVoxCore/Density.h" +#include "PolyVoxCore/Raycast.h" +#include "PolyVoxCore/SimpleVolume.h" + +#include "PolyVoxImpl/RandomUnitVectors.h" + +#include + +using namespace PolyVox; + +void TestRaycast::testExecute() +{ + const int32_t uVolumeSideLength = 32; + + //Create a hollow volume, with solid sides on x and y but with open ends in z. + SimpleVolume volData(Region(Vector3DInt32(0,0,0), Vector3DInt32(uVolumeSideLength-1, uVolumeSideLength-1, uVolumeSideLength-1))); + for (int32_t z = 0; z < uVolumeSideLength; z++) + { + for (int32_t y = 0; y < uVolumeSideLength; y++) + { + for (int32_t x = 0; x < uVolumeSideLength; x++) + { + Density8 voxelValue; + + if((x == 0) || (x == uVolumeSideLength-1) || (y == 0) || (y == uVolumeSideLength-1)) + { + voxelValue.setDensity(255); + } + else + { + voxelValue.setDensity(0); + } + + volData.setVoxelAt(x, y, z, voxelValue); + } + } + } + + //Cast rays from the centre. Roughly 2/3 should escape. + Vector3DFloat start (uVolumeSideLength / 2, uVolumeSideLength / 2, uVolumeSideLength / 2); + int hits = 0; + for(int ct = 0; ct < 1000000; ct++) + { + RaycastResult result; + Raycast raycast(&volData, start, randomUnitVectors[ct % 1024] * 1000.0f, result); + raycast.execute(); + if(result.foundIntersection) + { + hits++; + } + } + + //Check the number of hits. + QCOMPARE(hits, 687494); +} + +QTEST_MAIN(TestRaycast) diff --git a/tests/TestRaycast.h b/tests/TestRaycast.h new file mode 100644 index 00000000..ee6c3154 --- /dev/null +++ b/tests/TestRaycast.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_TestRaycast_H__ +#define __PolyVox_TestRaycast_H__ + +#include + +class TestRaycast: public QObject +{ + Q_OBJECT + + private slots: + void testExecute(); +}; + +#endif