Since version 1.1, Irrlicht is able to save and load the full scene graph into an .irr file, an xml based format. There is an editor available to edit those files, named irrEdit (http://www.ambiera.com/irredit) which can also be used as world and particle editor. This tutorial shows how to use .irr files.
Lets start: Create an Irrlicht device and setup the window.
#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif
int main(int argc, char** argv)
{
return 1;
IrrlichtDevice* device =
if (device == 0)
return 1;
device->setWindowCaption(L"Load .irr file example");
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
Main header file of the irrlicht, the only file needed to include.
E_DRIVER_TYPE
An enum for all types of drivers the Irrlicht Engine supports.
@ EDT_COUNT
No driver, just for counting the elements.
Everything in the Irrlicht Engine can be found in this namespace.
IRRLICHT_API IrrlichtDevice *IRRCALLCONV createDevice(video::E_DRIVER_TYPE deviceType=video::EDT_SOFTWARE, const core::dimension2d< u32 > &windowSize=(core::dimension2d< u32 >(640, 480)), u32 bits=16, bool fullscreen=false, bool stencilbuffer=false, bool vsync=false, IEventReceiver *receiver=0)
Creates an Irrlicht device. The Irrlicht device is the root object for using the engine.
Now load our .irr file. .irr files can store the whole scene graph including animators, materials and particle systems. And there is also the possibility to store arbitrary user data for every scene node in that file. To keep this example simple, we are simply loading the scene here. See the documentation at ISceneManager::loadScene and ISceneManager::saveScene for more information. So to load and display a complicated huge scene, we only need a single call to loadScene().
if (argc>1)
smgr->loadScene(argv[1]);
else
smgr->loadScene("../../media/example.irr");
Now we'll create a camera, and give it a collision response animator that's built from the mesh nodes in the scene we just loaded.
scene::ICameraSceneNode * camera = smgr->addCameraSceneNodeFPS(0, 50.f, 0.1f);
scene::IMetaTriangleSelector * meta = smgr->createMetaTriangleSelector();
Now we will find all the nodes in the scene and create triangle selectors for all suitable nodes. Typically, you would want to make a more informed decision about which nodes to performs collision checks on; you could capture that information in the node name or Id.
core::array<scene::ISceneNode *> nodes;
for (
u32 i=0; i < nodes.size(); ++i)
{
scene::ISceneNode * node = nodes[i];
scene::ITriangleSelector * selector = 0;
switch(node->getType())
{
selector = smgr->createTriangleSelectorFromBoundingBox(node);
break;
selector = smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
selector = smgr->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
break;
selector = smgr->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
default:
break;
}
if(selector)
{
meta->addTriangleSelector(selector);
selector->drop();
}
}
@ ESNT_ANIMATED_MESH
Animated Mesh Scene Node.
@ ESNT_OCTREE
Octree Scene Node.
@ ESNT_MESH
Mesh Scene Node.
@ ESNT_CUBE
simple cube scene node
@ ESNT_SPHERE
Sphere scene node.
@ ESNT_TERRAIN
Terrain Scene Node.
@ ESNT_ANY
Will match with any scene node when checking types.
unsigned int u32
32 bit unsigned variable.
Now that the mesh scene nodes have had triangle selectors created and added to the meta selector, create a collision response animator from that meta selector.
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
meta->drop();
camera->addAnimator(anim);
anim->drop();
if(cube)
camera->setTarget(cube->getAbsolutePosition());
vector3d< f32 > vector3df
Typedef for a f32 3d vector.
That's it. Draw everything and finish as usual.
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)
{
core::stringw str = L
"Load Irrlicht File example - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();
return 0;
}
string< wchar_t > stringw
Typedef for wide character strings.