if (props) {
SGPropertyNode* parent = props->getParent();
if (parent)
- parent->removeChild(props->getName(), props->getIndex());
+ parent->removeChild(props->getName(), props->getIndex(), false);
}
delete fp;
fp = 0;
bool FGAIBase::init() {
- SGPropertyNode *root = globals->get_props()->getNode("ai/models", true);
-
- unsigned index = root->getChildren(getTypeString()).size();
-
- props = root->getNode(getTypeString(), index, true);
-
if (!model_path.empty()) {
try {
model = load3DModel( globals->get_fg_root(), model_path, props,
virtual void bind();
virtual void unbind();
- void setManager(FGAIManager* mgr);
+ void setManager(FGAIManager* mgr, SGPropertyNode* p);
void setPath( const char* model );
void setSpeed( double speed_KTAS );
void setAltitude( double altitude_ft );
static bool _isNight();
};
-inline void FGAIBase::setManager(FGAIManager* mgr) {
+inline void FGAIBase::setManager(FGAIManager* mgr, SGPropertyNode* p) {
manager = mgr;
+ props = p;
}
inline void FGAIBase::setPath(const char* model ) {
FGAIManager::FGAIManager() {
_dt = 0.0;
mNumAiModels = 0;
+ for (unsigned i = 0; i < FGAIBase::MAX_OBJECTS; ++i)
+ mNumAiTypeModels[i] = 0;
}
FGAIManager::~FGAIManager() {
if ((*ai_list_itr)->getDie()) {
tmgr->release((*ai_list_itr)->getID());
--mNumAiModels;
+ --(mNumAiTypeModels[(*ai_list_itr)->getType()]);
(*ai_list_itr)->unbind();
ai_list_itr = ai_list.erase(ai_list_itr);
} else {
void
FGAIManager::attach(SGSharedPtr<FGAIBase> model)
{
- model->setManager(this);
+ unsigned idx = mNumAiTypeModels[model->getType()];
+ const char* typeString = model->getTypeString();
+ SGPropertyNode* root = globals->get_props()->getNode("ai/models", true);
+ SGPropertyNode* p = root->getNode(typeString, idx, true);
+ model->setManager(this, p);
ai_list.push_back(model);
++mNumAiModels;
+ ++(mNumAiTypeModels[model->getType()]);
model->init();
model->bind();
}
while(ai_list_itr != ai_list.end()) {
if ((*ai_list_itr)->getID() == ID) {
--mNumAiModels;
+ --(mNumAiTypeModels[(*ai_list_itr)->getType()]);
(*ai_list_itr)->unbind();
ai_list_itr = ai_list.erase(ai_list_itr);
} else