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