From: ehofman Date: Wed, 8 Sep 2004 13:21:40 +0000 (+0000) Subject: Rearrange ID related code. The (this) pointer is now the unique ID of the AIModel... X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=9e72a3816568516e193b4f69f31d225b77290239;p=flightgear.git Rearrange ID related code. The (this) pointer is now the unique ID of the AIModel which fixes a number of problems along the way. --- diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx index cf20462f0..566b6068f 100644 --- a/src/AIModel/AIAircraft.cxx +++ b/src/AIModel/AIAircraft.cxx @@ -78,20 +78,19 @@ bool FGAIAircraft::init() { void FGAIAircraft::bind() { FGAIBase::bind(); -/* props->tie("controls/gear/gear-down", - SGRawValueFunctions(FGAIAircraft::_getGearDown)); + SGRawValueMethods(*this, + &FGAIAircraft::_getGearDown)); props->getNode("controls/lighting/landing-lights", true) ->alias("controls/gear/gear-down"); -*/ } void FGAIAircraft::unbind() { FGAIBase::unbind(); -// props->untie("controls/gear/gear-down"); -// props->getNode("controls/lighting/landing-lights")->unalias(); + props->untie("controls/gear/gear-down"); + props->getNode("controls/lighting/landing-lights")->unalias(); } @@ -384,4 +383,8 @@ void FGAIAircraft::ProcessFlightPlan( double dt ) { } - +bool FGAIAircraft::_getGearDown() const { + return ((props->getFloatValue("position/altitude-agl-ft") < 900.0) + && (props->getFloatValue("velocities/airspeed-kt") + < performance->land_speed*1.25)); +} diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index bcacae266..33cf99e5e 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -83,6 +83,8 @@ private: void Run(double dt); double sign(double x); + + bool _getGearDown() const; }; diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index e69602253..9757c5d54 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -124,7 +124,8 @@ bool FGAIBase::isa( object_type otype ) { void FGAIBase::bind() { - props->tie("id", SGRawValuePointer(&id)); + props->tie("id", SGRawValueMethods(*this, + &FGAIBase::_getID)); props->tie("velocities/true-airspeed-kt", SGRawValuePointer(&speed)); props->tie("velocities/vertical-speed-fps", SGRawValueMethods(*this, @@ -313,3 +314,6 @@ bool FGAIBase::_isNight() { return (fgGetFloat("/sim/time/sun-angle-rad") > 1.57); } +int FGAIBase::_getID() const { + return (int)(this); +} diff --git a/src/AIModel/AIBase.hxx b/src/AIModel/AIBase.hxx index 90c3a4b6d..071abe788 100644 --- a/src/AIModel/AIBase.hxx +++ b/src/AIModel/AIBase.hxx @@ -91,8 +91,7 @@ public: void setLongitude( double longitude ); void setBank( double bank ); - void setID( int ID ); - int getID(); + void* getID(); void setDie( bool die ); bool getDie(); @@ -139,7 +138,6 @@ protected: ssgBranch * model; //The 3D model object SGModelPlacement aip; bool delete_me; - int id; bool invisible; bool no_roll; double life; @@ -179,6 +177,8 @@ public: double _getY_shift() const; double _getRotation() const; + int _getID() const; + inline double _getRange() { return range; }; static bool _isNight(); @@ -217,10 +217,9 @@ inline void FGAIBase::setLatitude ( double latitude ) { inline void FGAIBase::setDie( bool die ) { delete_me = die; } inline bool FGAIBase::getDie() { return delete_me; } -inline void FGAIBase::setID( int ID ) { id = ID; } -inline int FGAIBase::getID() { return id; } - inline FGAIBase::object_type FGAIBase::getType() { return _otype; } +inline void* FGAIBase::getID() { return this; } + #endif // _FG_AIBASE_HXX diff --git a/src/AIModel/AIManager.cxx b/src/AIModel/AIManager.cxx index 0c8b1c028..97769619c 100644 --- a/src/AIModel/AIManager.cxx +++ b/src/AIModel/AIManager.cxx @@ -42,7 +42,6 @@ FGAIManager::FGAIManager() { dt_count = 9; scenario_filename = ""; ai_list.clear(); - ids.clear(); } FGAIManager::~FGAIManager() { @@ -52,7 +51,6 @@ FGAIManager::~FGAIManager() { ++ai_list_itr; } ai_list.clear(); - ids.clear(); } @@ -97,7 +95,6 @@ void FGAIManager::update(double dt) { ai_list_itr = ai_list.begin(); while(ai_list_itr != ai_list.end()) { if ((*ai_list_itr)->getDie()) { - freeID((*ai_list_itr)->getID()); delete (*ai_list_itr); --numObjects[(*ai_list_itr)->getType()]; --numObjects[0]; @@ -123,45 +120,11 @@ void FGAIManager::update(double dt) { } -// This function returns the next available ID -int FGAIManager::assignID() { - int maxint = 30000; - int x; - bool used; - for (x=1; xsetID( assignID() ); ++numObjects[0]; ++numObjects[FGAIBase::otAircraft]; if (entity->m_class == "light") { @@ -192,14 +155,14 @@ int FGAIManager::createAircraft( FGAIModelEntity *entity ) { ai_plane->init(); ai_plane->bind(); - return ai_plane->getID(); + return ai_plane; } -int FGAIManager::createShip( FGAIModelEntity *entity ) { +void* +FGAIManager::createShip( FGAIModelEntity *entity ) { FGAIShip* ai_ship = new FGAIShip(this); ai_list.push_back(ai_ship); - ai_ship->setID( assignID() ); ++numObjects[0]; ++numObjects[FGAIBase::otShip]; ai_ship->setHeading(entity->heading); @@ -216,14 +179,14 @@ int FGAIManager::createShip( FGAIModelEntity *entity ) { ai_ship->init(); ai_ship->bind(); - return ai_ship->getID(); + return ai_ship; } -int FGAIManager::createBallistic( FGAIModelEntity *entity ) { +void* +FGAIManager::createBallistic( FGAIModelEntity *entity ) { FGAIBallistic* ai_ballistic = new FGAIBallistic(this); ai_list.push_back(ai_ballistic); - ai_ballistic->setID( assignID() ); ++numObjects[0]; ++numObjects[FGAIBase::otBallistic]; ai_ballistic->setAzimuth(entity->azimuth); @@ -241,14 +204,14 @@ int FGAIManager::createBallistic( FGAIModelEntity *entity ) { ai_ballistic->setWind(entity->wind); ai_ballistic->init(); ai_ballistic->bind(); - return ai_ballistic->getID(); + return ai_ballistic; } -int FGAIManager::createStorm( FGAIModelEntity *entity ) { +void* +FGAIManager::createStorm( FGAIModelEntity *entity ) { FGAIStorm* ai_storm = new FGAIStorm(this); ai_list.push_back(ai_storm); - ai_storm->setID( assignID() ); ++numObjects[0]; ++numObjects[FGAIBase::otStorm]; ai_storm->setHeading(entity->heading); @@ -259,14 +222,14 @@ int FGAIManager::createStorm( FGAIModelEntity *entity ) { ai_storm->setLatitude(entity->latitude); ai_storm->init(); ai_storm->bind(); - return ai_storm->getID(); + return ai_storm; } -int FGAIManager::createThermal( FGAIModelEntity *entity ) { +void* +FGAIManager::createThermal( FGAIModelEntity *entity ) { FGAIThermal* ai_thermal = new FGAIThermal(this); ai_list.push_back(ai_thermal); - ai_thermal->setID( assignID() ); ++numObjects[0]; ++numObjects[FGAIBase::otThermal]; ai_thermal->setLongitude(entity->longitude); @@ -275,20 +238,19 @@ int FGAIManager::createThermal( FGAIModelEntity *entity ) { ai_thermal->setDiameter(entity->diameter / 6076.11549); ai_thermal->init(); ai_thermal->bind(); - return ai_thermal->getID(); + return ai_thermal; } -void FGAIManager::destroyObject( int ID ) { +void FGAIManager::destroyObject( void* ID ) { ai_list_itr = ai_list.begin(); while(ai_list_itr != ai_list.end()) { if ((*ai_list_itr)->getID() == ID) { - freeID( ID ); --numObjects[0]; --numObjects[(*ai_list_itr)->getType()]; delete (*ai_list_itr); ai_list.erase(ai_list_itr); - --ai_list_itr; - return; + + break; } ++ai_list_itr; } @@ -353,7 +315,3 @@ void FGAIManager::processScenario( string filename ) { delete s; } -int FGAIManager::getNum( FGAIBase::object_type ot ) { - return numObjects[ot]; -} - diff --git a/src/AIModel/AIManager.hxx b/src/AIModel/AIManager.hxx index 560e82e79..fd3357f5b 100644 --- a/src/AIModel/AIManager.hxx +++ b/src/AIModel/AIManager.hxx @@ -52,11 +52,6 @@ private: ai_list_type ai_list; ai_list_iterator ai_list_itr; - // array of already-assigned ID's - typedef vector id_vector_type; - id_vector_type ids; - id_vector_type::iterator id_itr; - public: FGAIManager(); @@ -67,16 +62,13 @@ public: void unbind(); void update(double dt); - int assignID(); - void freeID(int ID); - - int createBallistic( FGAIModelEntity *entity ); - int createAircraft( FGAIModelEntity *entity ); - int createThermal( FGAIModelEntity *entity ); - int createStorm( FGAIModelEntity *entity ); - int createShip( FGAIModelEntity *entity ); + void* createBallistic( FGAIModelEntity *entity ); + void* createAircraft( FGAIModelEntity *entity ); + void* createThermal( FGAIModelEntity *entity ); + void* createStorm( FGAIModelEntity *entity ); + void* createShip( FGAIModelEntity *entity ); - void destroyObject( int ID ); + void destroyObject( void* ID ); inline double get_user_latitude() { return user_latitude; } inline double get_user_longitude() { return user_longitude; } @@ -86,8 +78,9 @@ public: inline double get_user_yaw() { return user_yaw; } inline double get_user_speed() {return user_speed; } + inline int getNum( FGAIBase::object_type ot ) { return numObjects[ot]; } + void processScenario( string filename ); - int getNum( FGAIBase::object_type ot); private: diff --git a/src/Systems/submodel.cxx b/src/Systems/submodel.cxx index f936b4d06..28b7bc61c 100644 --- a/src/Systems/submodel.cxx +++ b/src/Systems/submodel.cxx @@ -112,7 +112,7 @@ SubmodelSystem::release (submodel* sm, double dt) entity.wind_from_east = IC.wind_from_east; entity.wind_from_north = IC.wind_from_north; entity.wind = sm->wind; - int rval = ai->createBallistic( &entity ); + ai->createBallistic( &entity ); //cout << "Submodel created." << endl; if (sm->count > 0) (sm->count)--; diff --git a/src/Traffic/Schedule.hxx b/src/Traffic/Schedule.hxx index 689524a54..0664e36be 100644 --- a/src/Traffic/Schedule.hxx +++ b/src/Traffic/Schedule.hxx @@ -40,7 +40,7 @@ class FGAISchedule FGScheduledFlightVec flights; float lat; float lon; - int AIManagerRef; + void* AIManagerRef; bool firstRun; public: