Skip to content

Commit

Permalink
Attempt fix for 2055. Committed in a branch for now until we can test…
Browse files Browse the repository at this point in the history
… it better.
  • Loading branch information
auriamg committed Mar 28, 2015
1 parent f2d0b4d commit 8deac17
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 39 deletions.
39 changes: 27 additions & 12 deletions src/tracks/track.cpp
Expand Up @@ -142,7 +142,7 @@ Track::Track(const std::string &filename)
m_startup_run = false;
m_default_number_of_laps= 3;
m_all_nodes.clear();
m_all_physics_only_nodes.clear();
m_static_physics_only_nodes.clear();
m_all_cached_meshes.clear();
loadTrackInfo();
} // Track
Expand Down Expand Up @@ -293,7 +293,7 @@ void Track::cleanup()
irr_driver->removeNode(m_all_nodes[i]);
}
m_all_nodes.clear();
m_all_physics_only_nodes.clear();
m_static_physics_only_nodes.clear();

m_all_emitters.clearAndDeleteAll();

Expand All @@ -302,6 +302,12 @@ void Track::cleanup()
delete m_track_object_manager;
m_track_object_manager = NULL;

for (unsigned int i = 0; i < m_object_physics_only_nodes.size(); i++)
{
m_object_physics_only_nodes[i]->drop();
}
m_object_physics_only_nodes.clear();

irr_driver->removeNode(m_sun);

delete m_track_mesh;
Expand Down Expand Up @@ -720,6 +726,24 @@ void Track::createPhysicsModel(unsigned int main_track_count)
return;
}


// Now convert all objects that are only used for the physics
// (like invisible walls).
for (unsigned int i = 0; i<m_static_physics_only_nodes.size(); i++)
{
convertTrackToBullet(m_static_physics_only_nodes[i]);
irr_driver->removeNode(m_static_physics_only_nodes[i]);
}
m_static_physics_only_nodes.clear();

for (unsigned int i = 0; i<m_object_physics_only_nodes.size(); i++)
{
convertTrackToBullet(m_object_physics_only_nodes[i]);
m_object_physics_only_nodes[i]->setVisible(false);
m_object_physics_only_nodes[i]->grab();
irr_driver->removeNode(m_object_physics_only_nodes[i]);
}

m_track_mesh->removeAll();
m_gfx_effect_mesh->removeAll();
for(unsigned int i=main_track_count; i<m_all_nodes.size(); i++)
Expand Down Expand Up @@ -1377,7 +1401,7 @@ bool Track::loadMainTrack(const XMLNode &root)
else
{
if(interaction=="physics-only")
m_all_physics_only_nodes.push_back( scene_node );
m_static_physics_only_nodes.push_back(scene_node);
else
m_all_nodes.push_back( scene_node );
}
Expand All @@ -1391,15 +1415,6 @@ bool Track::loadMainTrack(const XMLNode &root)
convertTrackToBullet(m_all_nodes[i]);
}

// Now convert all objects that are only used for the physics
// (like invisible walls).
for(unsigned int i=0; i<m_all_physics_only_nodes.size(); i++)
{
convertTrackToBullet(m_all_physics_only_nodes[i]);
irr_driver->removeNode(m_all_physics_only_nodes[i]);
}
m_all_physics_only_nodes.clear();

if (m_track_mesh == NULL)
{
Log::fatal("track", "m_track_mesh == NULL, cannot loadMainTrack\n");
Expand Down
12 changes: 11 additions & 1 deletion src/tracks/track.hpp
Expand Up @@ -184,7 +184,12 @@ class Track

/** The list of all nodes that are to be converted into physics,
* but not to be drawn (e.g. invisible walls). */
std::vector<scene::ISceneNode*> m_all_physics_only_nodes;
std::vector<scene::ISceneNode*> m_static_physics_only_nodes;

/** Same concept but for track objects. stored separately due to different
* memory management.
*/
std::vector<scene::ISceneNode*> m_object_physics_only_nodes;

/** The list of all meshes that are loaded from disk, which means
* that those meshes are being cached by irrlicht, and need to be freed. */
Expand Down Expand Up @@ -651,6 +656,11 @@ class Track
// ------------------------------------------------------------------------
void addNode(scene::ISceneNode* node) { m_all_nodes.push_back(node); }
// ------------------------------------------------------------------------
void addPhysicsOnlyNode(scene::ISceneNode* node)
{
m_object_physics_only_nodes.push_back(node);
}
// ------------------------------------------------------------------------
float getDisplacementSpeed() const { return m_displacement_speed; }
// ------------------------------------------------------------------------
float getCausticsSpeed() const { return m_caustics_speed; }
Expand Down
24 changes: 0 additions & 24 deletions src/tracks/track_object_manager.cpp
Expand Up @@ -42,13 +42,6 @@ TrackObjectManager::~TrackObjectManager()
// ----------------------------------------------------------------------------
/** Adds an object to the track object manager. The type to add is specified
* in the xml_node.
* \note If you add add any objects with LOD, don't forget to call
* TrackObjectManager::assingLodNodes after everything is loaded
* to finalize their creation.
*
* FIXME: all of this is horrible, just make the exporter write LOD definitions
* in a separate section that's read before everything and remove all this
* crap
*/
void TrackObjectManager::add(const XMLNode &xml_node, scene::ISceneNode* parent,
ModelDefinitionLoader& model_def_loader)
Expand Down Expand Up @@ -351,21 +344,4 @@ void TrackObjectManager::removeObject(TrackObject* obj)

// ----------------------------------------------------------------------------

/*
void TrackObjectManager::assingLodNodes(const std::vector<LODNode*>& lod_nodes)
{
for (unsigned int n=0; n<lod_nodes.size(); n++)
{
std::vector<const XMLNode*>& queue = m_lod_objects[ lod_nodes[n]->getGroupName() ];
assert( queue.size() > 0 );
const XMLNode* xml = queue[ queue.size() - 1 ];

TrackObject* obj = new TrackObject(*xml, lod_nodes[n]->getParent(), lod_nodes[n]);
queue.erase( queue.end() - 1 );
m_all_objects.push_back(obj);
}
m_lod_objects.clear();
}
*/
18 changes: 16 additions & 2 deletions src/tracks/track_object_presentation.cpp
Expand Up @@ -384,14 +384,28 @@ void TrackObjectPresentationMesh::init(const XMLNode* xml_node,
bool animated = skeletal_animation && (UserConfigParams::m_graphical_effects ||
World::getWorld()->getIdent() == IDENT_CUTSCENE);
bool displacing = false;
if(xml_node)
std::string interaction;
if (xml_node)
{
xml_node->get("displacing", &displacing);
xml_node->get("interaction", &interaction);
}
animated &= !displacing;

m_mesh->grab();
irr_driver->grabAllTextures(m_mesh);

if (m_is_in_skybox)
if (interaction == "physicsonly")
{
m_node = irr_driver->addMesh(m_mesh, m_model_file, parent);
enabled = false;
m_frame_start = 0;
m_frame_end = 0;

if (World::getWorld() && World::getWorld()->getTrack() && xml_node)
World::getWorld()->getTrack()->addPhysicsOnlyNode(m_node);
}
else if (m_is_in_skybox)
{
// Tell the driver that this mesh is a part of the background
scene::IMeshSceneNode * const node =
Expand Down

0 comments on commit 8deac17

Please sign in to comment.