#include <simgear/scene/util/OsgMath.hxx>
#include <simgear/scene/util/SGSceneUserData.hxx>
#include <simgear/scene/model/CheckSceneryVisitor.hxx>
+#include <simgear/scene/sky/sky.hxx>
+
#include <simgear/bvh/BVHNode.hxx>
#include <simgear/bvh/BVHLineSegmentVisitor.hxx>
#include <simgear/structure/commands.hxx>
bool _haveHit;
};
+class FGScenery::ScenerySwitchListener : public SGPropertyChangeListener
+{
+public:
+ ScenerySwitchListener(FGScenery* scenery) :
+ _scenery(scenery)
+ {
+ SGPropertyNode_ptr maskNode = fgGetNode("/sim/rendering/draw-mask", true);
+ maskNode->getChild("terrain", 0, true)->addChangeListener(this, true);
+ maskNode->getChild("models", 0, true)->addChangeListener(this, true);
+ maskNode->getChild("aircraft", 0, true)->addChangeListener(this, true);
+ maskNode->getChild("clouds", 0, true)->addChangeListener(this, true);
+
+ // legacy compatability option
+ fgGetNode("/sim/rendering/draw-otw")->addChangeListener(this);
+
+ // badly named property, this is what is set by --enable/disable-clouds
+ fgGetNode("/environment/clouds/status")->addChangeListener(this);
+ }
+
+ ~ScenerySwitchListener()
+ {
+ SGPropertyNode_ptr maskNode = fgGetNode("/sim/rendering/draw-mask");
+ for (int i=0; i < maskNode->nChildren(); ++i) {
+ maskNode->getChild(i)->removeChangeListener(this);
+ }
+
+ fgGetNode("/sim/rendering/draw-otw")->removeChangeListener(this);
+ fgGetNode("/environment/clouds/status")->removeChangeListener(this);
+ }
+
+ virtual void valueChanged (SGPropertyNode * node)
+ {
+ bool b = node->getBoolValue();
+ std::string name(node->getNameString());
+
+ if (name == "terrain") {
+ _scenery->scene_graph->setChildValue(_scenery->terrain_branch, b);
+ } else if (name == "models") {
+ _scenery->scene_graph->setChildValue(_scenery->models_branch, b);
+ } else if (name == "aircraft") {
+ _scenery->scene_graph->setChildValue(_scenery->aircraft_branch, b);
+ } else if (name == "clouds") {
+ // clouds live elsewhere in the scene, but we handle them here
+ globals->get_renderer()->getSky()->set_clouds_enabled(b);
+ } else if (name == "draw-otw") {
+ // legacy setting but let's keep it working
+ fgGetNode("/sim/rendering/draw-mask")->setBoolValue("terrain", b);
+ fgGetNode("/sim/rendering/draw-mask")->setBoolValue("models", b);
+ } else if (name == "status") {
+ fgGetNode("/sim/rendering/draw-mask")->setBoolValue("clouds", b);
+ }
+ }
+private:
+ FGScenery* _scenery;
+};
+
+////////////////////////////////////////////////////////////////////////////
+
// Scenery Management system
-FGScenery::FGScenery()
+FGScenery::FGScenery() :
+ _listener(NULL)
{
SG_LOG( SG_TERRAIN, SG_INFO, "Initializing scenery subsystem" );
// keep reference to pager singleton, so it cannot be destroyed while FGScenery lives
_pager = FGScenery::getPagerSingleton();
}
-FGScenery::~FGScenery() {
+FGScenery::~FGScenery()
+{
+ delete _listener;
}
// Initialize the Scenery Management system
void FGScenery::init() {
// Scene graph root
- scene_graph = new osg::Group;
+ scene_graph = new osg::Switch;
scene_graph->setName( "FGScenery" );
// Terrain branch
// Initials values needed by the draw-time object loader
sgUserDataInit( globals->get_props() );
+
+ _listener = new ScenerySwitchListener(this);
}
void FGScenery::shutdown()
// while the splashscreen is there, so CheckSceneryVisitor force-loads
// missing objects in the main thread
get_scene_graph()->accept(csnv);
- if(!csnv.isLoaded())
+ if(!csnv.isLoaded()) {
+ SG_LOG(SG_TERRAIN, SG_DEBUG, "FGScenery::scenery_available: waiting on CheckSceneryVisitor");
return false;
+ }
return true;
+ } else {
+ SG_LOG(SG_TERRAIN, SG_DEBUG, "FGScenery::scenery_available: waiting on tile manager");
}
return false;
}
+static osg::ref_ptr<SceneryPager> pager;
+
SceneryPager* FGScenery::getPagerSingleton()
{
- static osg::ref_ptr<SceneryPager> pager = new SceneryPager;
+ if (!pager)
+ pager = new SceneryPager;
return pager.get();
}
+void FGScenery::resetPagerSingleton()
+{
+ pager = NULL;
+}
+