#510: Fix disappearing AIShips.
Untangle AI reinit and init methods. Some code in init hooks expects to be called once only. Derived classes should not redirect their reinit to init, even if this seems fine for the methods of the derived class itself. This also triggers the init methods of all base classes, which may not expect multiple calls to their init methods (or to "init" on "reinit").
This commit is contained in:
parent
bfb0619f76
commit
826107f132
11 changed files with 61 additions and 45 deletions
|
@ -126,7 +126,11 @@ void FGAIBallistic::readFromScenario(SGPropertyNode* scFileNode) {
|
|||
|
||||
bool FGAIBallistic::init(bool search_in_AI_path) {
|
||||
FGAIBase::init(search_in_AI_path);
|
||||
reinit();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FGAIBallistic::reinit() {
|
||||
_impact_reported = false;
|
||||
_collision_reported = false;
|
||||
_expiry_reported = false;
|
||||
|
@ -179,7 +183,7 @@ bool FGAIBallistic::init(bool search_in_AI_path) {
|
|||
|
||||
setParentNodes(_selected_ac);
|
||||
|
||||
return true;
|
||||
FGAIBase::reinit();
|
||||
}
|
||||
|
||||
void FGAIBallistic::bind() {
|
||||
|
|
|
@ -46,10 +46,10 @@ public:
|
|||
bool init(bool search_in_AI_path=false);
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual void reinit();
|
||||
virtual void update(double dt);
|
||||
|
||||
void update(double dt);
|
||||
|
||||
FGAIBallistic *ballistic;
|
||||
virtual const char* getTypeString(void) const { return "ballistic"; }
|
||||
|
||||
void Run(double dt);
|
||||
|
||||
|
@ -114,7 +114,8 @@ public:
|
|||
// bool getFormate() const;
|
||||
bool getSlavedLoad() const;
|
||||
|
||||
virtual const char* getTypeString(void) const { return "ballistic"; }
|
||||
FGAIBallistic *ballistic;
|
||||
|
||||
static const double slugs_to_kgs; //conversion factor
|
||||
static const double slugs_to_lbs; //conversion factor
|
||||
|
||||
|
@ -170,8 +171,6 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
virtual void reinit() { init(); }
|
||||
|
||||
bool _aero_stabilised; // if true, object will align with trajectory
|
||||
double _drag_area; // equivalent drag area in ft2
|
||||
double _life_timer; // seconds
|
||||
|
|
|
@ -288,8 +288,14 @@ void FGAIBase::Transform() {
|
|||
|
||||
}
|
||||
|
||||
bool FGAIBase::init(bool search_in_AI_path) {
|
||||
|
||||
bool FGAIBase::init(bool search_in_AI_path)
|
||||
{
|
||||
if (_model.valid())
|
||||
{
|
||||
SG_LOG(SG_AI, SG_WARN, "AIBase: Cannot initialize a model multiple times! " << model_path);
|
||||
return false;
|
||||
}
|
||||
|
||||
string f;
|
||||
if(search_in_AI_path)
|
||||
{
|
||||
|
@ -318,12 +324,6 @@ bool FGAIBase::init(bool search_in_AI_path) {
|
|||
_aimodel = new FGAIModelData(props);
|
||||
osg::Node * mdl = SGModelLib::loadDeferredModel(f, props, _aimodel);
|
||||
|
||||
if (_model.valid())
|
||||
{
|
||||
// reinit, dump the old model
|
||||
removeModel();
|
||||
}
|
||||
|
||||
_model = new osg::LOD;
|
||||
_model->setName("AI-model range animation node");
|
||||
|
||||
|
|
|
@ -134,7 +134,11 @@ void FGAIEscort::unbind() {
|
|||
bool FGAIEscort::init(bool search_in_AI_path) {
|
||||
if (!FGAIShip::init(search_in_AI_path))
|
||||
return false;
|
||||
reinit();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FGAIEscort::reinit() {
|
||||
invisible = false;
|
||||
no_roll = false;
|
||||
|
||||
|
@ -147,7 +151,7 @@ bool FGAIEscort::init(bool search_in_AI_path) {
|
|||
hdg = _parent_hdg;
|
||||
}
|
||||
|
||||
return true;
|
||||
FGAIShip::reinit();
|
||||
}
|
||||
|
||||
void FGAIEscort::update(double dt) {
|
||||
|
|
|
@ -39,17 +39,16 @@ public:
|
|||
virtual ~FGAIEscort();
|
||||
|
||||
virtual void readFromScenario(SGPropertyNode* scFileNode);
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual const char* getTypeString(void) const { return "escort"; }
|
||||
|
||||
bool init(bool search_in_AI_path=false);
|
||||
|
||||
private:
|
||||
|
||||
virtual void reinit() { init(); }
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual void reinit();
|
||||
virtual void update (double dt);
|
||||
|
||||
virtual const char* getTypeString(void) const { return "escort"; }
|
||||
|
||||
private:
|
||||
void setStnRange(double r);
|
||||
void setStnBrg(double y);
|
||||
void setStationSpeed();
|
||||
|
|
|
@ -142,7 +142,11 @@ void FGAIGroundVehicle::unbind() {
|
|||
bool FGAIGroundVehicle::init(bool search_in_AI_path) {
|
||||
if (!FGAIShip::init(search_in_AI_path))
|
||||
return false;
|
||||
reinit();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FGAIGroundVehicle::reinit() {
|
||||
invisible = false;
|
||||
_limit = 200;
|
||||
no_roll = true;
|
||||
|
@ -162,7 +166,7 @@ bool FGAIGroundVehicle::init(bool search_in_AI_path) {
|
|||
setParent();
|
||||
}
|
||||
|
||||
return true;
|
||||
FGAIShip::reinit();
|
||||
}
|
||||
|
||||
void FGAIGroundVehicle::update(double dt) {
|
||||
|
|
|
@ -37,17 +37,17 @@ public:
|
|||
virtual ~FGAIGroundVehicle();
|
||||
|
||||
virtual void readFromScenario(SGPropertyNode* scFileNode);
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual const char* getTypeString(void) const { return "groundvehicle"; }
|
||||
|
||||
bool init(bool search_in_AI_path=false);
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual void reinit();
|
||||
virtual void update (double dt);
|
||||
|
||||
virtual const char* getTypeString(void) const { return "groundvehicle"; }
|
||||
|
||||
private:
|
||||
|
||||
virtual void reinit() { init(); }
|
||||
virtual void update (double dt);
|
||||
|
||||
void setNoRoll(bool nr);
|
||||
void setContactX1offset(double x1);
|
||||
void setContactX2offset(double x2);
|
||||
|
|
|
@ -113,6 +113,12 @@ void FGAIShip::readFromScenario(SGPropertyNode* scFileNode) {
|
|||
}
|
||||
|
||||
bool FGAIShip::init(bool search_in_AI_path) {
|
||||
reinit();
|
||||
return FGAIBase::init(search_in_AI_path);
|
||||
}
|
||||
|
||||
void FGAIShip::reinit()
|
||||
{
|
||||
prev = 0; // the one behind you
|
||||
curr = 0; // the one ahead
|
||||
next = 0; // the next plus 1
|
||||
|
@ -134,7 +140,7 @@ bool FGAIShip::init(bool search_in_AI_path) {
|
|||
if (fp)
|
||||
_fp_init = initFlightPlan();
|
||||
|
||||
return FGAIBase::init(search_in_AI_path);
|
||||
FGAIBase::reinit();
|
||||
}
|
||||
|
||||
void FGAIShip::bind() {
|
||||
|
|
|
@ -41,8 +41,9 @@ public:
|
|||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual void update(double dt);
|
||||
virtual void reinit();
|
||||
|
||||
void setFlightPlan(FGAIFlightPlan* f);
|
||||
// void setName(const string&);
|
||||
void setRudder(float r);
|
||||
void setRoll(double rl);
|
||||
void ProcessFlightPlan( double dt);
|
||||
|
@ -90,14 +91,9 @@ public:
|
|||
|
||||
protected:
|
||||
|
||||
// string _name; // The name of this ship.
|
||||
|
||||
private:
|
||||
|
||||
|
||||
|
||||
virtual void reinit() { init(); }
|
||||
|
||||
void setRepeat(bool r);
|
||||
void setRestart(bool r);
|
||||
void setMissed(bool m);
|
||||
|
|
|
@ -203,7 +203,11 @@ void FGAIWingman::unbind() {
|
|||
bool FGAIWingman::init(bool search_in_AI_path) {
|
||||
if (!FGAIBallistic::init(search_in_AI_path))
|
||||
return false;
|
||||
reinit();
|
||||
return true;
|
||||
}
|
||||
|
||||
void FGAIWingman::reinit() {
|
||||
invisible = false;
|
||||
|
||||
_tgt_x_offset = _x_offset;
|
||||
|
@ -223,7 +227,8 @@ bool FGAIWingman::init(bool search_in_AI_path) {
|
|||
|
||||
props->setStringValue("submodels/path", _path.c_str());
|
||||
user_WoW_node = fgGetNode("gear/gear[1]/wow", true);
|
||||
return true;
|
||||
|
||||
FGAIBallistic::reinit();
|
||||
}
|
||||
|
||||
void FGAIWingman::update(double dt) {
|
||||
|
|
|
@ -35,17 +35,16 @@ public:
|
|||
virtual ~FGAIWingman();
|
||||
|
||||
virtual void readFromScenario(SGPropertyNode* scFileNode);
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual const char* getTypeString(void) const { return "wingman"; }
|
||||
|
||||
bool init(bool search_in_AI_path=false);
|
||||
|
||||
private:
|
||||
|
||||
virtual void reinit() { init(); }
|
||||
virtual void bind();
|
||||
virtual void unbind();
|
||||
virtual void reinit();
|
||||
virtual void update (double dt);
|
||||
|
||||
virtual const char* getTypeString(void) const { return "wingman"; }
|
||||
|
||||
private:
|
||||
void formateToAC(double dt);
|
||||
void Break(double dt);
|
||||
void Join(double dt);
|
||||
|
|
Loading…
Add table
Reference in a new issue