Commit 107fb67d authored by hybrid's avatar hybrid

Added test case by vitek, currently commented out as it does not go through.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2805 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 291a7ca4
...@@ -35,21 +35,18 @@ static bool testGetCollisionResultPosition(IrrlichtDevice * device, ...@@ -35,21 +35,18 @@ static bool testGetCollisionResultPosition(IrrlichtDevice * device,
if(hitNode != cubeNode) if(hitNode != cubeNode)
{ {
logTestString("Unexpected collision node\n"); logTestString("Unexpected collision node\n");
assert(false);
result = false; result = false;
} }
if(!equals(resultPosition.Y, 25.f, 0.01f)) if(!equals(resultPosition.Y, 25.f, 0.01f))
{ {
logTestString("Unexpected collision response position\n"); logTestString("Unexpected collision response position\n");
assert(false);
result = false; result = false;
} }
if(!equals(hitPosition.Y, 5.f, 0.01f)) if(!equals(hitPosition.Y, 5.f, 0.01f))
{ {
logTestString("Unexpected collision position\n"); logTestString("Unexpected collision position\n");
assert(false);
result = false; result = false;
} }
...@@ -66,26 +63,26 @@ static bool testGetCollisionResultPosition(IrrlichtDevice * device, ...@@ -66,26 +63,26 @@ static bool testGetCollisionResultPosition(IrrlichtDevice * device,
if(hitNode != cubeNode) if(hitNode != cubeNode)
{ {
logTestString("Unexpected collision node\n"); logTestString("Unexpected collision node\n");
assert(false);
result = false; result = false;
} }
if(!equals(resultPosition.X, -15.f, 0.01f)) if(!equals(resultPosition.X, -15.f, 0.01f))
{ {
logTestString("Unexpected collision response position\n"); logTestString("Unexpected collision response position\n");
assert(false);
result = false; result = false;
} }
if(!equals(hitPosition.X, -5.f, 0.01f)) if(!equals(hitPosition.X, -5.f, 0.01f))
{ {
logTestString("Unexpected collision position\n"); logTestString("Unexpected collision position\n");
assert(false);
result = false; result = false;
} }
assert(result);
cubeSelector->drop(); cubeSelector->drop();
smgr->clear(); smgr->clear();
return result; return result;
} }
...@@ -140,6 +137,8 @@ static bool getCollisionPoint_ignoreTriangleVertices(IrrlichtDevice * device, ...@@ -140,6 +137,8 @@ static bool getCollisionPoint_ignoreTriangleVertices(IrrlichtDevice * device,
return false; return false;
} }
smgr->clear();
return true; return true;
} }
...@@ -230,11 +229,10 @@ static bool testGetSceneNodeFromScreenCoordinatesBB(IrrlichtDevice * device, ...@@ -230,11 +229,10 @@ static bool testGetSceneNodeFromScreenCoordinatesBB(IrrlichtDevice * device,
logTestString("A node was hit when none was expected.\n"); logTestString("A node was hit when none was expected.\n");
result = false; result = false;
} }
assert(result);
smgr->clear(); smgr->clear();
if(!result)
assert(false);
return result; return result;
} }
...@@ -243,22 +241,22 @@ static bool getScaledPickedNodeBB(IrrlichtDevice * device, ...@@ -243,22 +241,22 @@ static bool getScaledPickedNodeBB(IrrlichtDevice * device,
ISceneManager * smgr, ISceneManager * smgr,
ISceneCollisionManager * collMgr) ISceneCollisionManager * collMgr)
{ {
ISceneNode* farTarget = smgr->addCubeSceneNode(1.f); ISceneNode* farTarget = smgr->addCubeSceneNode(1.f);
farTarget->setScale(vector3df(100.f, 100.f, 10.f)); farTarget->setScale(vector3df(100.f, 100.f, 10.f));
farTarget->setPosition(vector3df(0.f, 0.f, 500.f)); farTarget->setPosition(vector3df(0.f, 0.f, 500.f));
farTarget->updateAbsolutePosition(); farTarget->updateAbsolutePosition();
// Create a node that's slightly further away than the closest node, // Create a node that's slightly further away than the closest node,
// but thinner. Its furthest corner is closer, but the collision // but thinner. Its furthest corner is closer, but the collision
// position is further, so it should not be selected. // position is further, so it should not be selected.
ISceneNode* middleTarget = smgr->addCubeSceneNode(10.f); ISceneNode* middleTarget = smgr->addCubeSceneNode(10.f);
middleTarget->setPosition(vector3df(0.f, 0.f, 101.f)); middleTarget->setPosition(vector3df(0.f, 0.f, 101.f));
middleTarget->setScale(vector3df(1.f, 1.f, 0.5f)); middleTarget->setScale(vector3df(1.f, 1.f, 0.5f));
middleTarget->updateAbsolutePosition(); middleTarget->updateAbsolutePosition();
ISceneNode* nearTarget = smgr->addCubeSceneNode(10.f); ISceneNode* nearTarget = smgr->addCubeSceneNode(10.f);
nearTarget->setPosition(vector3df(0.f, 0.f, 100.f)); nearTarget->setPosition(vector3df(0.f, 0.f, 100.f));
nearTarget->updateAbsolutePosition(); nearTarget->updateAbsolutePosition();
// We'll rotate this node 90 degrees to show that we can hit its side. // We'll rotate this node 90 degrees to show that we can hit its side.
nearTarget->setRotation(vector3df(0.f, 90.f, 0.f)); nearTarget->setRotation(vector3df(0.f, 90.f, 0.f));
...@@ -275,8 +273,64 @@ static bool getScaledPickedNodeBB(IrrlichtDevice * device, ...@@ -275,8 +273,64 @@ static bool getScaledPickedNodeBB(IrrlichtDevice * device,
else if(hit == middleTarget) else if(hit == middleTarget)
logTestString("getSceneNodeFromRayBB() hit the far (scaled) target.\n"); logTestString("getSceneNodeFromRayBB() hit the far (scaled) target.\n");
if(!result) assert(result);
assert(false);
smgr->clear();
return result;
}
static bool compareGetSceneNodeFromRayBBWithBBIntersectsWithLine(IrrlichtDevice * device,
ISceneManager * smgr,
ISceneCollisionManager * collMgr)
{
video::IVideoDriver* driver = device->getVideoDriver();
// add camera
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS();
camera->setPosition(core::vector3df(30, 30, 30));
camera->setTarget(core::vector3df(-8.f, 8.f, -8.f));
camera->setID(0);
// add a dynamic light (this causes weirdness)
smgr->addLightSceneNode(0, core::vector3df(4, 4, 4), video::SColorf(.2f, .3f, .2f));
// add a cube to pick
scene::ISceneNode* cube = smgr->addCubeSceneNode(15);
bool result = true;
for (u32 i=68; i<82; ++i)
{
for (u32 j=56; j<64; ++j)
{
driver->beginScene(true, true, video::SColor(100, 50, 50, 100));
smgr->drawAll();
driver->endScene();
const core::position2di pos(i, j);
// get the line used for picking
core::line3df ray = smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(pos, camera);
// find a selected node
scene::ISceneNode* pick = smgr->getSceneCollisionManager()->getSceneNodeFromRayBB(ray, 1);
core::matrix4 invMat = cube->getAbsoluteTransformation();
invMat.makeInverse();
invMat.transformVect(ray.start);
invMat.transformVect(ray.end);
const int a_hit = (pick == cube);
const int b_hit = cube->getBoundingBox().intersectsWithLine(ray);
result = (a_hit==b_hit);
}
}
assert(result);
smgr->clear();
return result; return result;
} }
...@@ -301,6 +355,9 @@ bool sceneCollisionManager(void) ...@@ -301,6 +355,9 @@ bool sceneCollisionManager(void)
result &= getCollisionPoint_ignoreTriangleVertices(device, smgr, collMgr); result &= getCollisionPoint_ignoreTriangleVertices(device, smgr, collMgr);
// TODO: Not yet going through
// result &= compareGetSceneNodeFromRayBBWithBBIntersectsWithLine(device, smgr, collMgr);
device->drop(); device->drop();
return result; return result;
} }
......
Test suite pass at GMT Wed Nov 4 10:31:24 2009 Test suite pass at GMT Wed Nov 4 15:18:27 2009
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment