From ea981119267ddfe5b6fc3527738e88a80d8b9536 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 30 Dec 2002 15:44:11 +0000 Subject: [PATCH] Made it possible to add and remove models programmatically, as requested by Leon Otte. --- src/Model/modelmgr.cxx | 15 ++++++++++- src/Model/modelmgr.hxx | 56 +++++++++++++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/Model/modelmgr.cxx b/src/Model/modelmgr.cxx index f3f7cc8e4..3507cc4f6 100644 --- a/src/Model/modelmgr.cxx +++ b/src/Model/modelmgr.cxx @@ -83,7 +83,7 @@ FGModelMgr::init () globals->get_scenery()->get_scene_graph()->addKid(model->getSceneGraph()); // Save this instance for updating - _instances.push_back(instance); + add_instance(instance); } } @@ -124,6 +124,19 @@ FGModelMgr::update (double dt) } } +void +FGModelMgr::add_instance (Instance * instance) +{ + _instances.push_back(instance); +} + +void +FGModelMgr::remove_instance (Instance * instance) +{ + _instances.erase(find(_instances.begin(), _instances.end(), instance)); + delete instance; +} + void FGModelMgr::draw () { diff --git a/src/Model/modelmgr.hxx b/src/Model/modelmgr.hxx index d0b7841cd..87ee0fe76 100644 --- a/src/Model/modelmgr.hxx +++ b/src/Model/modelmgr.hxx @@ -30,18 +30,20 @@ class FGModelPlacement; class FGModelMgr : public FGSubsystem { public: - FGModelMgr (); - virtual ~FGModelMgr (); - - virtual void init (); - virtual void bind (); - virtual void unbind (); - virtual void update (double dt); - - virtual void draw (); - -private: + /** + * 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 FGModelPlacement with the path + * to the model or its XML wrapper, then assign any relevant + * property node pointers. + * + * @see FGModelPlacement + * @see FGModelMgr#add_instance + */ struct Instance { Instance (); @@ -55,6 +57,38 @@ private: SGPropertyNode * heading_deg_node; }; + FGModelMgr (); + virtual ~FGModelMgr (); + + virtual void init (); + virtual void bind (); + virtual void unbind (); + virtual void update (double dt); + + /** + * 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); + + + /** + * 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); + + virtual void draw (); + +private: + vector _instances; ssgSelector * _selector; -- 2.39.5