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);
}
}
}
Can someone help please ?
Thanks for your answers.