[SOLVED] Unloading a mesh correctly.

If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Post Reply
Linaxys
Posts: 47
Joined: Tue Feb 24, 2009 10:46 pm

[SOLVED] Unloading a mesh correctly.

Post by Linaxys »

Hello,
I'm doing my own terrain zone system, it loads a mesh perfectly and destroy it when I'm too far from it.

But the problem is that it's taking more and more memory (like 1 mb or 800kb each time I load a new zone), and I'd like to know if I did something really wrong in my code :

Code: Select all

std::vector<IMeshSceneNode*> terrainZones;

//
// Now the loop
//

	for (int i = 0; i < terrainZones.size(); i++) {
		f32 dist = terrainZones[i]->getPosition().getDistanceFrom(thePos);

		if (dist > 3200) {
			// We are too far from this mesh, destroy it.
			// Get it's meshBuffer.
			for (int a = 0; a < terrainZones[i]->getMesh()->getMeshBufferCount(); a++) {
				SMeshBuffer *bf = (SMeshBuffer*)terrainZones[i]->getMesh()->getMeshBuffer(a);
				bf->Vertices.clear();

				// Now, remove the meshBuffer stucked in the memory !
				CynEngine->getDriver()->removeHardwareBuffer((IMeshBuffer*)bf);
			}

			// Remove the zone's mesh.
			CynEngine->getScene()->getMeshCache()->removeMesh(terrainZones[i]->getMesh());

			// Remove node
			terrainZones[i]->remove();
			terrainZones.erase(terrainZones.begin() + i);
		} else if (dist < 1200) {
			// We are currently into a zone. Let's load every other zones around it.
			// Get the zone's position.
			vector3df zonePos = terrainZones[i]->getPosition();

			bool Forward = false, Back = false, Right = false, Left = false, TRight = false, TLeft = false, BRight = false, BLeft = false;

			vector3df lookForward(zonePos.X, 0, zonePos.Z + 1520);
			vector3df lookBack(zonePos.X, 0, zonePos.Z - 1520);
			vector3df lookRight(zonePos.X + 1520, 0, zonePos.Z);
			vector3df lookLeft(zonePos.X - 1520, 0, zonePos.Z);

			vector3df lookTRight(zonePos.X + 1520, 0, zonePos.Z + 1520);
			vector3df lookTLeft(zonePos.X - 1520, 0, zonePos.Z + 1520);

			vector3df lookBRight(zonePos.X + 1520, 0, zonePos.Z - 1520);
			vector3df lookBLeft(zonePos.X - 1520, 0, zonePos.Z - 1520);

			for (int e = 0; e < terrainZones.size(); e++) {
				// Okay, let's look forward !
				if (terrainZones[e]->getPosition() == lookForward)
					Forward = true;
				// Look back.
				if (terrainZones[e]->getPosition() == lookBack)
					Back = true;
				// Look right.
				if (terrainZones[e]->getPosition() == lookRight)
					Right = true;
				// Look left.
				if (terrainZones[e]->getPosition() == lookLeft)
					Left = true;

				// Look TopRight.
				if (terrainZones[e]->getPosition() == lookTRight)
					TRight = true;
				// Look TopLeft.
				if (terrainZones[e]->getPosition() == lookTLeft)
					TLeft = true;

				// Look BottomRight.
				if (terrainZones[e]->getPosition() == lookBRight)
					BRight = true;
				// Look BottomLeft.
				if (terrainZones[e]->getPosition() == lookBLeft)
					BLeft = true;
			}

			// Alright, let's check everything we've found.
			if (!Forward) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookForward);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!Back) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookBack);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!Left) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookLeft);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!Right) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookRight);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!TRight) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookTRight);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!TLeft) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookTLeft);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!BRight) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookBRight);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
			if (!BLeft) {
				IMesh *nMesh = buildMesh();
				IMeshSceneNode *nNode = CynEngine->getScene()->addMeshSceneNode(nMesh);
				nNode->setMaterialFlag(EMF_LIGHTING, 0);
				nNode->setPosition(lookBLeft);
				nNode->setDebugDataVisible(EDS_BBOX);
				terrainZones.push_back(nNode);
			}
		}
	}
I've tried terrainZones->drop() in the destroy function but it leads me to debug errors like it can't unload the mesh...

Can someone help please ?
Thanks for your answers.
Last edited by Linaxys on Wed Apr 08, 2009 4:46 pm, edited 1 time in total.
devsh
Competition winner
Posts: 2057
Joined: Tue Dec 09, 2008 6:00 pm
Location: UK
Contact:

Post by devsh »

what about removing mesh buffers?
Linaxys
Posts: 47
Joined: Tue Feb 24, 2009 10:46 pm

Post by Linaxys »

Thanks, it solved my problem.

I haven't dropped the meshBuffer and the mesh, because I was afraid to get a debugging error (yes, we can't drop everything...) and I did it, it solved my problem, the used ram size doesn't move anymore.
Post Reply