I'm working on an Ogre-based editor and I have some problems with my resource-management.
I have to clear the scene during load of a new scene. However, I get memory leaks when I call my ClearScene() code:
Code: Select all
void Scene::CreateScene() {
SceneManager *sceneMgr = Root::getSingleton()._getCurrentSceneManager();
sceneRoot = sceneMgr->createSceneNode("__EditorRoot");
grid = new EditorTools::GridArray;
grid->updateProperties(gridWidth, gridHeight, gridQuadSize);
SceneNode *gridNode = grid->getGridNode();
sceneRoot->addChild(gridNode);
SceneNode *sel = sceneMgr->createSceneNode("__SelectionBox");
box = new EditorTools::SimpleBox;
box->init();
sel->attachObject(box);
sceneRoot->addChild(sel);
// create arbitary positioned lights - their position will be updated once a model is loaded
Light * diffuseLight = sceneMgr->createLight("__EditorDiffuseLight");
diffuseLight->setPosition(0, 0, 300);
diffuseLight->setDirection(0, -0.5, -1);
diffuseLight->setDiffuseColour(Ogre::ColourValue::White);
diffuseLight->setType(Ogre::Light::LT_DIRECTIONAL);
diffuseLight->setVisible(true);
sceneMgr->setAmbientLight(ColourValue(0.3f, 0.3f, 0.3f));
// setup event listeners
Private::addObjId = Events::AddListener(EditorEvents::AddNode, Private::AddObject);
Private::remObjId = Events::AddListener(EditorEvents::RemoveNode, Private::RemoveObject, Private::kRemovePriority);
CallbackList::const_iterator it = createCallbacks.begin(), end = createCallbacks.end();
while (it != end) {
if (*it) (*it)();
++it;
}
}
void Scene::ClearScene() {
if (sceneRoot) {
SceneManager *sceneMgr = Root::getSingleton()._getCurrentSceneManager();
sceneRoot->removeAndDestroyAllChildren();
sceneMgr->destroySceneNode(sceneRoot->getName());
sceneMgr->removeAllLights();
sceneRoot = 0;
delete grid;
delete box;
grid = 0;
box = 0;
// un-register event-listeners
Events::RemoveListener(EditorEvents::AddNode, Private::addObjId);
Events::RemoveListener(EditorEvents::RemoveNode, Private::remObjId);
Private::addObjId = -1;
Private::remObjId = -1;
}
}
Any comments?