Remove manual LOD code, it's now automatic
This commit is contained in:
parent
3083df450f
commit
102e517497
@ -241,16 +241,6 @@ void PhysicalObject::init()
|
|||||||
Log::fatal("PhysicalObject", "Unknown node type");
|
Log::fatal("PhysicalObject", "Unknown node type");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (dynamic_cast<TrackObjectPresentationInstancing*>(presentation) != NULL)
|
|
||||||
{
|
|
||||||
TrackObjectPresentationInstancing* instancing = dynamic_cast<TrackObjectPresentationInstancing*>(presentation);
|
|
||||||
STKInstancedSceneNode* instancing_group = instancing->getInstancingGroup();
|
|
||||||
if (instancing_group != NULL)
|
|
||||||
{
|
|
||||||
scene::IMesh* mesh = instancing_group->getMesh();
|
|
||||||
MeshTools::minMax3D(mesh, &min, &max);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log::fatal("PhysicalObject", "Unknown node type");
|
Log::fatal("PhysicalObject", "Unknown node type");
|
||||||
|
@ -111,35 +111,6 @@ LODNode* ModelDefinitionLoader::instanciateAsLOD(const XMLNode* node, scene::ISc
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
STKInstancedSceneNode* ModelDefinitionLoader::instanciate(const irr::core::vector3df& position,
|
|
||||||
const irr::core::vector3df& rotation,
|
|
||||||
const irr::core::vector3df scale,
|
|
||||||
const std::string& name)
|
|
||||||
{
|
|
||||||
if (m_instancing_nodes.find(name) == m_instancing_nodes.end())
|
|
||||||
{
|
|
||||||
if (m_lod_groups.find(name) == m_lod_groups.end())
|
|
||||||
{
|
|
||||||
Log::warn("Instancing", "Cannot find instancing model <%s>", name.c_str());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
scene::IMesh* mesh = irr_driver->getMesh(m_lod_groups[name][0].m_model_file);
|
|
||||||
mesh = MeshTools::createMeshWithTangents(mesh, &MeshTools::isNormalMap);
|
|
||||||
irr_driver->setAllMaterialFlags(mesh);
|
|
||||||
|
|
||||||
m_instancing_nodes[name] = new STKInstancedSceneNode(mesh,
|
|
||||||
irr_driver->getSceneManager()->getRootSceneNode(), irr_driver->getSceneManager(), -1);
|
|
||||||
m_track->addNode(m_instancing_nodes[name]);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_instancing_nodes[name]->addInstance(position, rotation, scale);
|
|
||||||
m_instancing_nodes[name]->instanceGrab();
|
|
||||||
return m_instancing_nodes[name];
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ModelDefinitionLoader::clear()
|
void ModelDefinitionLoader::clear()
|
||||||
{
|
{
|
||||||
m_lod_groups.clear();
|
m_lod_groups.clear();
|
||||||
|
@ -83,10 +83,6 @@ public:
|
|||||||
|
|
||||||
void addModelDefinition(const XMLNode* xml);
|
void addModelDefinition(const XMLNode* xml);
|
||||||
LODNode* instanciateAsLOD(const XMLNode* xml_node, scene::ISceneNode* parent);
|
LODNode* instanciateAsLOD(const XMLNode* xml_node, scene::ISceneNode* parent);
|
||||||
STKInstancedSceneNode* instanciate(const core::vector3df& position,
|
|
||||||
const irr::core::vector3df& rotation,
|
|
||||||
const irr::core::vector3df scale,
|
|
||||||
const std::string& name);
|
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
@ -742,24 +742,10 @@ void Track::convertTrackToBullet(scene::ISceneNode *node)
|
|||||||
node->updateAbsolutePosition();
|
node->updateAbsolutePosition();
|
||||||
|
|
||||||
std::vector<core::matrix4> matrices;
|
std::vector<core::matrix4> matrices;
|
||||||
|
matrices.push_back(node->getAbsoluteTransformation());
|
||||||
STKInstancedSceneNode* instancing_node = NULL;// dynamic_cast<STKInstancedSceneNode*>(node);
|
|
||||||
if (instancing_node != NULL)
|
|
||||||
{
|
|
||||||
int count = instancing_node->getInstanceCount();
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
matrices.push_back(instancing_node->getInstanceTransform(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
matrices.push_back(node->getAbsoluteTransformation());
|
|
||||||
}
|
|
||||||
|
|
||||||
const core::vector3df &pos = node->getAbsolutePosition();
|
const core::vector3df &pos = node->getAbsolutePosition();
|
||||||
|
|
||||||
|
|
||||||
scene::IMesh *mesh;
|
scene::IMesh *mesh;
|
||||||
// In case of readonly materials we have to get the material from
|
// In case of readonly materials we have to get the material from
|
||||||
// the mesh, otherwise from the node. This is esp. important for
|
// the mesh, otherwise from the node. This is esp. important for
|
||||||
@ -1063,20 +1049,6 @@ bool Track::loadMainTrack(const XMLNode &root)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load instancing models (for the moment they are loaded the same way as LOD to simplify implementation)
|
|
||||||
const XMLNode *instancing_xml_node = NULL;// root.getNode("instancing");
|
|
||||||
if (instancing_xml_node != NULL)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < instancing_xml_node->getNumNodes(); i++)
|
|
||||||
{
|
|
||||||
const XMLNode* lod_group_xml = instancing_xml_node->getNode(i);
|
|
||||||
for (unsigned int j = 0; j < lod_group_xml->getNumNodes(); j++)
|
|
||||||
{
|
|
||||||
lodLoader.addModelDefinition(lod_group_xml->getNode(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (unsigned int i=0; i<track_node->getNumNodes(); i++)
|
for (unsigned int i=0; i<track_node->getNumNodes(); i++)
|
||||||
{
|
{
|
||||||
const XMLNode *n=track_node->getNode(i);
|
const XMLNode *n=track_node->getNode(i);
|
||||||
@ -1756,20 +1728,6 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load instancing models (for the moment they are loaded the same way as LOD to simplify implementation)
|
|
||||||
const XMLNode *instancing_xml_node = NULL;// root->getNode("instancing");
|
|
||||||
if (instancing_xml_node != NULL)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < instancing_xml_node->getNumNodes(); i++)
|
|
||||||
{
|
|
||||||
const XMLNode* lod_group_xml = instancing_xml_node->getNode(i);
|
|
||||||
for (unsigned int j = 0; j < lod_group_xml->getNumNodes(); j++)
|
|
||||||
{
|
|
||||||
model_def_loader.addModelDefinition(lod_group_xml->getNode(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map<std::string, XMLNode*> library_nodes;
|
std::map<std::string, XMLNode*> library_nodes;
|
||||||
loadObjects(root, path, model_def_loader, true, NULL, library_nodes);
|
loadObjects(root, path, model_def_loader, true, NULL, library_nodes);
|
||||||
|
|
||||||
@ -2010,20 +1968,6 @@ void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load instancing definitions
|
|
||||||
const XMLNode *instancing_xml_node = NULL;// libroot->getNode("instancing");
|
|
||||||
if (instancing_xml_node != NULL)
|
|
||||||
{
|
|
||||||
for (unsigned int i = 0; i < instancing_xml_node->getNumNodes(); i++)
|
|
||||||
{
|
|
||||||
const XMLNode* instancing_group_xml = instancing_xml_node->getNode(i);
|
|
||||||
for (unsigned int j = 0; j < instancing_group_xml->getNumNodes(); j++)
|
|
||||||
{
|
|
||||||
model_def_loader.addModelDefinition(instancing_group_xml->getNode(j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2128,7 +2072,7 @@ void Track::loadObjects(const XMLNode* root, const std::string& path, ModelDefin
|
|||||||
}
|
}
|
||||||
else if (name == "instancing")
|
else if (name == "instancing")
|
||||||
{
|
{
|
||||||
// handled above
|
// TODO: eventually remove, this is now automatic
|
||||||
}
|
}
|
||||||
else if (name == "subtitles")
|
else if (name == "subtitles")
|
||||||
{
|
{
|
||||||
|
@ -103,9 +103,6 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
bool lod_instance = false;
|
bool lod_instance = false;
|
||||||
xml_node.get("lod_instance", &lod_instance);
|
xml_node.get("lod_instance", &lod_instance);
|
||||||
|
|
||||||
bool instancing = false;
|
|
||||||
// xml_node.get("instancing", &instancing);
|
|
||||||
|
|
||||||
m_soccer_ball = false;
|
m_soccer_ball = false;
|
||||||
xml_node.get("soccer_ball", &m_soccer_ball);
|
xml_node.get("soccer_ball", &m_soccer_ball);
|
||||||
|
|
||||||
@ -159,14 +156,7 @@ void TrackObject::init(const XMLNode &xml_node, scene::ISceneNode* parent,
|
|||||||
{
|
{
|
||||||
scene::ISceneNode *glownode = NULL;
|
scene::ISceneNode *glownode = NULL;
|
||||||
|
|
||||||
if (instancing)
|
if (lod_instance)
|
||||||
{
|
|
||||||
m_type = "lod";
|
|
||||||
TrackObjectPresentationInstancing* instancing_node =
|
|
||||||
new TrackObjectPresentationInstancing(xml_node, parent, model_def_loader);
|
|
||||||
m_presentation = instancing_node;
|
|
||||||
}
|
|
||||||
else if (lod_instance)
|
|
||||||
{
|
{
|
||||||
m_type = "lod";
|
m_type = "lod";
|
||||||
TrackObjectPresentationLOD* lod_node =
|
TrackObjectPresentationLOD* lod_node =
|
||||||
|
@ -168,59 +168,6 @@ TrackObjectPresentationLOD::~TrackObjectPresentationLOD()
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
TrackObjectPresentationInstancing::TrackObjectPresentationInstancing(const XMLNode& xml_node,
|
|
||||||
scene::ISceneNode* parent,
|
|
||||||
ModelDefinitionLoader& model_def_loader) : TrackObjectPresentationSceneNode(xml_node)
|
|
||||||
{
|
|
||||||
m_instancing_group = NULL;
|
|
||||||
m_fallback_scene_node = NULL;
|
|
||||||
|
|
||||||
std::string instancing_model;
|
|
||||||
xml_node.get("instancing_model", &instancing_model);
|
|
||||||
|
|
||||||
m_node = irr_driver->getSceneManager()->addEmptySceneNode(parent);
|
|
||||||
m_node->setPosition(m_init_xyz);
|
|
||||||
m_node->setRotation(m_init_hpr);
|
|
||||||
m_node->setScale(m_init_scale);
|
|
||||||
m_node->updateAbsolutePosition();
|
|
||||||
if (irr_driver->isGLSL())
|
|
||||||
{
|
|
||||||
m_instancing_group = model_def_loader.instanciate(m_node->getAbsolutePosition(),
|
|
||||||
m_node->getAbsoluteTransformation().getRotationDegrees(), m_node->getAbsoluteTransformation().getScale(),
|
|
||||||
instancing_model);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scene::IMesh* mesh = model_def_loader.getFirstMeshFor(instancing_model);
|
|
||||||
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()
|
|
||||||
{
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
TrackObjectPresentationMesh::TrackObjectPresentationMesh(const XMLNode& xml_node,
|
TrackObjectPresentationMesh::TrackObjectPresentationMesh(const XMLNode& xml_node,
|
||||||
bool enabled, scene::ISceneNode* parent) :
|
bool enabled, scene::ISceneNode* parent) :
|
||||||
TrackObjectPresentationSceneNode(xml_node)
|
TrackObjectPresentationSceneNode(xml_node)
|
||||||
|
@ -167,20 +167,6 @@ public:
|
|||||||
virtual ~TrackObjectPresentationLOD();
|
virtual ~TrackObjectPresentationLOD();
|
||||||
};
|
};
|
||||||
|
|
||||||
class TrackObjectPresentationInstancing : public TrackObjectPresentationSceneNode
|
|
||||||
{
|
|
||||||
STKInstancedSceneNode* m_instancing_group;
|
|
||||||
scene::IMeshSceneNode* m_fallback_scene_node;
|
|
||||||
public:
|
|
||||||
|
|
||||||
TrackObjectPresentationInstancing(const XMLNode& xml_node,
|
|
||||||
scene::ISceneNode* parent,
|
|
||||||
ModelDefinitionLoader& model_def_loader);
|
|
||||||
virtual ~TrackObjectPresentationInstancing();
|
|
||||||
|
|
||||||
STKInstancedSceneNode* getInstancingGroup() { return m_instancing_group; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \ingroup tracks
|
* \ingroup tracks
|
||||||
* A track object representation that consists of a mesh scene node.
|
* A track object representation that consists of a mesh scene node.
|
||||||
|
Loading…
Reference in New Issue
Block a user