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:
@@ -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")
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user