#include <vector>
#include <simgear/compiler.h> // for SG_USING_STD
-
-#include <Main/fgfs.hxx> // for FGSubsystem
+#include <simgear/structure/subsystem_mgr.hxx>
SG_USING_STD(vector);
// Don't pull in headers, since we don't need them here.
-class ssgSelector;
class SGPropertyNode;
-class FGModelPlacement;
+class SGModelPlacement;
/**
* Manage a list of user-specified models.
*/
-class FGModelMgr : public FGSubsystem
+class FGModelMgr : public SGSubsystem
{
public:
+
+ /**
+ * A dynamically-placed model using properties.
+ *
+ * The model manager uses the property nodes to update the model's
+ * position and orientation; any of the property node pointers may
+ * be set to zero to avoid update. Normally, a caller should
+ * load the model by instantiating SGModelPlacement with the path
+ * to the model or its XML wrapper, then assign any relevant
+ * property node pointers.
+ *
+ * @see SGModelPlacement
+ * @see FGModelMgr#add_instance
+ */
+ struct Instance
+ {
+ Instance ();
+ virtual ~Instance ();
+ SGModelPlacement * model;
+ SGPropertyNode_ptr node;
+ SGPropertyNode_ptr lon_deg_node;
+ SGPropertyNode_ptr lat_deg_node;
+ SGPropertyNode_ptr elev_ft_node;
+ SGPropertyNode_ptr roll_deg_node;
+ SGPropertyNode_ptr pitch_deg_node;
+ SGPropertyNode_ptr heading_deg_node;
+ bool shadow;
+ };
+
FGModelMgr ();
virtual ~FGModelMgr ();
virtual void unbind ();
virtual void update (double dt);
- virtual void draw ();
+ virtual void add_model (SGPropertyNode * node);
-private:
+ /**
+ * Add an instance of a dynamic model to the manager.
+ *
+ * NOTE: pointer ownership is transferred to the model manager!
+ *
+ * The caller is responsible for setting up the Instance structure
+ * as required. The model manager will continuously update the
+ * location and orientation of the model based on the current
+ * values of the properties.
+ */
+ virtual void add_instance (Instance * instance);
- struct Instance
+
+ /**
+ * Remove an instance of a dynamic model from the manager.
+ *
+ * NOTE: the manager will delete the instance as well.
+ */
+ virtual void remove_instance (Instance * instance);
+
+
+private:
+ /**
+ * Listener class that adds models at runtime.
+ */
+ class Listener : public SGPropertyChangeListener
{
- Instance ();
- virtual ~Instance ();
- FGModelPlacement * model;
- SGPropertyNode * lon_deg_node;
- SGPropertyNode * lat_deg_node;
- SGPropertyNode * elev_ft_node;
- SGPropertyNode * roll_deg_node;
- SGPropertyNode * pitch_deg_node;
- SGPropertyNode * heading_deg_node;
+ public:
+ Listener(FGModelMgr *mgr) : _mgr(mgr) {}
+ virtual void childAdded (SGPropertyNode * parent, SGPropertyNode * child);
+ virtual void childRemoved (SGPropertyNode * parent, SGPropertyNode * child);
+
+ private:
+ FGModelMgr * _mgr;
};
- vector<Instance *> _instances;
+ SGPropertyNode_ptr _models;
+ Listener * _listener;
- ssgSelector * _selector;
+ vector<Instance *> _instances;
};