Fixed mesh leaks when track objects are used.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8475 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk
2011-04-27 22:48:36 +00:00
parent b134eca433
commit f70d077ba0
3 changed files with 21 additions and 12 deletions

View File

@@ -57,9 +57,7 @@ void ThreeDAnimation::createPhysicsBody(const std::string &shape)
// 1. Determine size of the object
// -------------------------------
Vec3 min, max;
scene::IAnimatedMesh *mesh =
((scene::IAnimatedMeshSceneNode*)m_node)->getMesh();
MeshTools::minMax3D(mesh, &min, &max);
MeshTools::minMax3D(m_mesh, &min, &max);
Vec3 extend = max-min;
if(shape=="box")
{

View File

@@ -53,30 +53,31 @@ TrackObject::TrackObject(const XMLNode &xml_node)
if(model_name=="")
{
m_node = NULL;
m_mesh = NULL;
}
else
{
std::string full_path = World::getWorld()->getTrack()->getTrackFile(model_name);
scene::IAnimatedMesh *mesh=NULL;
if(file_manager->fileExists(full_path))
{
mesh = irr_driver->getAnimatedMesh(full_path);
m_mesh = irr_driver->getAnimatedMesh(full_path);
}
if(!mesh)
if(!m_mesh)
{
// If the model isn't found in the track directory, look
// in STK's model directory.
full_path = file_manager->getModelFile(model_name);
mesh = irr_driver->getAnimatedMesh(full_path);
if(!mesh)
m_mesh = irr_driver->getAnimatedMesh(full_path);
if(!m_mesh)
{
fprintf(stderr, "Warning: '%s' in '%s' not found and is ignored.\n",
xml_node.getName().c_str(), model_name.c_str());
xml_node.getName().c_str(), model_name.c_str());
return;
} // if(!mesh)
} // if(!m_mesh)
}
scene::IAnimatedMeshSceneNode *node=irr_driver->addAnimatedMesh(mesh);
m_mesh->grab();
scene::IAnimatedMeshSceneNode *node=irr_driver->addAnimatedMesh(m_mesh);
m_node = node;
#ifdef DEBUG
std::string debug_name = model_name+" (track-object)";
@@ -103,6 +104,12 @@ TrackObject::~TrackObject()
{
if(m_node)
irr_driver->removeNode(m_node);
if(m_mesh)
{
m_mesh->drop();
if(m_mesh->getReferenceCount()==1)
irr_driver->removeMeshFromCache(m_mesh);
}
} // ~TrackObject
// ----------------------------------------------------------------------------

View File

@@ -59,7 +59,11 @@ private:
protected:
/** The irrlicht scene node this object is attached to. */
scene::ISceneNode *m_node;
scene::ISceneNode *m_node;
/** The mesh used here. It needs to be stored so that it can be
* removed from irrlicht's mesh cache when it is deleted. */
scene::IAnimatedMesh *m_mesh;
/** The initial XYZ position of the object. */
core::vector3df m_init_xyz;