How to use resource groups efficiently? [solved]

Problems building or running the engine, queries about how to use features etc.
Post Reply
User avatar
darookie
Gnoblar
Posts: 4
Joined: Mon Nov 15, 2004 11:37 pm
Location: Germany
Contact:

How to use resource groups efficiently? [solved]

Post by darookie »

SOLVED - The debug memory manager comes in very handy in such situations :D Turned out I forgot to destroy a single scene node for some editor widget.

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;
		}
	}
Is this a good way to create and clear a scene in an editor? Models are handled separately and don't give me any errors or leaks.

Any comments? :D :D :D :D :D :D :D :D
Post Reply