fysxasteroids/engine/libraries/coll2d/tests/sphere_sphere.cc

246 lines
6.8 KiB
C++

#include <UnitTest++.h>
#include <coll2d.h>
using namespace coll2d;
using namespace std;
TEST ( CheckSphereSphereInvalidTypes ) {
Shape* polygon = new Polygon (0, NULL);
vector3d velocity (0., 0., 0.);
vector3d sphere_position (2.1, 0., 0.);
Shape* sphere = new Sphere (1, sphere_position);
sphere->setVelocity (vector3d(0., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., polygon, sphere, &info);
CHECK (result == CHECK_ERROR_INVALID_TYPES);
delete polygon;
delete sphere;
}
TEST ( CheckSphereSphereNoVelocity ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (4., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (0, result);
delete sphere_a;
delete sphere_b;
}
/* This tests whether we report a collision time of 0.0 when two spheres are
* in contact with each other
*/
TEST ( CheckCollisionSphereSphereContact ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (2., 0., 0.));
sphere_b->setVelocity (vector3d(-1., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK (result >= 0);
CHECK_EQUAL (0.0, info.time);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereDiverging ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (4., 0., 0.));
sphere_b->setVelocity (vector3d (1., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (0, result);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereCollision ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (3., 0., 0.));
sphere_b->setVelocity (vector3d (-1., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereCollisionCheckOrder ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (3., 0., 0.));
sphere_a->setVelocity (vector3d (1., 0., 0.));
sphere_b->setVelocity (vector3d (-1.5, 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
vector3d normal = info.normal;
result = check_collision_sphere_sphere (1., sphere_b, sphere_a, &info);
CHECK_EQUAL (1, result);
CHECK ( normal[0] == -info.normal[0]);
CHECK ( normal[1] == -info.normal[1]);
CHECK ( normal[2] == -info.normal[2]);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereNoCollision ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (3., 0., 0.));
sphere_b->setVelocity (vector3d (-0.9, 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (0, result);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereCollisionResult ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (2.5, 0., 0.));
sphere_b->setVelocity (vector3d (-1, 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
CHECK_EQUAL (0.5, info.time);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereMovingNonHorizontal ) {
Shape* sphere_a = new Sphere (3., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1.5, vector3d (3., 0., 4.));
sphere_a->setVelocity (vector3d (3./5., 0., 4./5.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
vector3d result_normal = vector3d (-3., 0., -4.).normalize();
vector3d collision_point = result_normal * -0.5;
CHECK_EQUAL (1, result);
CHECK_EQUAL (0.5, info.time);
CHECK_EQUAL (1, info.reference_shape);
CHECK (result_normal == info.normal);
CHECK (collision_point == info.point);
sphere_a->setVelocity (vector3d (0., 0., 0.));
sphere_b->setVelocity (vector3d (-3./5., 0., -4./5.));
result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
CHECK_EQUAL (0.5, info.time);
delete sphere_a;
delete sphere_b;
}
/* If there is one of the sphere non moving we must ensure that we
* set the moving one as the incidence shape.
*/
TEST ( CheckSphereSphereReferenceShape ) {
Shape* sphere_a = new Sphere (3., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1.5, vector3d (3., 0., 4.));
sphere_a->setVelocity (vector3d (3./5., 0., 4./5.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
vector3d result_normal = vector3d (-3., 0., -4.).normalize();
vector3d collision_point = result_normal * 0.5;
CHECK_EQUAL (1, result);
CHECK_EQUAL (0.5, info.time);
CHECK (result_normal == info.normal);
CHECK_EQUAL (1, info.reference_shape);
sphere_a->setVelocity (vector3d (0., 0., 0.));
sphere_b->setVelocity (vector3d (-3./5., 0., -4./5.));
result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
CHECK (result_normal * -1. == info.normal);
CHECK_EQUAL (0.5, info.time);
CHECK_EQUAL (0, info.reference_shape);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereIgnoreHeight ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (3., 0., 0.));
sphere_b->setVelocity (vector3d (-2., 0., 0.));
sphere_a->setPosition (vector3d (0., 10., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckSphereSphereCollisionTimestep ) {
Shape* sphere_a = new Sphere (1., vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (1, vector3d (3., 0., 0.));
sphere_b->setVelocity (vector3d (-1., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (1, result);
CHECK_EQUAL (1, info.time);
result = check_collision_sphere_sphere (2., sphere_a, sphere_b, &info);
CHECK_EQUAL (1., result);
CHECK_EQUAL (1., info.time);
result = check_collision_sphere_sphere (0.5, sphere_a, sphere_b, &info);
CHECK_EQUAL (0, result);
delete sphere_a;
delete sphere_b;
}
TEST ( CheckPerpendicularMovement ) {
Shape* sphere_a = new Sphere (0.4, vector3d (0., 0., 0.));
Shape* sphere_b = new Sphere (0.4, vector3d (0., 0., -1.));
sphere_a->setVelocity (vector3d (0., 0., 0.));
sphere_b->setVelocity (vector3d (5., 0., 0.));
CollisionInfo info;
int result = check_collision_sphere_sphere (1., sphere_a, sphere_b, &info);
CHECK_EQUAL (0, result);
delete sphere_a;
delete sphere_b;
}