]> git.mxchange.org Git - flightgear.git/blob - src/AIModel/AIWingman.hxx
Merge branch 'next' of D:\Git_New\flightgear into next
[flightgear.git] / src / AIModel / AIWingman.hxx
1 // FGAIWingman - FGAIBllistic-derived class creates an AI Wingman
2 //
3 // Written by Vivian Meazza, started February 2008.
4 // - vivian.meazza at lineone.net
5 //
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.
10 //
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.
15 //
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.
19
20 #ifndef _FG_AIWINGMAN_HXX
21 #define _FG_AIWINGMAN_HXX
22
23 #include "AIBallistic.hxx"
24
25 #include "AIManager.hxx"
26 #include "AIBase.hxx"
27
28 #include <simgear/sg_inlines.h>
29 #include <simgear/math/SGMath.hxx>
30
31
32 class FGAIWingman : public FGAIBallistic {
33 public:
34     FGAIWingman();
35     virtual ~FGAIWingman();
36
37     virtual void readFromScenario(SGPropertyNode* scFileNode);
38     virtual void bind();
39     virtual void unbind();
40     virtual const char* getTypeString(void) const { return "wingman"; }
41
42     bool init(bool search_in_AI_path=false);
43
44 private:
45
46     virtual void reinit() { init(); }
47     virtual void update (double dt);
48
49     void formateToAC(double dt);
50     void Break(double dt);
51     void Join(double dt);
52     void Run(double dt);
53
54     double getDistanceToOffset() const;
55     double getElevToOffset() const;
56
57     double calcAngle(double rangeM, SGGeod pos1, SGGeod pos2);
58     double calcDistanceM(SGGeod pos1, SGGeod pos2) const;
59
60     bool   _formate_to_ac;
61     bool   _break;
62     bool   _join;
63
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
69
70     SGPropertyNode_ptr user_WoW_node;
71
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);
81
82     inline bool getFormate() const { return _formate_to_ac;}
83
84     inline double getTgtHdg() const { return tgt_heading;}
85     inline double getTgtSpd() const { return tgt_speed;}
86     inline double getBrkAng() const { return _break_angle;}
87
88     inline SGVec3d getCartInPos(SGGeod in_pos) const;
89
90 };
91
92 void FGAIWingman::setFormate(bool f) {
93     _formate_to_ac = f;
94 }
95
96 void FGAIWingman::setTgtHdg(double h) {
97     tgt_heading = h;
98 }
99
100 void FGAIWingman::setTgtSpd(double s) {
101     tgt_speed = s;
102 }
103
104 void FGAIWingman::setBrkHdg(double a){
105     tgt_heading = hdg + a ;
106     SG_NORMALIZE_RANGE(tgt_heading, 0.0, 360.0);
107 }
108
109 void FGAIWingman::setBrkAng(double a){
110     _break_angle = a ;
111     SG_NORMALIZE_RANGE(_break_angle, -180.0, 180.0);
112 }
113
114 void FGAIWingman::setCoeffHdg(double h){
115     _coeff_hdg = h;
116 }
117
118 void FGAIWingman::setCoeffPch(double p){
119     _coeff_pch = p;
120 }
121
122 void FGAIWingman::setCoeffBnk(double b){
123     _coeff_bnk = b;
124 }
125
126 void FGAIWingman::setCoeffSpd(double s){
127     _coeff_spd = s;
128 }
129
130 //bool FGAIWingman::getFormate() const {
131 //    return _formate_to_ac;
132 //}
133
134 //double FGAIWingman::getTgtHdg() const{
135 //    return tgt_heading;
136 //}
137
138 //double FGAIWingman::getTgtSpd() const{
139 //    return tgt_speed;
140 //}
141
142 //double FGAIWingman::getBrkAng() const{
143 //    return _break_angle;
144 //}
145
146 SGVec3d FGAIWingman::getCartInPos(SGGeod in_pos) const {
147     SGVec3d cartPos = SGVec3d::fromGeod(in_pos);
148     return cartPos;
149 }
150
151 #endif  // FG_AIWINGMAN_HXX