diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index f967995f6..b405d623a 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -129,9 +129,7 @@ FGAIBase::FGAIBase(object_type ot, bool enableHot) : FGAIBase::~FGAIBase() { // Unregister that one at the scenery manager - if (globals->get_scenery()) { - globals->get_scenery()->get_scene_graph()->removeChild(aip.getSceneGraph()); - } + removeModel(); if (props) { SGPropertyNode* parent = props->getParent(); @@ -143,6 +141,29 @@ FGAIBase::~FGAIBase() { fp = 0; } +/** Cleanly remove the model + * and let the scenery database pager do the clean-up work. + */ +void +FGAIBase::removeModel() +{ + FGScenery* pSceneryManager = globals->get_scenery(); + if (pSceneryManager) + { + osg::ref_ptr temp = _model.get(); + pSceneryManager->get_scene_graph()->removeChild(aip.getSceneGraph()); + // withdraw from SGModelPlacement and drop own reference (unref) + aip.init( 0 ); + _model = 0; + // pass it on to the pager, to be be deleted in the pager thread + pSceneryManager->getPagerSingleton()->queueDeleteRequest(temp); + } + else + { + SG_LOG(SG_AI, SG_ALERT, "AIBase: Could not unload model. Missing scenery manager!"); + } +} + void FGAIBase::readFromScenario(SGPropertyNode* scFileNode) { if (!scFileNode) @@ -248,6 +269,12 @@ bool FGAIBase::init(bool search_in_AI_path) { osg::Node * mdl = SGModelLib::loadPagedModel(f, props, new FGNasalModelData(props)); + if (_model.valid()) + { + // reinit, dump the old model + removeModel(); + } + _model = new osg::LOD; _model->setName("AI-model range animation node"); diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index 298d67cf0..ed20dd869 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -216,6 +216,8 @@ protected: void CalculateMach(); double UpdateRadar(FGAIManager* manager); + void removeModel(); + static int _newAIModelID(); private: