소스 검색

Ported maths tests and added a test for #570.

Daniel Buckmaster 11 년 전
부모
커밋
2c2284e699

+ 42 - 0
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

+ 74 - 0
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

+ 70 - 0
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<PlaneF> 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<PlaneF> 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

+ 0 - 79
Engine/source/math/test/testMathPlane.cpp

@@ -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

+ 0 - 104
Engine/source/math/test/testPolyhedron.cpp

@@ -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