Changed interface to sky box and sky cube (so that textures can be

tracked and released). Fixed memory leak in sky domes/boxes and
mini map.



git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@8481 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk
2011-04-29 00:29:34 +00:00
parent 8bd30a0b87
commit fd78e796d2
7 changed files with 61 additions and 25 deletions

View File

@@ -728,12 +728,11 @@ scene::IAnimatedMeshSceneNode *IrrDriver::addAnimatedMesh(scene::IAnimatedMesh *
* between 0 and 2, where 1 is an exact half-sphere and 2 is a full
* sphere.
*/
scene::ISceneNode *IrrDriver::addSkyDome(const std::string &texture_name,
scene::ISceneNode *IrrDriver::addSkyDome(video::ITexture *texture,
int hori_res, int vert_res,
float texture_percent,
float sphere_percent)
{
ITexture *texture = getTexture(texture_name);
return m_scene_manager->addSkyDomeSceneNode(texture, hori_res, vert_res,
texture_percent,
sphere_percent);
@@ -750,14 +749,12 @@ scene::ISceneNode *IrrDriver::addSkyDome(const std::string &texture_name,
* \param front: Texture for the front plane of the box.
* \param back: Texture for the back plane of the box.
*/
scene::ISceneNode *IrrDriver::addSkyBox(const std::vector<std::string> &texture_names)
scene::ISceneNode *IrrDriver::addSkyBox(const std::vector<video::ITexture*>
&texture)
{
std::vector<video::ITexture*> t;
for(unsigned int i=0; i<texture_names.size(); i++)
{
t.push_back(getTexture(texture_names[i]));
}
return m_scene_manager->addSkyBoxSceneNode(t[0], t[1], t[2], t[3], t[4], t[5]);
return m_scene_manager->addSkyBoxSceneNode(texture[0], texture[1],
texture[2], texture[3],
texture[4], texture[5]);
} // addSkyBox
// ----------------------------------------------------------------------------

View File

@@ -138,10 +138,10 @@ public:
scene::IParticleSystemSceneNode
*addParticleNode(bool default_emitter=true);
scene::ISceneNode *addSkyDome(const std::string &texture, int hori_res,
scene::ISceneNode *addSkyDome(video::ITexture *texture, int hori_res,
int vert_res, float texture_percent,
float sphere_percent);
scene::ISceneNode *addSkyBox(const std::vector<std::string> &texture_names);
scene::ISceneNode *addSkyBox(const std::vector<video::ITexture*> &texture_names);
void removeNode(scene::ISceneNode *node);
void removeMeshFromCache(scene::IMesh *mesh);
void removeTexture(video::ITexture *t);

View File

@@ -173,7 +173,13 @@ void FeatureUnlockedCutScene::init()
texture_names[3] = file_manager->getTextureFile("purplenebula2.png");
texture_names[4] = file_manager->getTextureFile("purplenebula.jpg");
texture_names[5] = file_manager->getTextureFile("purplenebula2.png");
m_sky = irr_driver->addSkyBox(texture_names);
std::vector<video::ITexture*> textures;
for(unsigned int i=0; i<texture_names.size(); i++)
{
video::ITexture *t = irr_driver->getTexture(texture_names[i]);
textures.push_back(t);
}
m_sky = irr_driver->addSkyBox(textures);
#ifdef DEBUG
m_sky->setName("skybox");
#endif

View File

@@ -104,8 +104,10 @@ void GrandPrixLose::init()
m_phase = 1;
m_sky_angle = 0.0f;
m_global_time = 0.0f;
m_sky = irr_driver->addSkyDome(file_manager->getTextureFile("clouds.png"),
video::ITexture *t = irr_driver->getTexture(
file_manager->getTextureFile("clouds.png"));
m_sky = irr_driver->addSkyDome(t,
16 /* hori_res */, 16 /* vert_res */,
1.0f /* texture_percent */, 2.0f /* sphere_percent */);

View File

@@ -160,10 +160,13 @@ void GrandPrixWin::init()
m_phase = 1;
m_sky_angle = 0.0f;
m_global_time = 0.0f;
m_sky = irr_driver->addSkyDome(file_manager->getTextureFile("clouds.png"),
video::ITexture *t = irr_driver->getTexture(
file_manager->getTextureFile("clouds.png"));
m_sky = irr_driver->addSkyDome(t,
16 /* hori_res */, 16 /* vert_res */,
1.0f /* texture_percent */, 2.0f /* sphere_percent */);
1.0f /* texture_percent */,
2.0f /* sphere_percent */);
m_camera = irr_driver->addCameraSceneNode();
m_camera_x = 3.0f;

View File

@@ -89,11 +89,6 @@ Track::Track(std::string filename)
/** Destructor, removes quad data structures etc. */
Track::~Track()
{
if(m_quad_graph) delete m_quad_graph;
if(m_check_manager) delete m_check_manager;
if(m_mini_map) irr_driver->removeTexture(m_mini_map);
delete m_track_mesh;
delete m_gfx_effect_mesh;
} // ~Track
//-----------------------------------------------------------------------------
@@ -174,6 +169,23 @@ void Track::cleanup()
}
m_all_cached_meshes.clear();
if(m_quad_graph) delete m_quad_graph;
if(m_check_manager) delete m_check_manager;
if(m_mini_map)
{
assert(m_mini_map->getReferenceCount()==1);
irr_driver->removeTexture(m_mini_map);
m_mini_map = NULL;
}
for(unsigned int i=0; i<m_sky_textures.size(); i++)
{
m_sky_textures[i]->drop();
if(m_sky_textures[i]->getReferenceCount()==1)
irr_driver->removeTexture(m_sky_textures[i]);
}
m_sky_textures.clear();
// remove temporary materials loaded by the material manager
material_manager->popTempMaterial();
@@ -1352,7 +1364,9 @@ void Track::handleSky(const XMLNode &xml_node, const std::string &filename)
m_sky_texture_percent = 1.0f;
std::string s;
xml_node.get("texture", &s );
m_sky_textures.push_back(s);
video::ITexture *t = irr_driver->getTexture(s);
t->grab();
m_sky_textures.push_back(t);
xml_node.get("vertical", &m_sky_vert_segments );
xml_node.get("horizontal", &m_sky_hori_segments );
xml_node.get("sphere-percent", &m_sky_sphere_percent );
@@ -1364,7 +1378,21 @@ void Track::handleSky(const XMLNode &xml_node, const std::string &filename)
{
std::string s;
xml_node.get("texture", &s);
m_sky_textures = StringUtils::split(s, ' ');
std::vector<std::string> v = StringUtils::split(s, ' ');
for(unsigned int i=0; i<v.size(); i++)
{
video::ITexture *t = irr_driver->getTexture(v[i]);
if(t)
{
t->grab();
m_sky_textures.push_back(t);
}
else
{
printf("Sky-box texture '%s' not found - ignored.\n",
v[i].c_str());
}
} // for i<v.size()
if(m_sky_textures.size()!=6)
{
fprintf(stderr, "A skybox needs 6 textures, but %d are specified\n",

View File

@@ -128,7 +128,7 @@ private:
/** A list of the textures for the sky to use. It contains one texture
* in case of a dome, and 6 textures for a box. */
std::vector<std::string> m_sky_textures;
std::vector<video::ITexture*> m_sky_textures;
/** Used if m_sky_type is SKY_COLOR only */
irr::video::SColor m_sky_color;