1 // FGAIWingman - FGAIBllistic-derived class creates an AI Wingman
3 // Written by Vivian Meazza, started February 2008.
4 // - vivian.meazza at lineone.net
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License as
8 // published by the Free Software Foundation; either version 2 of the
9 // License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #ifndef _FG_AIWINGMAN_HXX
21 #define _FG_AIWINGMAN_HXX
23 #include "AIBallistic.hxx"
25 #include "AIManager.hxx"
28 #include <simgear/sg_inlines.h>
29 #include <simgear/math/SGMath.hxx>
32 class FGAIWingman : public FGAIBallistic {
35 virtual ~FGAIWingman();
37 virtual void readFromScenario(SGPropertyNode* scFileNode);
39 virtual void unbind();
40 virtual const char* getTypeString(void) const { return "wingman"; }
42 bool init(bool search_in_AI_path=false);
46 virtual void reinit() { init(); }
47 virtual void update (double dt);
49 void formateToAC(double dt);
50 void Break(double dt);
54 double getDistanceToOffset() const;
55 double getElevToOffset() const;
57 double calcAngle(double rangeM, SGGeod pos1, SGGeod pos2);
58 double calcDistanceM(SGGeod pos1, SGGeod pos2) const;
64 double _break_angle; //degrees relative
65 double _coeff_hdg; //dimensionless coefficient
66 double _coeff_pch; //dimensionless coefficient
67 double _coeff_bnk; //dimensionless coefficient
68 double _coeff_spd; //dimensionless coefficient
70 SGPropertyNode_ptr user_WoW_node;
72 inline void setFormate(bool f);
73 inline void setTgtHdg(double hdg);
74 inline void setTgtSpd(double spd);
75 inline void setBrkHdg(double angle);
76 inline void setBrkAng(double angle);
77 inline void setCoeffHdg(double h);
78 inline void setCoeffPch(double p);
79 inline void setCoeffBnk(double r);
80 inline void setCoeffSpd(double s);
82 inline bool getFormate() const { return _formate_to_ac;}
84 inline double getTgtHdg() const { return tgt_heading;}
85 inline double getTgtSpd() const { return tgt_speed;}
86 inline double getBrkAng() const { return _break_angle;}
88 inline SGVec3d getCartInPos(SGGeod in_pos) const;
92 void FGAIWingman::setFormate(bool f) {
96 void FGAIWingman::setTgtHdg(double h) {
100 void FGAIWingman::setTgtSpd(double s) {
104 void FGAIWingman::setBrkHdg(double a){
105 tgt_heading = hdg + a ;
106 SG_NORMALIZE_RANGE(tgt_heading, 0.0, 360.0);
109 void FGAIWingman::setBrkAng(double a){
111 SG_NORMALIZE_RANGE(_break_angle, -180.0, 180.0);
114 void FGAIWingman::setCoeffHdg(double h){
118 void FGAIWingman::setCoeffPch(double p){
122 void FGAIWingman::setCoeffBnk(double b){
126 void FGAIWingman::setCoeffSpd(double s){
130 //bool FGAIWingman::getFormate() const {
131 // return _formate_to_ac;
134 //double FGAIWingman::getTgtHdg() const{
135 // return tgt_heading;
138 //double FGAIWingman::getTgtSpd() const{
142 //double FGAIWingman::getBrkAng() const{
143 // return _break_angle;
146 SGVec3d FGAIWingman::getCartInPos(SGGeod in_pos) const {
147 SGVec3d cartPos = SGVec3d::fromGeod(in_pos);
151 #endif // FG_AIWINGMAN_HXX