]> git.mxchange.org Git - flightgear.git/commitdiff
Fix for the particle system.
authorEdward d'Auvergne <edward@nmr-relax.com>
Tue, 16 Feb 2016 16:33:40 +0000 (17:33 +0100)
committerEdward d'Auvergne <edward@nmr-relax.com>
Tue, 16 Feb 2016 16:33:40 +0000 (17:33 +0100)
The problem was that the change to make FGScenery a standard subsystem caused
the particle OSG group to no longer be inserted into the scene graph.  The
solution was to convert the particle group to be set up as a standard branch of
the scene graph, alongside the terrain, models, aircraft, and interior branches.
The particle system is now set up as part of the init() subsystem function call,
so it is compatible with the new subsystem design.

src/Main/fg_init.cxx
src/Scenery/scenery.cxx
src/Scenery/scenery.hxx

index b2639671d27269f37d2876183088c185bd0dbd2f..61d34258871e31d940ef65ca74da07f136ba3dba 100644 (file)
@@ -742,14 +742,6 @@ void fgCreateSubsystems(bool duringReset) {
         globals->add_subsystem( "http", new FGHTTPClient );
     }
 
-    ////////////////////////////////////////////////////////////////////
-    // Initialize the scenery management subsystem.
-    ////////////////////////////////////////////////////////////////////
-
-    globals->get_scenery()->get_scene_graph()
-        ->addChild(simgear::Particles::getCommonRoot());
-    simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true));
-
     ////////////////////////////////////////////////////////////////////
     // Initialize the flight model subsystem.
     ////////////////////////////////////////////////////////////////////
index f160b42675b22fa0cb7abc4543df2c38f3ace12e..8ec3e5703b0b26b61cce4525bcbb709439508156 100644 (file)
@@ -327,6 +327,12 @@ void FGScenery::init() {
     interiorLOD->addChild(interior_branch.get(), 0.0, 50.0);
     aircraft_branch->addChild( interiorLOD );
     
+    // Set up the particle system as a directly accessible branch of the scene graph.
+    particles_branch = simgear::Particles::getCommonRoot();
+    particles_branch->setName("Particles");
+    scene_graph->addChild(particles_branch.get());
+    simgear::GlobalParticleCallback::setSwitch(fgGetNode("/sim/rendering/particles", true));
+
     // Initials values needed by the draw-time object loader
     sgUserDataInit( globals->get_props() );
   
@@ -341,6 +347,7 @@ void FGScenery::shutdown()
     terrain_branch = NULL;
     models_branch = NULL;
     aircraft_branch = NULL;
+    particles_branch = NULL;
 }
 
 
index cc659882c28f706a694e303ab09c3fb62fe13a65..593707d145b02495bca4c686c695b87308d5f135 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <simgear/compiler.h>
 #include <simgear/math/SGMath.hxx>
+#include <simgear/scene/model/particles.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
 
 #include "SceneryPager.hxx"
@@ -55,6 +56,7 @@ class FGScenery : public SGSubsystem
     osg::ref_ptr<osg::Group> models_branch;
     osg::ref_ptr<osg::Group> aircraft_branch;
     osg::ref_ptr<osg::Group> interior_branch;
+    osg::ref_ptr<osg::Group> particles_branch;
     
     osg::ref_ptr<flightgear::SceneryPager> _pager;
     ScenerySwitchListener* _listener;
@@ -114,6 +116,7 @@ public:
     osg::Group *get_models_branch () const { return models_branch.get(); }
     osg::Group *get_aircraft_branch () const { return aircraft_branch.get(); }
     osg::Group *get_interior_branch () const { return interior_branch.get(); }
+    osg::Group *get_particles_branch () const { return particles_branch.get(); }
     
     /// Returns true if scenery is available for the given lat, lon position
     /// within a range of range_m.