FGModelMgr::FGModelMgr ()
- : _selector(new ssgSelector)
+ : _models(fgGetNode("/models", true)),
+ _listener(new Listener(this)),
+ _selector(new ssgSelector)
+
{
+ _models->addChangeListener(_listener);
}
FGModelMgr::~FGModelMgr ()
{
+ _models->removeChangeListener(_listener);
+ delete _listener;
+
for (unsigned int i = 0; i < _instances.size(); i++) {
globals->get_scenery()->get_models_branch()
->removeKid(_instances[i]->model->getSceneGraph());
void
FGModelMgr::init ()
{
- vector<SGPropertyNode_ptr> model_nodes =
- fgGetNode("/models", true)->getChildren("model");
+ vector<SGPropertyNode_ptr> model_nodes = _models->getChildren("model");
for (unsigned int i = 0; i < model_nodes.size(); i++) {
try {
delete model;
}
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Implementation of FGModelMgr::Listener
+////////////////////////////////////////////////////////////////////////
+
+void
+FGModelMgr::Listener::childAdded(SGPropertyNode * parent, SGPropertyNode * child)
+{
+ if (strcmp(parent->getName(), "model") || strcmp(child->getName(), "add"))
+ return;
+
+ try {
+ _mgr->add_model(parent);
+ } catch (const sg_throwable& t) {
+ SG_LOG(SG_GENERAL, SG_ALERT, t.getFormattedMessage() << t.getOrigin());
+ }
+}
+
// end of modelmgr.cxx
virtual void draw ();
+
+
private:
+ /**
+ * Listener class that adds models at runtime.
+ */
+ class Listener : public SGPropertyChangeListener
+ {
+ public:
+ Listener(FGModelMgr *mgr) : _mgr(mgr) {}
+ virtual void childAdded (SGPropertyNode * parent, SGPropertyNode * child);
+
+ private:
+ FGModelMgr * _mgr;
+ };
+
+ SGPropertyNode_ptr _models;
+ Listener * _listener;
vector<Instance *> _instances;