2004-10-28 08:33:55 +00:00
|
|
|
// FGAICarrier - AIShip-derived class creates an AI aircraft carrier
|
|
|
|
//
|
|
|
|
// Written by David Culp, started October 2004.
|
|
|
|
//
|
|
|
|
// Copyright (C) 2004 David P. Culp - davidculp2@comcast.net
|
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
#ifndef _FG_AICARRIER_HXX
|
|
|
|
#define _FG_AICARRIER_HXX
|
|
|
|
|
2004-11-26 10:24:48 +00:00
|
|
|
#include <string>
|
|
|
|
#include <list>
|
|
|
|
#include <plib/ssg.h>
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
|
|
|
SG_USING_STD(string);
|
|
|
|
SG_USING_STD(list);
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
#include "AIShip.hxx"
|
2005-08-16 09:37:23 +00:00
|
|
|
|
|
|
|
#include "AIManager.hxx"
|
|
|
|
#include "AIBase.hxx"
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
class FGAIManager;
|
2004-11-26 10:24:48 +00:00
|
|
|
class FGAICarrier;
|
|
|
|
|
|
|
|
class FGAICarrierHardware : public ssgBase {
|
|
|
|
public:
|
|
|
|
|
|
|
|
enum Type { Catapult, Wire, Solid };
|
|
|
|
|
|
|
|
FGAICarrier *carrier;
|
|
|
|
int id;
|
|
|
|
Type type;
|
|
|
|
|
|
|
|
static FGAICarrierHardware* newCatapult(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Catapult;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
static FGAICarrierHardware* newWire(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Wire;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
static FGAICarrierHardware* newSolid(FGAICarrier *c) {
|
|
|
|
FGAICarrierHardware* ch = new FGAICarrierHardware;
|
|
|
|
ch->carrier = c;
|
|
|
|
ch->type = Solid;
|
|
|
|
ch->id = unique_id++;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
static int unique_id;
|
|
|
|
};
|
2004-10-28 08:33:55 +00:00
|
|
|
|
|
|
|
class FGAICarrier : public FGAIShip {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
FGAICarrier(FGAIManager* mgr);
|
|
|
|
~FGAICarrier();
|
2004-11-26 10:24:48 +00:00
|
|
|
|
|
|
|
void setSolidObjects(const list<string>& solid_objects);
|
|
|
|
void setWireObjects(const list<string>& wire_objects);
|
|
|
|
void setCatapultObjects(const list<string>& catapult_objects);
|
Mathias Fröhlich:
I have introduced the posibility to start directly on the carrier.
With that patch you will have a --carrrier=id argument where id can either be
the pennant number configured in the nimitz scenario or the carriers name
also configured in the carriers scenario.
Additionaly you can use --parkpos=id to select different positions on the
carrier. They are also configured in the scenario file.
That includes the switch of the whole FGInterface class to make use of the
groundcache.
That means that an aircraft no longer uses the current elevation value from
the scenery class. It rather has its own local cache of the aircrafts
environment which is setup in the common_init method of FGInterface and
updated either manually by calling
FGInterface::get_groundlevel_m(lat, lon, alt_m);
or implicitly by calling the above method in the
FGInterface::_updateGeo*Position(lat, lon, alt);
methods.
A call get_groundlevel_m rebuilds the groundcache if the request is outside
the range of the cache.
Note that for the real usage of the groundcache including the correct
information about the movement of objects and the velocity information, you
still need to set up the groundcache in the usual way like YASim and JSBSim
currently does.
If you use the native interface, you will get only static objects correctly.
But for FDM's only using one single ground level for a whole step this is IMO
sufficient.
The AIManager gets a way to return the location of a object which is placed
wrt an AI Object. At the moment it only honours AICarriers for that.
That method is a static one, which loads the scenario file for that reason and
throws it away afterwards. This looked like the aprioriate way, because the
AIManager is initialized much later in flightgears bootstrap, and I did not
find an easy way to reorder that for my needs. Since this additional load is
very small and does only happen if such a relative location is required, I
think that this is ok.
Note that moving on the carrier will only work correctly for JSBSim and YASim,
but you should now be able to start and move on every not itself moving
object with any FDM.
2005-07-03 09:39:14 +00:00
|
|
|
void setParkingPositions(const list<ParkPosition>& p);
|
2005-03-19 09:57:18 +00:00
|
|
|
void setSign(const string& );
|
|
|
|
void setFlolsOffset(const Point3D& off);
|
2005-08-16 09:37:23 +00:00
|
|
|
void setTACANChannelID(const string &);
|
2004-11-26 10:24:48 +00:00
|
|
|
|
2005-10-25 13:49:55 +00:00
|
|
|
void getVelocityWrtEarth(sgdVec3& v, sgdVec3& omega, sgdVec3& pivot);
|
2004-11-30 12:34:11 +00:00
|
|
|
virtual void bind();
|
|
|
|
virtual void unbind();
|
2005-10-25 13:49:55 +00:00
|
|
|
void UpdateFlols ( const sgdMat3& trans );
|
2005-08-16 09:37:23 +00:00
|
|
|
void UpdateWind ( double dt );
|
|
|
|
void UpdateTACAN( double dt );
|
|
|
|
void setWind_from_east( double fps );
|
|
|
|
void setWind_from_north( double fps );
|
|
|
|
void setMaxLat( double deg );
|
|
|
|
void setMinLat( double deg );
|
|
|
|
void setMaxLong( double deg );
|
|
|
|
void setMinLong( double deg );
|
|
|
|
void TurnToLaunch();
|
|
|
|
void TurnToBase();
|
|
|
|
void ReturnToBox();
|
|
|
|
float Horizon(float h);
|
|
|
|
double TACAN_freq;
|
|
|
|
bool OutsideBox();
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
|
2004-11-26 10:24:48 +00:00
|
|
|
bool init();
|
|
|
|
|
Mathias Fröhlich:
I have introduced the posibility to start directly on the carrier.
With that patch you will have a --carrrier=id argument where id can either be
the pennant number configured in the nimitz scenario or the carriers name
also configured in the carriers scenario.
Additionaly you can use --parkpos=id to select different positions on the
carrier. They are also configured in the scenario file.
That includes the switch of the whole FGInterface class to make use of the
groundcache.
That means that an aircraft no longer uses the current elevation value from
the scenery class. It rather has its own local cache of the aircrafts
environment which is setup in the common_init method of FGInterface and
updated either manually by calling
FGInterface::get_groundlevel_m(lat, lon, alt_m);
or implicitly by calling the above method in the
FGInterface::_updateGeo*Position(lat, lon, alt);
methods.
A call get_groundlevel_m rebuilds the groundcache if the request is outside
the range of the cache.
Note that for the real usage of the groundcache including the correct
information about the movement of objects and the velocity information, you
still need to set up the groundcache in the usual way like YASim and JSBSim
currently does.
If you use the native interface, you will get only static objects correctly.
But for FDM's only using one single ground level for a whole step this is IMO
sufficient.
The AIManager gets a way to return the location of a object which is placed
wrt an AI Object. At the moment it only honours AICarriers for that.
That method is a static one, which loads the scenario file for that reason and
throws it away afterwards. This looked like the aprioriate way, because the
AIManager is initialized much later in flightgears bootstrap, and I did not
find an easy way to reorder that for my needs. Since this additional load is
very small and does only happen if such a relative location is required, I
think that this is ok.
Note that moving on the carrier will only work correctly for JSBSim and YASim,
but you should now be able to start and move on every not itself moving
object with any FDM.
2005-07-03 09:39:14 +00:00
|
|
|
bool getParkPosition(const string& id, Point3D& geodPos,
|
|
|
|
double& hdng, sgdVec3 uvw);
|
2005-03-19 09:57:18 +00:00
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
void update(double dt);
|
2004-11-26 10:24:48 +00:00
|
|
|
void mark_nohot(ssgEntity*);
|
2005-08-16 09:37:23 +00:00
|
|
|
|
2004-12-27 13:21:18 +00:00
|
|
|
bool mark_wires(ssgEntity*, const list<string>&, bool = false);
|
|
|
|
bool mark_cat(ssgEntity*, const list<string>&, bool = false);
|
|
|
|
bool mark_solid(ssgEntity*, const list<string>&, bool = false);
|
2005-08-16 09:37:23 +00:00
|
|
|
double wind_from_east; // fps
|
|
|
|
double wind_from_north; // fps
|
|
|
|
double rel_wind_speed_kts;
|
|
|
|
double rel_wind_from_deg;
|
|
|
|
|
2004-11-26 10:24:48 +00:00
|
|
|
|
|
|
|
list<string> solid_objects; // List of solid object names
|
|
|
|
list<string> wire_objects; // List of wire object names
|
|
|
|
list<string> catapult_objects; // List of catapult object names
|
Mathias Fröhlich:
I have introduced the posibility to start directly on the carrier.
With that patch you will have a --carrrier=id argument where id can either be
the pennant number configured in the nimitz scenario or the carriers name
also configured in the carriers scenario.
Additionaly you can use --parkpos=id to select different positions on the
carrier. They are also configured in the scenario file.
That includes the switch of the whole FGInterface class to make use of the
groundcache.
That means that an aircraft no longer uses the current elevation value from
the scenery class. It rather has its own local cache of the aircrafts
environment which is setup in the common_init method of FGInterface and
updated either manually by calling
FGInterface::get_groundlevel_m(lat, lon, alt_m);
or implicitly by calling the above method in the
FGInterface::_updateGeo*Position(lat, lon, alt);
methods.
A call get_groundlevel_m rebuilds the groundcache if the request is outside
the range of the cache.
Note that for the real usage of the groundcache including the correct
information about the movement of objects and the velocity information, you
still need to set up the groundcache in the usual way like YASim and JSBSim
currently does.
If you use the native interface, you will get only static objects correctly.
But for FDM's only using one single ground level for a whole step this is IMO
sufficient.
The AIManager gets a way to return the location of a object which is placed
wrt an AI Object. At the moment it only honours AICarriers for that.
That method is a static one, which loads the scenario file for that reason and
throws it away afterwards. This looked like the aprioriate way, because the
AIManager is initialized much later in flightgears bootstrap, and I did not
find an easy way to reorder that for my needs. Since this additional load is
very small and does only happen if such a relative location is required, I
think that this is ok.
Note that moving on the carrier will only work correctly for JSBSim and YASim,
but you should now be able to start and move on every not itself moving
object with any FDM.
2005-07-03 09:39:14 +00:00
|
|
|
list<ParkPosition> ppositions; // List of positions where an aircraft can start.
|
2005-03-19 09:57:18 +00:00
|
|
|
string sign; // The sign of this carrier.
|
2004-11-26 10:24:48 +00:00
|
|
|
|
|
|
|
// Velocity wrt earth.
|
2005-08-16 09:37:23 +00:00
|
|
|
sgdVec3 vel_wrt_earth;
|
|
|
|
sgdVec3 rot_wrt_earth;
|
|
|
|
sgdVec3 rot_pivot_wrt_earth;
|
|
|
|
|
2005-03-19 09:57:18 +00:00
|
|
|
|
|
|
|
// these describe the flols
|
|
|
|
Point3D flols_off;
|
2004-11-30 12:34:11 +00:00
|
|
|
|
2005-03-19 09:57:18 +00:00
|
|
|
double dist; // the distance of the eyepoint from the flols
|
|
|
|
double angle;
|
|
|
|
int source; // the flols light which is visible at the moment
|
2005-08-16 09:37:23 +00:00
|
|
|
bool wave_off_lights;
|
|
|
|
|
|
|
|
// these are for manoeuvring the carrier
|
|
|
|
Point3D carrierpos;
|
|
|
|
Point3D initialpos;
|
|
|
|
|
|
|
|
double wind_speed_from_north_kts ;
|
|
|
|
double wind_speed_from_east_kts ;
|
|
|
|
double wind_speed_kts; //true wind speed
|
|
|
|
double wind_from_deg; //true wind direction
|
|
|
|
double rel_wind;
|
|
|
|
double max_lat, min_lat, max_long, min_long;
|
|
|
|
double base_course, base_speed;
|
|
|
|
|
|
|
|
bool turn_to_launch_hdg;
|
|
|
|
bool returning; // set if the carrier is returning to an operating box
|
|
|
|
bool InToWind(); // set if the carrier is in to wind
|
|
|
|
SGPropertyNode_ptr _longitude_node;
|
|
|
|
SGPropertyNode_ptr _latitude_node;
|
|
|
|
SGPropertyNode_ptr _altitude_node;
|
|
|
|
SGPropertyNode_ptr _surface_wind_from_deg_node;
|
|
|
|
SGPropertyNode_ptr _surface_wind_speed_node;
|
|
|
|
|
|
|
|
// these are for TACAN
|
|
|
|
SGPropertyNode_ptr _dme_freq_node;
|
|
|
|
|
|
|
|
double bearing, az2, range;
|
|
|
|
string TACAN_channel_id;
|
|
|
|
|
|
|
|
|
2004-10-28 08:33:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _FG_AICARRIER_HXX
|