#include "main.h"
CMapLoader::CMapLoader(IrrlichtDevice* dev, CLog* logger, const char mapname[128])
{
device = dev;
log = logger;
memcpy(name, mapname, 128);
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
gui::IGUIEnvironment* env = device->getGUIEnvironment();
char map[128];
snprintf(map, 128, "levels/%s.irr", name);
smgr->loadScene(map);
meta = smgr->createMetaTriangleSelector();
smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes); // Find all nodes
for (u32 i=0; i < nodes.size(); ++i)
{
scene::ISceneNode * node = nodes[i];
scene::ITriangleSelector * selector = 0;
switch(node->getType())
{
case scene::ESNT_CUBE:
case scene::ESNT_ANIMATED_MESH:
// Because the selector won't animate with the mesh,
// and is only being used for camera collision, we'll just use an approximate
// bounding box instead of ((scene::IAnimatedMeshSceneNode*)node)->getMesh(0)
selector = smgr->createTriangleSelectorFromBoundingBox(node);
break;
case scene::ESNT_MESH:
case scene::ESNT_SPHERE: // Derived from IMeshSceneNode
selector = smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
case scene::ESNT_TERRAIN:
selector = smgr->createTerrainTriangleSelector((scene::ITerrainSceneNode*)node);
break;
case scene::ESNT_OCTREE:
selector = smgr->createOctreeTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
default:
// Don't create a selector for this node type
break;
}
if(selector)
{
// Add it to the meta selector, which will take a reference to it
meta->addTriangleSelector(selector);
// And drop my reference to it, so that the meta selector owns it.
selector->drop();
}
}
char str[128];
snprintf(str, 128, "Loaded map: %s", name);
log->info("MAPLOAD", str);
}
CMapLoader::~CMapLoader()
{
meta->drop(); // I'm done with the meta selector now
for (u32 i=0; i < nodes.size(); ++i)
{
nodes[i]->remove();
}
char str[128];
snprintf(str, 128, "Unloaded map: %s", name);
log->info("MAPLOAD", str);
}