Merge branch 'master' of github.com:supertuxkart/stk-code

This commit is contained in:
hiker 2014-05-16 09:56:19 +10:00
commit 94457e7a53
6 changed files with 45 additions and 5 deletions

View File

@ -50,8 +50,6 @@
#include <algorithm> #include <algorithm>
STKInstancedSceneNode *InstancedBox = 0;
#define MAX2(a, b) ((a) > (b) ? (a) : (b)) #define MAX2(a, b) ((a) > (b) ? (a) : (b))
#define MIN2(a, b) ((a) > (b) ? (b) : (a)) #define MIN2(a, b) ((a) > (b) ? (b) : (a))

View File

@ -8,6 +8,9 @@ STKInstancedSceneNode::STKInstancedSceneNode(irr::scene::IMesh* mesh, ISceneNode
const irr::core::vector3df& scale) : const irr::core::vector3df& scale) :
CMeshSceneNode(mesh, parent, mgr, id, position, rotation, scale) CMeshSceneNode(mesh, parent, mgr, id, position, rotation, scale)
{ {
m_ref_count = 0;
irr_driver->grabAllTextures(mesh);
if (irr_driver->isGLSL()) if (irr_driver->isGLSL())
{ {
createGLMeshes(); createGLMeshes();
@ -42,6 +45,9 @@ void STKInstancedSceneNode::cleanGL()
STKInstancedSceneNode::~STKInstancedSceneNode() STKInstancedSceneNode::~STKInstancedSceneNode()
{ {
irr_driver->dropAllTextures(getMesh());
irr_driver->removeMeshFromCache(getMesh());
if (irr_driver->isGLSL()) if (irr_driver->isGLSL())
cleanGL(); cleanGL();
} }

View File

@ -2,10 +2,12 @@
#define STKINSTANCEDSCENENODE_HPP #define STKINSTANCEDSCENENODE_HPP
#include "stkmesh.hpp" #include "stkmesh.hpp"
#include "utils/leak_check.hpp"
class STKInstancedSceneNode : public irr::scene::CMeshSceneNode class STKInstancedSceneNode : public irr::scene::CMeshSceneNode
{ {
protected: protected:
int m_ref_count;
std::vector<GLMesh *> GeometricMesh[FPSM_COUNT]; std::vector<GLMesh *> GeometricMesh[FPSM_COUNT];
std::vector<GLMesh *> ShadedMesh[SM_COUNT]; std::vector<GLMesh *> ShadedMesh[SM_COUNT];
std::vector<GLMesh> GLmeshes; std::vector<GLMesh> GLmeshes;
@ -26,6 +28,18 @@ public:
~STKInstancedSceneNode(); ~STKInstancedSceneNode();
virtual void render(); virtual void render();
void addInstance(const core::vector3df &origin, const core::vector3df &orientation, const core::vector3df &scale); void addInstance(const core::vector3df &origin, const core::vector3df &orientation, const core::vector3df &scale);
void instanceGrab() { m_ref_count++; }
void instanceDrop()
{
m_ref_count--;
if (m_ref_count <= 0)
{
delete this;
}
}
LEAK_CHECK();
}; };
#endif #endif

View File

@ -136,6 +136,7 @@ STKInstancedSceneNode* ModelDefinitionLoader::instanciate(const irr::core::vecto
} }
m_instancing_nodes[name]->addInstance(position, rotation, scale); m_instancing_nodes[name]->addInstance(position, rotation, scale);
m_instancing_nodes[name]->instanceGrab();
return m_instancing_nodes[name]; return m_instancing_nodes[name];
} }

View File

@ -162,6 +162,7 @@ TrackObjectPresentationInstancing::TrackObjectPresentationInstancing(const XMLNo
ModelDefinitionLoader& model_def_loader) : TrackObjectPresentationSceneNode(xml_node) ModelDefinitionLoader& model_def_loader) : TrackObjectPresentationSceneNode(xml_node)
{ {
m_instancing_group = NULL; m_instancing_group = NULL;
m_fallback_scene_node = NULL;
std::string instancing_model; std::string instancing_model;
xml_node.get("instancing_model", &instancing_model); xml_node.get("instancing_model", &instancing_model);
@ -179,13 +180,32 @@ TrackObjectPresentationInstancing::TrackObjectPresentationInstancing(const XMLNo
} }
else else
{ {
m_instancing_group = new STKInstancedSceneNode(model_def_loader.getFirstMeshFor(instancing_model), scene::IMesh* mesh = model_def_loader.getFirstMeshFor(instancing_model);
m_node, irr_driver->getSceneManager(), -1); scene::IMeshSceneNode* node = irr_driver->addMesh(mesh, m_node);
node->grab();
irr_driver->grabAllTextures(mesh);
mesh->grab();
World::getWorld()->getTrack()->addNode(node);
m_fallback_scene_node = node;
} }
} }
TrackObjectPresentationInstancing::~TrackObjectPresentationInstancing() TrackObjectPresentationInstancing::~TrackObjectPresentationInstancing()
{ {
if (m_instancing_group != NULL)
m_instancing_group->instanceDrop();
if (m_fallback_scene_node != NULL)
{
scene::IMesh* mesh = m_fallback_scene_node->getMesh();
irr_driver->dropAllTextures(mesh);
mesh->drop();
if (mesh->getReferenceCount() == 1)
irr_driver->removeMeshFromCache(mesh);
m_fallback_scene_node->drop();
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@ -24,7 +24,7 @@
#include <IAnimatedMeshSceneNode.h> #include <IAnimatedMeshSceneNode.h>
namespace irr namespace irr
{ {
namespace scene { class IAnimatedMesh; class ISceneNode; } namespace scene { class IAnimatedMesh; class IMeshSceneNode; class ISceneNode; }
} }
using namespace irr; using namespace irr;
@ -170,6 +170,7 @@ public:
class TrackObjectPresentationInstancing : public TrackObjectPresentationSceneNode class TrackObjectPresentationInstancing : public TrackObjectPresentationSceneNode
{ {
STKInstancedSceneNode* m_instancing_group; STKInstancedSceneNode* m_instancing_group;
scene::IMeshSceneNode* m_fallback_scene_node;
public: public:
TrackObjectPresentationInstancing(const XMLNode& xml_node, TrackObjectPresentationInstancing(const XMLNode& xml_node,