Ok. Here is my codes for the main()
Code: Select all
int main()
{
video::E_DRIVER_TYPE driverType;
/* case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break; */
driverType = EDT_DIRECT3D9;
// create device and exit if creation failed
IrrlichtDevice* device =
createDevice(driverType, dimension2d<s32>(640, 480));
if (device == 0)
return 1; // could not create selected driver.
device->setWindowCaption(L"Load .irr file example");
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* smgr = device->getSceneManager();
// Now load our .irr file.
// load the scene
smgr->loadScene("room.irr");
// Assign Triangle selector
ISceneManager_assignTriangleSelectors(smgr, device->getFileSystem());
// add a user controlled camera
ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 300.0f, -1, 0, 0, true);
// Position the Camera
camera->setPosition(vector3df(-50,60,0));
// Rotate the Camera
camera->setRotation(vector3df(0,90,0));
//Put the Meta Triangle Selector
scene::IMetaTriangleSelector* meta = smgr->createMetaTriangleSelector();
// Node "meta" animation for the Camera
scene::ISceneNodeAnimator* anim =
smgr->createCollisionResponseAnimator(meta, camera, core::vector3df(3,3,3), core::vector3df(0,-1,0), core::vector3df(0,6,0));
// Assign the node anim to the camera
camera->addAnimator(anim);
anim->drop();
meta->drop();
// and draw everything.
int lastFPS = -1;
while(device->run())
if (device->isWindowActive())
{
driver->beginScene(true, true, video::SColor(0,200,200,200));
smgr->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
stringw str = L"Load Irrlicht File example - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
// update the collision animator stuff.
meta->removeAllTriangleSelectors();
const core::aabbox3df box(-10.f, -10.f, -10.f, 10.f, 10.f, 10.f);
camera->getAbsoluteTransformation().transformBox(box);
// put all selectors into meta selector if they intersect the bounding box
ISceneManager_gatherTriangleSelectors(smgr, meta, box);
}
device->drop();
return 0;
}
Here is the other routine Travis submitted to interract with the main()
Here is the Node Assign routine for the triangle selector
Code: Select all
void ISceneNode_assignTriangleSelector(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
// From vitek
if (!node || !smgr || !ifs)
return;
if (node->getType() == scene::ESNT_OCT_TREE)
{
io::IAttributes* attribs = ifs->createEmptyAttributes();
if (attribs)
{
node->serializeAttributes(attribs);
// get the mesh name out
core::stringc name = attribs->getAttributeAsString("Mesh");
attribs->drop();
// get the animated mesh for the object
scene::IAnimatedMesh* mesh = smgr->getMesh(name.c_str());
if (mesh)
{
scene::ITriangleSelector* selector =
smgr->createOctTreeTriangleSelector(mesh->getMesh(0), node, 128);
node->setTriangleSelector(selector);
selector->drop();
}
}
}
else if (node->getType() == scene::ESNT_MESH)
{
scene::IMeshSceneNode* msn = (scene::IMeshSceneNode*)node;
if (msn->getMesh())
{
scene::ITriangleSelector* selector =
smgr->createTriangleSelector(msn->getMesh(), msn);
msn->setTriangleSelector(selector);
selector->drop();
}
}
else if (node->getType() == scene::ESNT_ANIMATED_MESH)
{
scene::IAnimatedMeshSceneNode* msn = (scene::IAnimatedMeshSceneNode*)node;
scene::IAnimatedMesh* am = msn->getMesh();
if (am)
{
scene::ITriangleSelector* selector =
smgr->createTriangleSelector(am->getMesh(0), msn);
msn->setTriangleSelector(selector);
selector->drop();
}
}
else if (node->getType() == scene::ESNT_TERRAIN)
{
scene::ITerrainSceneNode* tsn = (scene::ITerrainSceneNode*)node;
scene::ITriangleSelector* selector =
smgr->createTerrainTriangleSelector(tsn, 0); // probably don't want lod 0 all the time...
tsn->setTriangleSelector(selector);
selector->drop();
}
else
{
// not something we want to collide with
}
}
Here is the assign routing for the selector
Code: Select all
void ISceneNode_assignTriangleSelectors(scene::ISceneNode* node, scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
// From Vitek
// assign a selector for this node
ISceneNode_assignTriangleSelector(node, smgr, ifs);
// now recurse on children...
core::list<scene::ISceneNode*>::Iterator begin = node->getChildren().begin();
core::list<scene::ISceneNode*>::Iterator end = node->getChildren().end();
for (/**/; begin != end; ++begin)
ISceneNode_assignTriangleSelectors(*begin, smgr, ifs);
}
void ISceneManager_assignTriangleSelectors(scene::ISceneManager* smgr, io::IFileSystem* ifs)
{
ISceneNode_assignTriangleSelectors(smgr->getRootSceneNode(), smgr, ifs);
}
Gather selector
Code: Select all
void ISceneNode_gatherTriangleSelectors(scene::ISceneNode* node, scene::IMetaTriangleSelector* meta, const core::aabbox3df& box)
// From Vitek
{
scene::ITriangleSelector* selector = node->getTriangleSelector();
if (selector && node->getTransformedBoundingBox().intersectsWithBox(box))
meta->addTriangleSelector(selector);
// now recurse on children...
core::list<scene::ISceneNode*>::Iterator begin = node->getChildren().begin();
core::list<scene::ISceneNode*>::Iterator end = node->getChildren().end();
for (/**/; begin != end; ++begin)
ISceneNode_gatherTriangleSelectors(*begin, meta, box);
}
void ISceneManager_gatherTriangleSelectors(scene::ISceneManager* smgr, scene::IMetaTriangleSelector* meta, const core::aabbox3df& box)
{
ISceneNode_gatherTriangleSelectors(smgr->getRootSceneNode(), meta, box);
}