diff --git a/Engine/source/math/test/mBoxTest.cpp b/Engine/source/math/test/mBoxTest.cpp new file mode 100644 index 000000000..cd09a0109 --- /dev/null +++ b/Engine/source/math/test/mBoxTest.cpp @@ -0,0 +1,42 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2014 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifdef TORQUE_TESTS_ENABLED +#include "testing/unitTesting.h" +#include "math/mBox.h" + +TEST(Box3F, GetOverlap) +{ + Box3F b1(Point3F(-1, -1, -1), Point3F(1, 1, 1)); + EXPECT_EQ(b1.getOverlap(b1), b1) + << "A box's overlap with itself should be itself."; + + Box3F b2(Point3F(0, 0, 0), Point3F(1, 1, 1)); + EXPECT_EQ(b1.getOverlap(b2), b2) + << "Box's overlap should be the intersection of two boxes."; + + Box3F b3(Point3F(10, 10, 10), Point3F(11, 11, 11)); + EXPECT_TRUE(b1.getOverlap(b3).isEmpty()) + << "Overlap of boxes that do not overlap should be empty."; +} + +#endif \ No newline at end of file diff --git a/Engine/source/math/test/mPlaneTest.cpp b/Engine/source/math/test/mPlaneTest.cpp new file mode 100644 index 000000000..0013c63c6 --- /dev/null +++ b/Engine/source/math/test/mPlaneTest.cpp @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2014 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifdef TORQUE_TESTS_ENABLED +#include "testing/unitTesting.h" +#include "math/mPlane.h" + +// Static test data. All combinations of position and normal are tested in each +// test case. This allows a large number of tests without introducing non- +// deterministic test behavior. + +static const Point3F positions[] = {Point3F(0, 0, 0), Point3F(1, -2, 3), Point3F(1e5, 2e5, -3e6)}; +static const U32 numPositions = sizeof(positions) / sizeof(Point3F); + +static const Point3F normals[] = {Point3F(1, 0, 0), Point3F(-4, -2, 6), Point3F(1e8, 2e7, 5e-2)}; +static const U32 numNormals = sizeof(normals) / sizeof(Point3F); + +/// Tests that points in the direction of the normal are in 'Front' of the +/// plane, while points in the reverse direction of the normal are in +/// 'Back' of the plane. +TEST(Plane, WhichSide) +{ + for(U32 i = 0; i < numPositions; i++) { + for(U32 j = 0; i < numNormals; j++) { + Point3F position = positions[i]; + Point3F normal = normals[j]; + + PlaneF p(position, normal); + + EXPECT_EQ(p.whichSide(position + normal), PlaneF::Front ); + EXPECT_EQ(p.whichSide(position - normal), PlaneF::Back ); + EXPECT_EQ(p.whichSide(position), PlaneF::On ); + } + } +} + +/// Tests that the distToPlane method returns the exact length that the test +/// point is offset by in the direction of the normal. +TEST(Plane, DistToPlane) +{ + for(U32 i = 0; i < numPositions; i++) { + for(U32 j = 0; i < numNormals; j++) { + Point3F position = positions[i]; + Point3F normal = normals[j]; + + PlaneF p(position, normal); + + EXPECT_FLOAT_EQ(p.distToPlane(position + normal), normal.len()); + EXPECT_FLOAT_EQ(p.distToPlane(position - normal), -normal.len()); + EXPECT_FLOAT_EQ(p.distToPlane(position), 0); + } + } +} + +#endif diff --git a/Engine/source/math/test/mPolyhedronTest.cpp b/Engine/source/math/test/mPolyhedronTest.cpp new file mode 100644 index 000000000..c2a949573 --- /dev/null +++ b/Engine/source/math/test/mPolyhedronTest.cpp @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2014 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifdef TORQUE_TESTS_ENABLED +#include "testing/unitTesting.h" +#include "math/mPolyhedron.h" + +FIXTURE(Polyhedron) +{ +protected: + Vector planes; + + virtual void SetUp() + { + // Build planes for a unit cube centered at the origin. + // Note that the normals must be facing inwards. + planes.push_back(PlaneF(Point3F(-0.5f, 0.f, 0.f ), Point3F( 1.f, 0.f, 0.f))); + planes.push_back(PlaneF(Point3F( 0.5f, 0.f, 0.f ), Point3F(-1.f, 0.f, 0.f))); + planes.push_back(PlaneF(Point3F( 0.f, -0.5f, 0.f ), Point3F( 0.f, 1.f, 0.f))); + planes.push_back(PlaneF(Point3F( 0.f, 0.5f, 0.f ), Point3F( 0.f, -1.f, 0.f))); + planes.push_back(PlaneF(Point3F( 0.f, 0.f, -0.5f), Point3F( 0.f, 0.f, 1.f))); + planes.push_back(PlaneF(Point3F( 0.f, 0.f, 0.5f), Point3F( 0.f, 0.f, -1.f))); + } +}; + +TEST_FIX(Polyhedron, BuildFromPlanes) +{ + // Turn planes into a polyhedron. + Polyhedron p1; + p1.buildFromPlanes(PlaneSetF(planes.address(), planes.size())); + + // Check if we got a cube back. + EXPECT_EQ(p1.getNumPoints(), 8); + EXPECT_EQ(p1.getNumPlanes(), 6); + EXPECT_EQ(p1.getNumEdges(), 12); + + // Add extra plane that doesn't contribute a new edge. + Vector planes2 = planes; + planes2.push_back( PlaneF( Point3F( 0.5f, 0.5f, 0.5f ), Point3F( -1.f, -1.f, -1.f ) ) ); + + // Turn them into another polyhedron. + Polyhedron p2; + p2.buildFromPlanes(PlaneSetF(planes2.address(), planes2.size())); + + // Check if we got a cube back. + EXPECT_EQ(p2.getNumPoints(), 8); + EXPECT_EQ(p2.getNumPlanes(), 6); + EXPECT_EQ(p2.getNumEdges(), 12); +} + +#endif diff --git a/Engine/source/math/test/testMathPlane.cpp b/Engine/source/math/test/testMathPlane.cpp deleted file mode 100644 index 6600c235e..000000000 --- a/Engine/source/math/test/testMathPlane.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "unit/test.h" -#include "math/mPlane.h" -#include "math/mRandom.h" - - -#ifndef TORQUE_SHIPPING - -using namespace UnitTesting; - -#define TEST( x ) test( ( x ), "FAIL: " #x ) -#define XTEST( t, x ) t->test( ( x ), "FAIL: " #x ) - -CreateUnitTest( TestMathPlane, "Math/Plane" ) -{ - static F32 randF() - { - return gRandGen.randF( -1.f, 1.f ); - } - - void test_whichSide() - { - for( U32 i = 0; i < 100; ++ i ) - { - Point3F position( randF(), randF(), randF() ); - Point3F normal( randF(), randF(), randF() ); - - PlaneF p1( position, normal ); - - TEST( p1.whichSide( position + normal ) == PlaneF::Front ); - TEST( p1.whichSide( position + ( - normal ) ) == PlaneF::Back ); - TEST( p1.whichSide( position ) == PlaneF::On ); - } - } - - void test_distToPlane() - { - for( U32 i = 0; i < 100; ++ i ) - { - Point3F position( randF(), randF(), randF() ); - Point3F normal( randF(), randF(), randF() ); - - PlaneF p1( position, normal ); - - TEST( mIsEqual( p1.distToPlane( position + normal ), normal.len() ) ); - TEST( mIsEqual( p1.distToPlane( position + ( - normal ) ), - normal.len() ) ); - TEST( mIsZero( p1.distToPlane( position ) ) ); - } - } - - void run() - { - test_whichSide(); - test_distToPlane(); - } -}; - -#endif // !TORQUE_SHIPPING diff --git a/Engine/source/math/test/testPolyhedron.cpp b/Engine/source/math/test/testPolyhedron.cpp deleted file mode 100644 index 2bfe9b13f..000000000 --- a/Engine/source/math/test/testPolyhedron.cpp +++ /dev/null @@ -1,104 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "unit/test.h" -#include "math/mPolyhedron.h" - - -#ifndef TORQUE_SHIPPING - -using namespace UnitTesting; - -#define TEST( x ) test( ( x ), "FAIL: " #x ) -#define XTEST( t, x ) t->test( ( x ), "FAIL: " #x ) - - -CreateUnitTest( TestMathPolyhedronBuildFromPlanes, "Math/Polyhedron/BuildFromPlanes" ) -{ - void test_unitCube() - { - Vector< PlaneF > planes; - - // Build planes for a unit cube centered at the origin. - // Note that the normals must be facing inwards. - - planes.push_back( PlaneF( Point3F( -0.5f, 0.f, 0.f ), Point3F( 1.f, 0.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.5f, 0.f, 0.f ), Point3F( -1.f, 0.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, -0.5f, 0.f ), Point3F( 0.f, 1.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.5f, 0.f ), Point3F( 0.f, -1.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.f, -0.5f ), Point3F( 0.f, 0.f, 1.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.f, 0.5f ), Point3F( 0.f, 0.f, -1.f ) ) ); - - // Turn it into a polyhedron. - - Polyhedron polyhedron; - polyhedron.buildFromPlanes( - PlaneSetF( planes.address(), planes.size() ) - ); - - // Check if we got a cube back. - - TEST( polyhedron.getNumPoints() == 8 ); - TEST( polyhedron.getNumPlanes() == 6 ); - TEST( polyhedron.getNumEdges() == 12 ); - } - - void test_extraPlane() - { - Vector< PlaneF > planes; - - // Build planes for a unit cube centered at the origin. - // Note that the normals must be facing inwards. - - planes.push_back( PlaneF( Point3F( -0.5f, 0.f, 0.f ), Point3F( 1.f, 0.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.5f, 0.f, 0.f ), Point3F( -1.f, 0.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, -0.5f, 0.f ), Point3F( 0.f, 1.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.5f, 0.f ), Point3F( 0.f, -1.f, 0.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.f, -0.5f ), Point3F( 0.f, 0.f, 1.f ) ) ); - planes.push_back( PlaneF( Point3F( 0.f, 0.f, 0.5f ), Point3F( 0.f, 0.f, -1.f ) ) ); - - // Add extra plane that doesn't contribute a new edge. - - planes.push_back( PlaneF( Point3F( 0.5f, 0.5f, 0.5f ), Point3F( -1.f, -1.f, -1.f ) ) ); - - // Turn it into a polyhedron. - - Polyhedron polyhedron; - polyhedron.buildFromPlanes( - PlaneSetF( planes.address(), planes.size() ) - ); - - // Check if we got a cube back. - - TEST( polyhedron.getNumPoints() == 8 ); - TEST( polyhedron.getNumPlanes() == 6 ); - TEST( polyhedron.getNumEdges() == 12 ); - } - - void run() - { - test_unitCube(); - //test_extraPlane(); - } -}; - -#endif // !TORQUE_SHIPPING