First stab at code changes to support the X-Plane data format directly.
This commit is contained in:
parent
86d985a131
commit
27cfc32e4e
6 changed files with 310 additions and 341 deletions
|
@ -29,6 +29,7 @@
|
|||
|
||||
#include <simgear/compiler.h>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/misc/strutils.hxx>
|
||||
#include <simgear/structure/exception.hxx>
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -236,82 +237,89 @@ static void build_runway( const TGRunway& rwy_info,
|
|||
TGPolygon *apt_base,
|
||||
TGPolygon *apt_clearing )
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "surface flags = " << rwy_info.surface_flags);
|
||||
string surface_flag = rwy_info.surface_flags.substr(1, 1);
|
||||
string light_flag = rwy_info.surface_flags.substr(2, 1);
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "surface flag = " << surface_flag);
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "surface code = " << rwy_info.surface_code);
|
||||
int surface_code = rwy_info.surface_code;
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "surface code = " << surface_code);
|
||||
string lighting_flags = rwy_info.lighting_flags;
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "lighting flags = " << lighting_flags);
|
||||
|
||||
string vasi1 = lighting_flags.substr(0,1);
|
||||
string rwylt1 = lighting_flags.substr(1,1);
|
||||
string apprch1 = lighting_flags.substr(2,1);
|
||||
string vasi2 = lighting_flags.substr(3,1);
|
||||
string rwylt2 = lighting_flags.substr(4,1);
|
||||
string apprch2 = lighting_flags.substr(5,1);
|
||||
|
||||
string material;
|
||||
if ( surface_flag == "A" ) {
|
||||
if ( surface_code == 1 /* Asphalt */ ) {
|
||||
if ( !rwy_info.really_taxiway ) {
|
||||
material = "pa_"; // asphalt
|
||||
material = "pa_";
|
||||
} else {
|
||||
if ( rwy_info.width <= 150 && light_flag == "B" )
|
||||
if ( rwy_info.width <= 150 && rwylt1 == "6" ) {
|
||||
material = "pa_taxiway";
|
||||
else
|
||||
} else {
|
||||
material = "pa_tiedown";
|
||||
}
|
||||
} else if ( surface_flag == "C" ) {
|
||||
}
|
||||
} else if ( surface_code == 2 /* Concrete */ ) {
|
||||
if ( !rwy_info.really_taxiway ) {
|
||||
material = "pc_"; // concrete
|
||||
material = "pc_";
|
||||
} else {
|
||||
if ( rwy_info.width <= 150 && light_flag == "B" )
|
||||
if ( rwy_info.width <= 150 && rwylt1 == "6" ) {
|
||||
material = "pc_taxiway";
|
||||
else
|
||||
} else {
|
||||
material = "pc_tiedown";
|
||||
}
|
||||
} else if ( surface_flag == "D" ) {
|
||||
material = "dirt_rwy";
|
||||
} else if ( surface_flag == "G" ) {
|
||||
}
|
||||
} else if ( surface_code == 3 /* Turf/Grass */ ) {
|
||||
material = "grass_rwy";
|
||||
} else if ( surface_flag == "L" ) {
|
||||
} else if ( surface_code == 4 /* Dirt */
|
||||
|| surface_code == 5 /* Gravel */ ) {
|
||||
material = "dirt_rwy";
|
||||
} else if ( surface_code == 12 /* Dry Lakebed */ ) {
|
||||
if ( rwy_info.really_taxiway ) {
|
||||
material = "lakebed_taxiway";
|
||||
} else {
|
||||
material = "dirt_rwy";
|
||||
}
|
||||
} else if ( surface_flag == "T" ) {
|
||||
material = "grass_rwy";
|
||||
} else if ( surface_flag == "W" ) {
|
||||
// water ???
|
||||
} else if ( surface_code == 13 /* Water runway (buoy's?) */ ) {
|
||||
// water
|
||||
} else {
|
||||
throw sg_exception("unknown runway type!");
|
||||
}
|
||||
|
||||
|
||||
string type_flag = rwy_info.surface_flags.substr(2, 1);
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "type flag = " << type_flag);
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "marking code = " << rwy_info.marking_code);
|
||||
|
||||
if ( rwy_info.really_taxiway ) {
|
||||
gen_taxiway( rwy_info, alt_m, material,
|
||||
rwy_polys, texparams, accum );
|
||||
} else if ( surface_flag == "D" || surface_flag == "G" ||
|
||||
surface_flag == "T" )
|
||||
} else if ( surface_code == 3 /* Turf/Grass */
|
||||
|| surface_code == 4 /* Dirt */
|
||||
|| surface_code == 5 /* Gravel */ )
|
||||
{
|
||||
gen_simple_rwy( rwy_info, alt_m, material,
|
||||
rwy_polys, texparams, accum );
|
||||
} else if ( type_flag == "P" ) {
|
||||
} else if ( rwy_info.marking_code == 3 /* Precision */ ) {
|
||||
// precision runway markings
|
||||
gen_precision_rwy( rwy_info, alt_m, material,
|
||||
rwy_polys, texparams, accum );
|
||||
} else if ( type_flag == "R" ) {
|
||||
} else if ( rwy_info.marking_code == 2 /* Non-precision */ ) {
|
||||
// non-precision runway markings
|
||||
gen_non_precision_rwy( rwy_info, alt_m, material,
|
||||
rwy_polys, texparams, accum );
|
||||
} else if ( type_flag == "V" ) {
|
||||
} else if ( rwy_info.marking_code == 1 /* Visual */ ) {
|
||||
// visual runway markings
|
||||
gen_visual_rwy( rwy_info, alt_m, material,
|
||||
rwy_polys, texparams, accum );
|
||||
} else if ( type_flag == "B" ) {
|
||||
// bouys (sea plane base)
|
||||
// do nothing for now.
|
||||
} else if ( type_flag == "H" ) {
|
||||
// helipad
|
||||
} else if ( surface_code == 13 /* Water buoys */ ) {
|
||||
// do nothing for now.
|
||||
} else {
|
||||
// unknown runway code ... hehe, I know, let's just die
|
||||
// right here so the programmer has to fix his code if a
|
||||
// new code ever gets introduced. :-)
|
||||
SG_LOG( SG_GENERAL, SG_ALERT, "Unknown runway code = " <<
|
||||
rwy_info.marking_code );
|
||||
throw sg_exception("Unknown runway code in build.cxx:build_airport()");
|
||||
}
|
||||
|
||||
|
@ -337,7 +345,6 @@ static void build_runway( const TGRunway& rwy_info,
|
|||
// build 3d airport
|
||||
void build_airport( string airport_id, float alt_m,
|
||||
string_list& runways_raw,
|
||||
string_list& taxiways_raw,
|
||||
string_list& beacons_raw,
|
||||
string_list& towers_raw,
|
||||
string_list& windsocks_raw,
|
||||
|
@ -365,81 +372,74 @@ void build_airport( string airport_id, float alt_m,
|
|||
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Building " << airport_id );
|
||||
|
||||
// parse runways and generate the vertex list
|
||||
runway_list runways;
|
||||
runways.clear();
|
||||
string rwy_str;
|
||||
// parse runways/taxiways and generate the vertex list
|
||||
runway_list runways; runways.clear();
|
||||
runway_list taxiways; taxiways.clear();
|
||||
|
||||
for ( i = 0; i < (int)runways_raw.size(); ++i ) {
|
||||
++rwy_count;
|
||||
|
||||
rwy_str = runways_raw[i];
|
||||
string rwy_str = runways_raw[i];
|
||||
vector<string> token = simgear::strutils::split( rwy_str );
|
||||
|
||||
TGRunway rwy;
|
||||
|
||||
rwy.really_taxiway = false;
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, rwy_str);
|
||||
rwy.rwy_no = rwy_str.substr(7, 4);
|
||||
rwy.rwy_no = token[3];
|
||||
rwy.really_taxiway = (rwy.rwy_no == "xxx");
|
||||
|
||||
string rwy_lat = rwy_str.substr(11, 10);
|
||||
rwy.lat = atof( rwy_lat.c_str() );
|
||||
rwy.lat = atof( token[1].c_str() );
|
||||
apt_lat += rwy.lat;
|
||||
|
||||
string rwy_lon = rwy_str.substr(22, 11);
|
||||
rwy.lon = atof( rwy_lon.c_str() );
|
||||
rwy.lon = atof( token[2].c_str() );
|
||||
apt_lon += rwy.lon;
|
||||
|
||||
string rwy_hdg = rwy_str.substr(34, 6);
|
||||
rwy.heading = atof( rwy_hdg.c_str() );
|
||||
rwy.heading = atof( token[4].c_str() );
|
||||
|
||||
string rwy_len = rwy_str.substr(41, 5);
|
||||
rwy.length = atoi( rwy_len.c_str() );
|
||||
rwy.length = atoi( token[5].c_str() );
|
||||
rwy.width = atoi( token[8].c_str() );
|
||||
|
||||
string rwy_width = rwy_str.substr(47, 5);
|
||||
rwy.width = atoi( rwy_width.c_str() );
|
||||
string rwy_displ_threshold = token[6];
|
||||
vector<string> displ
|
||||
= simgear::strutils::split( rwy_displ_threshold, "." );
|
||||
rwy.disp_thresh1 = atoi( displ[0].c_str() );
|
||||
rwy.disp_thresh2 = atoi( displ[1].c_str() );
|
||||
|
||||
rwy.surface_flags = rwy_str.substr(53, 5);
|
||||
string rwy_stopway = token[7];
|
||||
vector<string> stop
|
||||
= simgear::strutils::split( rwy_stopway, "." );
|
||||
rwy.stopway1 = atoi( stop[0].c_str() );
|
||||
rwy.stopway2 = atoi( stop[1].c_str() );
|
||||
|
||||
rwy.end1_flags = rwy_str.substr(59, 4);
|
||||
|
||||
string rwy_disp_threshold1 = rwy_str.substr(64, 4);
|
||||
rwy.disp_thresh1 = atoi( rwy_disp_threshold1.c_str() );
|
||||
|
||||
string rwy_stopway1 = rwy_str.substr(69, 4);
|
||||
rwy.stopway1 = atoi( rwy_stopway1.c_str() );
|
||||
|
||||
rwy.end2_flags = rwy_str.substr(74, 4);
|
||||
|
||||
string rwy_disp_threshold2 = rwy_str.substr(79, 4);
|
||||
rwy.disp_thresh2 = atoi( rwy_disp_threshold2.c_str() );
|
||||
|
||||
string rwy_stopway2 = rwy_str.substr(83, 4);
|
||||
rwy.stopway2 = atoi( rwy_stopway2.c_str() );
|
||||
rwy.lighting_flags = token[9];
|
||||
rwy.surface_code = atoi( token[10].c_str() );
|
||||
rwy.shoulder_code = token[11];
|
||||
rwy.marking_code = atoi( token[12].c_str() );
|
||||
rwy.smoothness = atof( token[13].c_str() );
|
||||
rwy.dist_remaining = (atoi( token[14].c_str() ) == 1 );
|
||||
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " no = " << rwy.rwy_no);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lat = " << rwy_lat << " " << rwy.lat);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lon = " << rwy_lon << " " << rwy.lon);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " hdg = " << rwy_hdg << " "
|
||||
<< rwy.heading);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " len = " << rwy_len << " "
|
||||
<< rwy.length);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << rwy_width << " "
|
||||
<< rwy.width);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " sfc = " << rwy.surface_flags);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " end1 = " << rwy.end1_flags);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " dspth1= " << rwy_disp_threshold1
|
||||
<< " " << rwy.disp_thresh1);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " stop1 = " << rwy_stopway1 << " "
|
||||
<< rwy.stopway1);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " end2 = " << rwy.end2_flags);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " dspth2= " << rwy_disp_threshold2
|
||||
<< " " << rwy.disp_thresh2);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " stop2 = " << rwy_stopway2 << " "
|
||||
<< rwy.stopway2);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lat = " << rwy.lat);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lon = " << rwy.lon);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " hdg = " << rwy.heading);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " len = " << rwy.length);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << rwy.width);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lighting = " << rwy.lighting_flags);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " sfc = " << rwy.surface_code);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " mrkgs = " << rwy.marking_code);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " dspth1= " << rwy.disp_thresh1);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " stop1 = " << rwy.stopway1);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " dspth2= " << rwy.disp_thresh2);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " stop2 = " << rwy.stopway2);
|
||||
|
||||
if ( rwy.really_taxiway ) {
|
||||
taxiways.push_back( rwy );
|
||||
} else {
|
||||
runways.push_back( rwy );
|
||||
}
|
||||
}
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Runway count = " << runways.size() );
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Taxiway count = " << taxiways.size() );
|
||||
|
||||
SGBucket b( apt_lon / (double)rwy_count, apt_lat / (double)rwy_count );
|
||||
SG_LOG(SG_GENERAL, SG_INFO, b.gen_base_path() << "/" << b.gen_index_str());
|
||||
|
@ -447,52 +447,6 @@ void build_airport( string airport_id, float alt_m,
|
|||
b.get_center_lat() * SGD_DEGREES_TO_RADIANS, 0 );
|
||||
Point3D gbs_center = sgGeodToCart( center_geod );
|
||||
|
||||
// parse taxiways and generate the vertex list
|
||||
runway_list taxiways;
|
||||
taxiways.clear();
|
||||
|
||||
for ( i = 0; i < (int)taxiways_raw.size(); ++i ) {
|
||||
string taxi_str = taxiways_raw[i];
|
||||
|
||||
TGRunway taxi;
|
||||
|
||||
taxi.really_taxiway = true;
|
||||
taxi.generated = false;
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_INFO, taxi_str);
|
||||
|
||||
string taxi_lat = taxi_str.substr(11, 10);
|
||||
taxi.lat = atof( taxi_lat.c_str() );
|
||||
|
||||
string taxi_lon = taxi_str.substr(22, 11);
|
||||
taxi.lon = atof( taxi_lon.c_str() );
|
||||
|
||||
string taxi_hdg = taxi_str.substr(34, 6);
|
||||
taxi.heading = atof( taxi_hdg.c_str() );
|
||||
|
||||
string taxi_len = taxi_str.substr(41, 5);
|
||||
taxi.length = atoi( taxi_len.c_str() );
|
||||
|
||||
string taxi_width = taxi_str.substr(47, 5);
|
||||
taxi.width = atoi( taxi_width.c_str() );
|
||||
|
||||
taxi.surface_flags = taxi_str.substr(53, 5);
|
||||
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lat = " << taxi_lat << " "
|
||||
<< taxi.lat);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " lon = " << taxi_lon << " "
|
||||
<< taxi.lon);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " hdg = " << taxi_hdg << " "
|
||||
<< taxi.heading);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " len = " << taxi_len << " "
|
||||
<< taxi.length);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << taxi_width << " "
|
||||
<< taxi.width);
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, " sfc = " << taxi.surface_flags);
|
||||
|
||||
taxiways.push_back( taxi );
|
||||
}
|
||||
|
||||
point_list beacons; beacons.clear();
|
||||
for ( i = 0; i < (int)beacons_raw.size(); ++i ) {
|
||||
string beacon_str = beacons_raw[i];
|
||||
|
@ -568,8 +522,7 @@ void build_airport( string airport_id, float alt_m,
|
|||
// First pass: generate the precision runways since these have
|
||||
// precidence
|
||||
for ( i = 0; i < (int)runways.size(); ++i ) {
|
||||
string type_flag = runways[i].surface_flags.substr(2, 1);
|
||||
if ( type_flag == "P" ) {
|
||||
if ( runways[i].marking_code == 3 /* Precision */ ) {
|
||||
build_runway( runways[i], alt_m,
|
||||
&rwy_polys, &texparams, &accum,
|
||||
&apt_base, &apt_clearing );
|
||||
|
@ -578,10 +531,10 @@ void build_airport( string airport_id, float alt_m,
|
|||
|
||||
// 2nd pass: generate the non-precision and visual runways
|
||||
for ( i = 0; i < (int)runways.size(); ++i ) {
|
||||
string type_flag = runways[i].surface_flags.substr(2, 1);
|
||||
string surface_flag = runways[i].surface_flags.substr(1, 1);
|
||||
if ( type_flag == "R" || type_flag == "V" ) {
|
||||
if ( surface_flag != "W" ) {
|
||||
if ( runways[i].marking_code == 2 /* Non-precision */
|
||||
|| runways[i].marking_code == 1 /* Visual */ )
|
||||
{
|
||||
if ( runways[i].surface_code != 13 /* Water */ ) {
|
||||
// only build non-water runways
|
||||
build_runway( runways[i], alt_m,
|
||||
&rwy_polys, &texparams, &accum,
|
||||
|
@ -592,11 +545,11 @@ void build_airport( string airport_id, float alt_m,
|
|||
|
||||
// 3rd pass: generate all remaining runways not covered in the first pass
|
||||
for ( i = 0; i < (int)runways.size(); ++i ) {
|
||||
string type_flag = runways[i].surface_flags.substr(2, 1);
|
||||
string surface_flag = runways[i].surface_flags.substr(1, 1);
|
||||
if ( type_flag != string("P") && type_flag != string("R")
|
||||
&& type_flag != string("V") ) {
|
||||
if ( surface_flag != "W" ) {
|
||||
if ( runways[i].marking_code != 3 /* Precision */
|
||||
&& runways[i].marking_code != 2 /* Non-precision */
|
||||
&& runways[i].marking_code != 1 /* Visual */ )
|
||||
{
|
||||
if ( runways[i].surface_code != 13 ) {
|
||||
// only build non-water runways
|
||||
build_runway( runways[i], alt_m,
|
||||
&rwy_polys, &texparams, &accum,
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
// build 3d airport
|
||||
void build_airport( string airport_id, float alt_m,
|
||||
string_list& runways_raw,
|
||||
string_list& taxiways_raw,
|
||||
string_list& beacons_raw,
|
||||
string_list& towers_raw,
|
||||
string_list& windsocks_raw,
|
||||
|
|
|
@ -85,7 +85,7 @@ static Point3D gen_runway_light_vector( const TGRunway& rwy_info,
|
|||
// generate runway edge lighting
|
||||
// 60 meters spacing or the next number down that divides evenly.
|
||||
static superpoly_list gen_runway_edge_lights( const TGRunway& rwy_info,
|
||||
const string& kind, bool recip )
|
||||
const int kind, bool recip )
|
||||
{
|
||||
point_list w_lights; w_lights.clear();
|
||||
point_list y_lights; y_lights.clear();
|
||||
|
@ -160,13 +160,12 @@ static superpoly_list gen_runway_edge_lights( const TGRunway& rwy_info,
|
|||
TGSuperPoly white;
|
||||
white.set_poly( lights_poly );
|
||||
white.set_normals( normals_poly );
|
||||
if ( kind == "H" ) {
|
||||
white.set_material( "RWY_WHITE_LIGHTS" );
|
||||
} else if ( kind == "M" ) {
|
||||
white.set_material( "RWY_WHITE_MEDIUM_LIGHTS" );
|
||||
} else if ( kind == "L" ) {
|
||||
white.set_material( "RWY_WHITE_LOW_LIGHTS" );
|
||||
}
|
||||
/* other intensities for when the data file supports it
|
||||
*
|
||||
* white.set_material( "RWY_WHITE_MEDIUM_LIGHTS" );
|
||||
* white.set_material( "RWY_WHITE_LOW_LIGHTS" );
|
||||
*/
|
||||
|
||||
lights_poly.erase();
|
||||
normals_poly.erase();
|
||||
|
@ -176,13 +175,12 @@ static superpoly_list gen_runway_edge_lights( const TGRunway& rwy_info,
|
|||
TGSuperPoly yellow;
|
||||
yellow.set_poly( lights_poly );
|
||||
yellow.set_normals( normals_poly );
|
||||
if ( kind == "H" ) {
|
||||
yellow.set_material( "RWY_YELLOW_LIGHTS" );
|
||||
} else if ( kind == "M" ) {
|
||||
yellow.set_material( "RWY_YELLOW_MEDIUM_LIGHTS" );
|
||||
} else if ( kind == "L" ) {
|
||||
yellow.set_material( "RWY_YELLOW_LOW_LIGHTS" );
|
||||
}
|
||||
/* other intensities for when the data file supports it
|
||||
*
|
||||
* yellow.set_material( "RWY_YELLOW_MEDIUM_LIGHTS" );
|
||||
* yellow.set_material( "RWY_YELLOW_LOW_LIGHTS" );
|
||||
*/
|
||||
|
||||
superpoly_list result; result.clear();
|
||||
|
||||
|
@ -196,7 +194,7 @@ static superpoly_list gen_runway_edge_lights( const TGRunway& rwy_info,
|
|||
// generate taxiway edge lighting
|
||||
// 100 meters spacing or the next number down that divides evenly.
|
||||
static superpoly_list gen_taxiway_edge_lights( const TGRunway& rwy_info,
|
||||
const string& kind, bool recip )
|
||||
const int kind, bool recip )
|
||||
{
|
||||
point_list b_lights; b_lights.clear();
|
||||
point_list b_normals; b_normals.clear();
|
||||
|
@ -279,7 +277,7 @@ static superpoly_list gen_taxiway_edge_lights( const TGRunway& rwy_info,
|
|||
|
||||
// generate threshold lights for a 3 degree approach
|
||||
static superpoly_list gen_runway_threshold_lights( const TGRunway& rwy_info,
|
||||
const string& kind,
|
||||
const int kind,
|
||||
float alt_m, bool recip )
|
||||
{
|
||||
point_list g_lights; g_lights.clear();
|
||||
|
@ -369,17 +367,11 @@ static superpoly_list gen_runway_threshold_lights( const TGRunway& rwy_info,
|
|||
green.set_poly( lights_poly );
|
||||
green.set_normals( normals_poly );
|
||||
green.set_material( "RWY_GREEN_LIGHTS" );
|
||||
if ( kind == "H" ) {
|
||||
green.set_material( "RWY_GREEN_LIGHTS" );
|
||||
} else if ( kind == "M" ) {
|
||||
green.set_material( "RWY_GREEN_MEDIUM_LIGHTS" );
|
||||
} else if ( kind == "L" ) {
|
||||
green.set_material( "RWY_GREEN_LOW_LIGHTS" );
|
||||
} else {
|
||||
// this is a catch all in case there is an oddity in the input
|
||||
// data
|
||||
green.set_material( "RWY_GREEN_LIGHTS" );
|
||||
}
|
||||
/* other intensities for when the data file supports it
|
||||
*
|
||||
* green.set_material( "RWY_GREEN_MEDIUM_LIGHTS" );
|
||||
* green.set_material( "RWY_GREEN_LOW_LIGHTS" );
|
||||
*/
|
||||
|
||||
lights_poly.erase();
|
||||
normals_poly.erase();
|
||||
|
@ -389,17 +381,12 @@ static superpoly_list gen_runway_threshold_lights( const TGRunway& rwy_info,
|
|||
TGSuperPoly red;
|
||||
red.set_poly( lights_poly );
|
||||
red.set_normals( normals_poly );
|
||||
if ( kind == "H" ) {
|
||||
red.set_material( "RWY_RED_LIGHTS" );
|
||||
} else if ( kind == "M" ) {
|
||||
red.set_material( "RWY_RED_MEDIUM_LIGHTS" );
|
||||
} else if ( kind == "L" ) {
|
||||
red.set_material( "RWY_RED_LOW_LIGHTS" );
|
||||
} else {
|
||||
// this is a catch all in case there is an oddity in the input
|
||||
// data
|
||||
red.set_material( "RWY_RED_LIGHTS" );
|
||||
}
|
||||
/* other intensities for when the data file supports it
|
||||
*
|
||||
* red.set_material( "RWY_RED_MEDIUM_LIGHTS" );
|
||||
* red.set_material( "RWY_RED_LOW_LIGHTS" );
|
||||
*/
|
||||
|
||||
superpoly_list result; result.clear();
|
||||
|
||||
|
@ -2578,82 +2565,85 @@ static superpoly_list gen_malsx( const TGRunway& rwy_info,
|
|||
void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
||||
superpoly_list &lights ) {
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "gen runway lights " << rwy_info.rwy_no << " "
|
||||
<< rwy_info.end1_flags << " " << rwy_info.end2_flags);
|
||||
string lighting_flags = rwy_info.lighting_flags;
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "gen runway lights " << rwy_info.rwy_no << " "
|
||||
<< rwy_info.lighting_flags );
|
||||
|
||||
int vasi1 = atoi( lighting_flags.substr(0,1).c_str() );
|
||||
int rwylt1 = atoi( lighting_flags.substr(1,1).c_str() );
|
||||
int app1 = atoi( lighting_flags.substr(2,1).c_str() );
|
||||
int vasi2 = atoi( lighting_flags.substr(3,1).c_str() );
|
||||
int rwylt2 = atoi( lighting_flags.substr(4,1).c_str() );
|
||||
int app2 = atoi( lighting_flags.substr(5,1).c_str() );
|
||||
|
||||
unsigned int i;
|
||||
|
||||
// Make edge lighting
|
||||
string edge_type = rwy_info.surface_flags.substr(3,1);
|
||||
if ( edge_type != (string)"N" ) {
|
||||
if ( rwylt1 >= 2 /* Has edge lighting */ ) {
|
||||
// forward direction
|
||||
superpoly_list s;
|
||||
s = gen_runway_edge_lights( rwy_info, edge_type, false );
|
||||
superpoly_list s = gen_runway_edge_lights( rwy_info, rwylt1, false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
|
||||
}
|
||||
if ( rwylt2 >= 2 /* Has edge lighting */ ) {
|
||||
// reverse direction
|
||||
s = gen_runway_edge_lights( rwy_info, edge_type, true );
|
||||
superpoly_list s = gen_runway_edge_lights( rwy_info, rwylt2, true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// Centerline lighting
|
||||
if ( rwy_info.surface_flags.substr(0,1) == "Y" ) {
|
||||
if ( rwylt1 >= 4 /* Has centerline lighting */ ) {
|
||||
// forward direction
|
||||
superpoly_list s;
|
||||
s = gen_runway_center_line_lights( rwy_info, false );
|
||||
superpoly_list s = gen_runway_center_line_lights( rwy_info, false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
|
||||
}
|
||||
if ( rwylt2 >= 4 /* Has centerline lighting */ ) {
|
||||
// reverse direction
|
||||
s = gen_runway_center_line_lights( rwy_info, true );
|
||||
superpoly_list s = gen_runway_center_line_lights( rwy_info, true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// Touchdown zone lighting
|
||||
if ( rwy_info.end1_flags.substr(0,1) == "Y" ) {
|
||||
if ( rwylt1 >= 5 /* Has touchdown zone lighting */ ) {
|
||||
TGSuperPoly s = gen_touchdown_zone_lights( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(0,1) == "Y" ) {
|
||||
if ( rwylt2 >= 5 /* Has touchdown zone lighting */ ) {
|
||||
TGSuperPoly s = gen_touchdown_zone_lights( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
}
|
||||
|
||||
// REIL lighting
|
||||
if ( rwy_info.end1_flags.substr(1,1) == "Y" ) {
|
||||
if ( rwylt1 >= 3 /* Has REIL lighting */ ) {
|
||||
TGSuperPoly s = gen_reil( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(1,1) == "Y" ) {
|
||||
if ( rwylt2 >= 3 /* Has REIL lighting */ ) {
|
||||
TGSuperPoly s = gen_reil( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
}
|
||||
|
||||
// PAPI lighting
|
||||
if ( rwy_info.end1_flags.substr(2,1) == "P" ) {
|
||||
// VASI/PAPI lighting
|
||||
if ( vasi1 == 2 /* Has VASI */ ) {
|
||||
TGSuperPoly s = gen_vasi( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
} else if ( vasi1 == 3 /* Has PAPI */ ) {
|
||||
TGSuperPoly s = gen_papi( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(2,1) == "P" ) {
|
||||
TGSuperPoly s = gen_papi( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
}
|
||||
|
||||
// VASI lighting
|
||||
if ( rwy_info.end1_flags.substr(2,1) == "V" ) {
|
||||
TGSuperPoly s = gen_vasi( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(2,1) == "V" ) {
|
||||
if ( vasi2 == 2 /* Has VASI */ ) {
|
||||
TGSuperPoly s = gen_vasi( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
} else if ( vasi2 == 3 /* Has PAPI */ ) {
|
||||
TGSuperPoly s = gen_papi( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
}
|
||||
|
||||
// Approach lighting
|
||||
|
@ -2666,28 +2656,26 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// Please send me documentation for this configuration
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
// ALSF-I
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "B" ) {
|
||||
if ( app1 == 4 /* ALSF-I */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "1", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "B" ) {
|
||||
if ( app2 == 4 /* ALSF-I */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "1", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// ALSF-II
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "C" ) {
|
||||
if ( app1 == 5 /* ALSF-II */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "2", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "C" ) {
|
||||
if ( app2 == 5 /* ALSF-II */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "2", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2704,13 +2692,13 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// Please send me documentation for this configuration
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "D" ) {
|
||||
if ( app1 == 7 || app1 == 8 /* Calvert 1, 2, and 3 */ ) {
|
||||
superpoly_list s = gen_calvert( rwy_info, alt_m, "1", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "E" ) {
|
||||
if ( app2 == 7 || app2 == 8 /* Calvert 1, 2, and 3 */ ) {
|
||||
superpoly_list s = gen_calvert( rwy_info, alt_m, "2", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2725,28 +2713,26 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// data is provided in our database
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
// MALS
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "G" ) {
|
||||
if ( app1 == -1 /* MALS not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "x", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "G" ) {
|
||||
if ( app2 == -1 /* MALS not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "x", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// MALSF
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "H" ) {
|
||||
if ( app1 == -1 /* MALSF not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "F", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "H" ) {
|
||||
if ( app2 == -1 /* MALSF not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "F", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2761,14 +2747,13 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// This is also likely airport specific
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
// MALSR
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "J" ) {
|
||||
if ( app1 == -1 /* MALSR not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "R", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "J" ) {
|
||||
if ( app2 == -1 /* MALSR not supported by data base */ ) {
|
||||
superpoly_list s = gen_malsx( rwy_info, alt_m, "R", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2783,12 +2768,11 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// No clue ...
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
// ODALS Omni-directional approach light system
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "L" ) {
|
||||
if ( app1 == 6 /* ODALS Omni-directional approach light system */ ) {
|
||||
TGSuperPoly s = gen_odals( rwy_info, alt_m, false );
|
||||
lights.push_back( s );
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "L" ) {
|
||||
if ( app2 == 6 /* ODALS Omni-directional approach light system */ ) {
|
||||
TGSuperPoly s = gen_odals( rwy_info, alt_m, true );
|
||||
lights.push_back( s );
|
||||
}
|
||||
|
@ -2802,69 +2786,65 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
|
||||
// SALS (Essentially ALSF-1 without the lead in rabbit lights, and
|
||||
// a shorter center bar)
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "O" ) {
|
||||
if ( app1 == -1 /* SALS not supported by database */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "O", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "O" ) {
|
||||
if ( app2 == -1 /* SALS not supported by database */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "O", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// SALSF
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "P" ) {
|
||||
if ( app1 == 3 /* SALSF */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "P", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "P" ) {
|
||||
if ( app2 == 3 /* SALSF */ ) {
|
||||
superpoly_list s = gen_alsf( rwy_info, alt_m, "P", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// SSALF
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "Q" ) {
|
||||
if ( app1 == -1 /* SSALF not supported by database */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "F", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "Q" ) {
|
||||
if ( app2 == -1 /* SSALF not supported by database */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "F", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// SSALR
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "R" ) {
|
||||
if ( app1 == -1 /* SSALR not supported by database */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "R", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "R" ) {
|
||||
if ( app2 == -1 /* SSALR not supported by database */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "R", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// SSALS
|
||||
if ( rwy_info.end1_flags.substr(3,1) == "S" ) {
|
||||
if ( app1 == 2 /* SSALS */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "S", false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(3,1) == "S" ) {
|
||||
if ( app2 == 2 /* SSALS */ ) {
|
||||
superpoly_list s = gen_ssalx( rwy_info, alt_m, "S", true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2875,25 +2855,25 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
// needed, but for those that don't (i.e. REIL, ODALS, or Edge
|
||||
// lights defined but no approach lights.)
|
||||
// Make threshold lighting
|
||||
if ( rwy_info.end1_flags.substr(1,1) == "Y" ||
|
||||
rwy_info.end1_flags.substr(3,1) == "L" ||
|
||||
( rwy_info.surface_flags.substr(3,1) != (string)"N" &&
|
||||
rwy_info.end1_flags.substr(3,1) == "N") )
|
||||
if ( rwylt1 >= 3 /* Has REIL lighting */
|
||||
|| app1 == 6 /* ODALS Omni-directional approach light system */
|
||||
|| ( rwylt1 >= 2 /* Has edge lighting */
|
||||
&& app1 == 0 /* No approach lighting */ ) )
|
||||
{
|
||||
// forward direction
|
||||
superpoly_list s = gen_runway_threshold_lights( rwy_info, edge_type,
|
||||
superpoly_list s = gen_runway_threshold_lights( rwy_info, rwylt1,
|
||||
alt_m, false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
if ( rwy_info.end2_flags.substr(1,1) == "Y" ||
|
||||
rwy_info.end2_flags.substr(3,1) == "L" ||
|
||||
( rwy_info.surface_flags.substr(3,1) != (string)"N" &&
|
||||
rwy_info.end2_flags.substr(3,1) == "N" ) )
|
||||
if ( rwylt2 >= 3 /* Has REIL lighting */
|
||||
|| app2 == 6 /* ODALS Omni-directional approach light system */
|
||||
|| ( rwylt2 >= 2 /* Has edge lighting */
|
||||
&& app2 == 0 /* No approach lighting */ ) )
|
||||
{
|
||||
// reverse direction
|
||||
superpoly_list s = gen_runway_threshold_lights( rwy_info, edge_type,
|
||||
superpoly_list s = gen_runway_threshold_lights( rwy_info, rwylt1,
|
||||
alt_m, true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
|
@ -2904,35 +2884,43 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m,
|
|||
|
||||
// top level taxiway light generator
|
||||
void gen_taxiway_lights( const TGRunway& taxiway_info, float alt_m,
|
||||
superpoly_list &lights ) {
|
||||
superpoly_list &lights )
|
||||
{
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "gen taxiway lights "
|
||||
<< taxiway_info.rwy_no << " "
|
||||
<< taxiway_info.lighting_flags );
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "gen taxiway lights " << taxiway_info.rwy_no << " "
|
||||
<< taxiway_info.end1_flags << " " << taxiway_info.end2_flags);
|
||||
string lighting_flags = taxiway_info.lighting_flags;
|
||||
int rwylt1 = atoi( lighting_flags.substr(1,1).c_str() );
|
||||
int rwylt2 = atoi( lighting_flags.substr(4,1).c_str() );
|
||||
|
||||
unsigned int i;
|
||||
|
||||
// Centerline lighting
|
||||
if ( taxiway_info.surface_flags.substr(0,1) == "Y" ) {
|
||||
if ( rwylt1 == 6 /* taxiway lit, assume centerline too */ ) {
|
||||
// forward direction
|
||||
superpoly_list s;
|
||||
s = gen_taxiway_center_line_lights( taxiway_info, false );
|
||||
superpoly_list s
|
||||
= gen_taxiway_center_line_lights( taxiway_info, false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
if ( rwylt2 == 6 /* taxiway lit, assume centerline too */ ) {
|
||||
// reverse direction
|
||||
s = gen_taxiway_center_line_lights( taxiway_info, true );
|
||||
superpoly_list s
|
||||
= gen_taxiway_center_line_lights( taxiway_info, true );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// Make edge lighting
|
||||
string edge_type = taxiway_info.surface_flags.substr(2,1);
|
||||
if ( taxiway_info.surface_flags.substr(2,1) == "B" ) {
|
||||
// forward direction
|
||||
if ( rwylt1 == 6 /* taxiway blue lit */ ) {
|
||||
// forward direction (blue lights are omni-directional so we
|
||||
// don't need to generate the reverse direction
|
||||
superpoly_list s;
|
||||
s = gen_taxiway_edge_lights( taxiway_info, "B", false );
|
||||
s = gen_taxiway_edge_lights( taxiway_info, rwylt1, false );
|
||||
for ( i = 0; i < s.size(); ++i ) {
|
||||
lights.push_back( s[i] );
|
||||
}
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#endif
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
SG_USING_STD(vector);
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
@ -43,6 +45,7 @@
|
|||
#include <simgear/bucket/newbucket.hxx>
|
||||
#include <simgear/debug/logstream.hxx>
|
||||
#include <simgear/misc/sgstream.hxx>
|
||||
#include <simgear/misc/strutils.hxx>
|
||||
|
||||
#include <Polygon/index.hxx>
|
||||
#include <Geometry/util.hxx>
|
||||
|
@ -54,6 +57,8 @@
|
|||
# include <Win32/mkdir.hpp>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
int nudge = 10;
|
||||
|
||||
|
||||
|
@ -232,11 +237,11 @@ int main( int argc, char **argv ) {
|
|||
}
|
||||
|
||||
string_list runways_list;
|
||||
string_list taxiways_list;
|
||||
string_list beacon_list;
|
||||
string_list tower_list;
|
||||
string_list windsock_list;
|
||||
|
||||
vector<string> token;
|
||||
string last_apt_id = "";
|
||||
string last_apt_info = "";
|
||||
string line;
|
||||
|
@ -245,34 +250,48 @@ int main( int argc, char **argv ) {
|
|||
while ( ! in.eof() ) {
|
||||
in.getline(tmp, 2048);
|
||||
line = tmp;
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "-> " << line );
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "-> '" << line << "'" );
|
||||
if ( line.length() ) {
|
||||
token = simgear::strutils::split( line );
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "token[0] " << token[0] );
|
||||
} else {
|
||||
token.clear();
|
||||
}
|
||||
|
||||
if ( line.length() == 0 ) {
|
||||
// empty, skip
|
||||
} else if (( line[0] == '#' ) || (line[0] == '/' && line[1] == '/')) {
|
||||
if ( !line.length() ) {
|
||||
// empty line, skip
|
||||
} else if ( (token[0] == "#") || (token[0] == "//") ) {
|
||||
// comment, skip
|
||||
} else if ( line[0] == 'A' || line[0] == 'H' || line[0] == 'S' ) {
|
||||
// extract some airport runway info
|
||||
char ctmp, tmpid[32], rwy[32];
|
||||
string id;
|
||||
float lat, lon;
|
||||
int elev = 0;
|
||||
} else if ( token[0] == "I" ) {
|
||||
// First line, indicates IBM (i.e. DOS line endings I
|
||||
// believe.)
|
||||
|
||||
sscanf( line.c_str(), "%c %s %d",
|
||||
&ctmp, tmpid, &elev );
|
||||
id = tmpid;
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "Next airport = " << id << " "
|
||||
// move past this line and read and discard the next line
|
||||
// which is the version and copyright information
|
||||
in.getline(tmp, 2048);
|
||||
vector<string> vers_token = simgear::strutils::split( tmp );
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Data version = " << vers_token[0] );
|
||||
} else if ( token[0] == "1" /* Airport */
|
||||
|| token[0] == "16" /* Seaplane Base */
|
||||
|| token[0] == "17" /* Heliport */ )
|
||||
{
|
||||
// extract some airport runway info
|
||||
string rwy;
|
||||
float lat, lon;
|
||||
|
||||
string id = token[4];
|
||||
int elev = atoi( token[1].c_str() );
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Next airport = " << id << " "
|
||||
<< elev );
|
||||
|
||||
if ( !last_apt_id.empty()) {
|
||||
if ( runways_list.size() ) {
|
||||
sscanf( runways_list[0].c_str(), "%c %s %s %f %f",
|
||||
&ctmp, tmpid, rwy, &lat, &lon );
|
||||
}
|
||||
vector<string> rwy_token
|
||||
= simgear::strutils::split( runways_list[0] );
|
||||
rwy = token[3];
|
||||
lat = atof( token[1].c_str() );
|
||||
lon = atof( token[2].c_str() );
|
||||
|
||||
if ( lon >= min_lon && lon <= max_lon &&
|
||||
lat >= min_lat && lat <= max_lat )
|
||||
{
|
||||
if ( airport_id.length() && airport_id == last_apt_id ) {
|
||||
ready_to_go = true;
|
||||
} else if ( start_id.length() && start_id == last_apt_id ) {
|
||||
|
@ -290,9 +309,11 @@ int main( int argc, char **argv ) {
|
|||
// process previous record
|
||||
// process_airport(last_apt_id, runways_list, argv[2]);
|
||||
try {
|
||||
build_airport( last_apt_id, elev * SG_FEET_TO_METER,
|
||||
runways_list, taxiways_list,
|
||||
beacon_list, tower_list,
|
||||
build_airport( last_apt_id,
|
||||
elev * SG_FEET_TO_METER,
|
||||
runways_list,
|
||||
beacon_list,
|
||||
tower_list,
|
||||
windsock_list,
|
||||
work_dir, elev_src );
|
||||
} catch (sg_exception &e) {
|
||||
|
@ -303,37 +324,44 @@ int main( int argc, char **argv ) {
|
|||
<< e.getMessage() );
|
||||
exit(-1);
|
||||
}
|
||||
if(airport_id.length()) ready_to_go = false;
|
||||
if ( airport_id.length() ) {
|
||||
ready_to_go = false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(!airport_id.length()) {
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id);
|
||||
SG_LOG(SG_GENERAL, SG_INFO,
|
||||
"ERRO: No runways, skipping = " << id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
last_apt_id = id;
|
||||
last_apt_info = line;
|
||||
// clear runway list for start of next airport
|
||||
runways_list.clear();
|
||||
taxiways_list.clear();
|
||||
beacon_list.clear();
|
||||
tower_list.clear();
|
||||
windsock_list.clear();
|
||||
} else if ( line[0] == 'R' ) {
|
||||
} else if ( token[0] == "10" ) {
|
||||
// runway entry
|
||||
runways_list.push_back(line);
|
||||
} else if ( line[0] == 'T' ) {
|
||||
// taxiway entry
|
||||
taxiways_list.push_back(line);
|
||||
} else if ( line[0] == 'B' ) {
|
||||
} else if ( token[0] == "18" ) {
|
||||
// beacon entry
|
||||
beacon_list.push_back(line);
|
||||
} else if ( line[0] == 'C' ) {
|
||||
} else if ( token[0] == "14" ) {
|
||||
// control tower entry
|
||||
tower_list.push_back(line);
|
||||
} else if ( line[0] == 'W' ) {
|
||||
// control tower entry
|
||||
} else if ( token[0] == "19" ) {
|
||||
// windsock entry
|
||||
windsock_list.push_back(line);
|
||||
} else if ( token[0] == "15" ) {
|
||||
// ignore custom startup locations
|
||||
} else if ( token[0] == "50" || token[0] == "51" || token[0] == "52"
|
||||
|| token[0] == "53" || token[0] == "54" || token[0] == "55"
|
||||
|| token[0] == "56" )
|
||||
{
|
||||
// ignore frequency entries
|
||||
} else {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT,
|
||||
"Unknown line in file: " << line );
|
||||
|
@ -354,9 +382,6 @@ int main( int argc, char **argv ) {
|
|||
&ctmp, tmpid, rwy, &lat, &lon );
|
||||
}
|
||||
|
||||
if ( lon >= min_lon && lon <= max_lon &&
|
||||
lat >= min_lat && lat <= max_lat )
|
||||
{
|
||||
if ( start_id.length() && start_id == last_apt_id ) {
|
||||
ready_to_go = true;
|
||||
}
|
||||
|
@ -373,8 +398,9 @@ int main( int argc, char **argv ) {
|
|||
// process_airport(last_apt_id, runways_list, argv[2]);
|
||||
try {
|
||||
build_airport( last_apt_id, elev * SG_FEET_TO_METER,
|
||||
runways_list, taxiways_list,
|
||||
beacon_list, tower_list,
|
||||
runways_list,
|
||||
beacon_list,
|
||||
tower_list,
|
||||
windsock_list,
|
||||
work_dir, elev_src );
|
||||
} catch (sg_exception &e) {
|
||||
|
@ -385,7 +411,6 @@ int main( int argc, char **argv ) {
|
|||
<< e.getMessage() );
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id);
|
||||
}
|
||||
|
|
|
@ -47,9 +47,12 @@ struct TGRunway {
|
|||
double stopway1;
|
||||
double stopway2;
|
||||
|
||||
string surface_flags;
|
||||
string end1_flags;
|
||||
string end2_flags;
|
||||
string lighting_flags;
|
||||
int surface_code;
|
||||
string shoulder_code;
|
||||
int marking_code;
|
||||
double smoothness;
|
||||
bool dist_remaining;
|
||||
|
||||
TGPolygon threshold;
|
||||
TGPolygon tens, tens_margin, ones, ones_margin;
|
||||
|
|
|
@ -94,7 +94,8 @@ void gen_visual_rwy( const TGRunway& rwy_info,
|
|||
double length = rwy_info.length / 2.0 + 2.0;
|
||||
if ( length < 1150 ) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT,
|
||||
"This runway is not long enough for visual markings!");
|
||||
"This runway is not long enough for visual markings = "
|
||||
<< rwy_info.length );
|
||||
}
|
||||
|
||||
double start1_pct = 0.0;
|
||||
|
|
Loading…
Add table
Reference in a new issue