1
0
Fork 0

#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:
ThorstenB 2011-12-09 17:06:19 +01:00
parent bfb0619f76
commit 826107f132
11 changed files with 61 additions and 45 deletions

View file

@ -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() {

View file

@ -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

View file

@ -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");

View file

@ -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) {

View file

@ -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();

View file

@ -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) {

View file

@ -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);

View file

@ -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() {

View file

@ -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);

View file

@ -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) {

View file

@ -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);