]> git.mxchange.org Git - simgear.git/blob - simgear/scene/tgdb/vasi.hxx
Smarter vasi coloring.
[simgear.git] / simgear / scene / tgdb / vasi.hxx
1 // vasi.hxx -- a class to hold some critical vasi data
2 //
3 // Written by Curtis Olson, started December 2003.
4 //
5 // Copyright (C) 2003  Curtis L. Olson  - curt@flightgear.org
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 //
21 // $Id$
22
23
24 #ifndef _SG_VASI_HXX
25 #define _SG_VASI_HXX
26
27
28 #ifndef __cplusplus                                                          
29 # error This library requires C++
30 #endif                                   
31
32
33 #include <simgear/compiler.h>
34
35 #include STL_STRING
36 SG_USING_STD(string);
37
38 #include <plib/ssg.h>           // plib include
39
40 #include <simgear/math/sg_geodesy.hxx>
41
42
43 class SGVASIUserData : public ssgBase
44 {
45
46 private:
47
48     sgdVec3 abs_pos;
49     double alt_m;
50     ssgLeaf *leaf;
51
52 public:
53
54     SGVASIUserData( sgdVec3 pos_cart, ssgLeaf *l ) {
55         sgdCopyVec3( abs_pos, pos_cart );
56
57         double lat, lon;
58         sgCartToGeod( abs_pos, &lat, &lon, &alt_m );
59
60         leaf = l;
61     }
62
63     ~SGVASIUserData() {}
64
65     double get_alt_m() { return alt_m; }
66     double *get_abs_pos() { return abs_pos; }
67     int i;
68
69     // color the vasi/papi correctly based on angle
70     void set_color( float angle_deg ) {
71         int count = leaf->getNumColours();
72         double trans = 0.05;
73         double color = 1.0;
74         double ref;
75         float *entry;
76
77         if ( count == 12 ) {
78             // PAPI configuration
79
80             // papi D
81             ref = 3.5;
82             if ( angle_deg < ref - trans ) {
83                 color = 0.0;
84             } else if ( angle_deg < ref + trans ) {
85                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
86             } else {
87                 color = 1.0;
88             }
89             for ( i = 0; i < 3; ++i ) {
90                 entry = leaf->getColour( i );
91                 entry[1] = color;
92                 entry[2] = color;
93             }
94
95             // papi C
96             ref = 3.167;
97             if ( angle_deg < ref - trans ) {
98                 color = 0.0;
99             } else if ( angle_deg < ref + trans ) {
100                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
101             } else {
102                 color = 1.0;
103             }
104             for ( i = 3; i < 6; ++i ) {
105                 entry = leaf->getColour( i );
106                 entry[1] = color;
107                 entry[2] = color;
108             }
109
110             // papi B
111             ref = 2.833;
112             if ( angle_deg < ref - trans ) {
113                 color = 0.0;
114             } else if ( angle_deg < ref + trans ) {
115                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
116             } else {
117                 color = 1.0;
118             }
119             for ( i = 6; i < 9; ++i ) {
120                 entry = leaf->getColour( i );
121                 entry[1] = color;
122                 entry[2] = color;
123             }
124
125             // papi A
126             ref = 2.5;
127             if ( angle_deg < ref - trans ) {
128                 color = 0.0;
129             } else if ( angle_deg < ref + trans ) {
130                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
131             } else {
132                 color = 1.0;
133             }
134             for ( i = 9; i < 12; ++i ) {
135                 entry = leaf->getColour( i );
136                 entry[1] = color;
137                 entry[2] = color;
138             }
139         } else if ( count == 36 ) {
140             // probably vasi, first 18 are downwind bar (2.5 deg)
141             ref = 2.5;
142             if ( angle_deg < ref - trans ) {
143                 color = 0.0;
144             } else if ( angle_deg < ref + trans ) {
145                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
146             } else {
147                 color = 1.0;
148             }
149             for ( int i = 0; i < 18; ++i ) {
150                 entry = leaf->getColour( i );
151                 entry[1] = color;
152                 entry[2] = color;
153             }
154
155             // last 6 are upwind bar (3.0 deg)
156             ref = 3.0;
157             if ( angle_deg < ref - trans ) {
158                 color = 0.0;
159             } else if ( angle_deg < ref + trans ) {
160                 color = (ref + trans - angle_deg) * (1 / (2 * trans) );
161             } else {
162                 color = 1.0;
163             }
164             for ( int i = 18; i < 36; ++i ) {
165                 entry = leaf->getColour( i );
166                 entry[1] = color;
167                 entry[2] = color;
168             }
169         } else {
170             // fail safe
171             cout << "unknown vasi/papi configuration, count = " << count << endl;
172             for ( int i = 0; i < count; ++i ) {
173                 entry = leaf->getColour( i );
174                 entry[1] = color;
175                 entry[2] = color;
176             }
177         }
178     }
179 };
180
181
182 #endif // _SG_VASI_HXX