From 7368effd9e9c4f72c32a7bc34ac545582cdd1c79 Mon Sep 17 00:00:00 2001 From: curt <curt> Date: Tue, 22 Oct 2002 03:56:12 +0000 Subject: [PATCH] First crack at generating taxiway lights (with a normal vector of up.) --- src/Airports/GenAirports/build.cxx | 7 +- src/Airports/GenAirports/lights.cxx | 163 +++++++++++++++++++++++++++- src/Airports/GenAirports/lights.hxx | 3 + 3 files changed, 170 insertions(+), 3 deletions(-) diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx index bd22799a..d41f37f2 100644 --- a/src/Airports/GenAirports/build.cxx +++ b/src/Airports/GenAirports/build.cxx @@ -563,12 +563,17 @@ void build_airport( string airport_raw, float alt_m, string_list& runways_raw, return; } - // 5th pass: generate runway/taxiway lights + // 5th pass: generate runway lights superpoly_list rwy_lights; rwy_lights.clear(); for ( i = 0; i < (int)runways.size(); ++i ) { gen_runway_lights( runways[i], alt_m, rwy_lights ); } + // 6th pass: generate all taxiway lights + for ( i = 0; i < (int)taxiways.size(); ++i ) { + gen_taxiway_lights( taxiways[i], alt_m, rwy_lights ); + } + // generate convex hull (no longer) // FGPolygon hull = convex_hull(apt_pts); diff --git a/src/Airports/GenAirports/lights.cxx b/src/Airports/GenAirports/lights.cxx index dcdd7cb7..991aa541 100644 --- a/src/Airports/GenAirports/lights.cxx +++ b/src/Airports/GenAirports/lights.cxx @@ -53,7 +53,7 @@ static Point3D gen_runway_light_vector( const FGRunway& rwy_info, } else { end2 = (corner[0] + corner[1]) / 2.0; end1 = (corner[2] + corner[3]) / 2.0; - } + } Point3D cart1 = sgGeodToCart( end1 * SG_DEGREES_TO_RADIANS ); Point3D cart2 = sgGeodToCart( end2 * SG_DEGREES_TO_RADIANS ); cout << "cart1 = " << cart1 << " cart2 = " << cart2 << endl; @@ -255,6 +255,89 @@ static superpoly_list gen_runway_edge_lights( const FGRunway& 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 FGRunway& rwy_info, + const string& kind, bool recip ) +{ + point_list b_lights; b_lights.clear(); + point_list b_normals; b_normals.clear(); + int i; + + double len = rwy_info.length * SG_FEET_TO_METER; + int divs; + if ( len > 100.0 ) { + // for lengths of 300' or more, max spacing is 200' + divs = (int)(len / 70.0) + 1; + } else { + // for lengths <= 300', max spacing = 100' + divs = (int)(len / 35.0) + 1; + } + + // using FGPolygon is a bit innefficient, but that's what the + // routine returns. + FGPolygon poly_corners = gen_runway_area_w_expand( rwy_info, 2.0, 2.0 ); + + point_list corner; + for ( i = 0; i < poly_corners.contour_size( 0 ); ++i ) { + corner.push_back( poly_corners.get_pt( 0, i ) ); + } + + Point3D inc1, inc2; + Point3D pt1, pt2; + + if ( recip ) { + inc1 = (corner[3] - corner[0]) / divs; + inc2 = (corner[2] - corner[1]) / divs; + pt1 = corner[0]; + pt2 = corner[1]; + } else { + inc1 = (corner[0] - corner[3]) / divs; + inc2 = (corner[1] - corner[2]) / divs; + pt1 = corner[3]; + pt2 = corner[2]; + } + + double dist = rwy_info.length; + double step = dist / divs; + + Point3D up = sgGeodToCart( corner[0] * SG_DEGREES_TO_RADIANS ); + double length = up.distance3D( Point3D(0.0) ); + up = up / length; + + b_lights.push_back( pt1 ); + b_normals.push_back( up ); + b_lights.push_back( pt2 ); + b_normals.push_back( up ); + dist -= step; + + for ( i = 0; i < divs; ++i ) { + pt1 += inc1; + pt2 += inc2; + b_lights.push_back( pt1 ); + b_normals.push_back( up ); + b_lights.push_back( pt2 ); + b_normals.push_back( up ); + } + + FGPolygon lights_poly; lights_poly.erase(); + FGPolygon normals_poly; normals_poly.erase(); + lights_poly.add_contour( b_lights, false ); + normals_poly.add_contour( b_normals, false ); + + FGSuperPoly blue; + blue.set_poly( lights_poly ); + blue.set_normals( normals_poly ); + blue.set_material( "RWY_BLUE_TAXIWAY_LIGHTS" ); + + superpoly_list result; result.clear(); + + result.push_back( blue ); + + return result; +} + + // generate threshold lights for a 3 degree approach static superpoly_list gen_runway_threshold_lights( const FGRunway& rwy_info, const string& kind, @@ -2046,7 +2129,14 @@ void gen_runway_lights( const FGRunway& rwy_info, float alt_m, // Please send me documentation for this configuration //////////////////////////////////////////////////////////// - // LDIN + //////////////////////////////////////////////////////////// + // NOT IMPLIMENTED: + // + // code: "F" LDIN + // + // This configuration is airport specific and no additional placement + // data is provided in our database + //////////////////////////////////////////////////////////// // MALS if ( rwy_info.end1_flags.substr(3,1) == "G" ) { @@ -2076,6 +2166,14 @@ void gen_runway_lights( const FGRunway& rwy_info, float alt_m, } } + //////////////////////////////////////////////////////////// + // NOT IMPLIMENTED: + // + // code: "I" NSTD Non standard + // + // This is also likely airport specific + //////////////////////////////////////////////////////////// + // MALSR if ( rwy_info.end1_flags.substr(3,1) == "J" ) { superpoly_list s = gen_malsx( rwy_info, alt_m, "R", false ); @@ -2090,6 +2188,28 @@ void gen_runway_lights( const FGRunway& rwy_info, float alt_m, } } + //////////////////////////////////////////////////////////// + // NOT IMPLIMENTED: + // + // code: "K" MIL OVRN Something military + // + // No clue ... + //////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////// + // NOT IMPLIMENTED: + // + // code: "L" ODALS Omni-directional approach light system + // + //////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////// + // NOT IMPLIMENTED: + // + // code: "M" RAIL Runway alignment indicator lights (icw other systems) + // + //////////////////////////////////////////////////////////// + // SALS (Essentially ALSF-1 without the lead in rabbit lights, and // a shorter center bar) @@ -2168,3 +2288,42 @@ void gen_runway_lights( const FGRunway& rwy_info, float alt_m, } } } + + +// top level taxiway light generator +void gen_taxiway_lights( const FGRunway& taxiway_info, float alt_m, + superpoly_list &lights ) { + + cout << "gen taxiway lights " << taxiway_info.rwy_no << " " + << taxiway_info.end1_flags << " " << taxiway_info.end2_flags << endl;; + + unsigned int i; + + // Centerline lighting + if ( taxiway_info.surface_flags.substr(0,1) == "Y" ) { + // forward direction + superpoly_list s; + s = gen_runway_center_line_lights( taxiway_info, false ); + for ( i = 0; i < s.size(); ++i ) { + lights.push_back( s[i] ); + } + + // reverse direction + s = gen_runway_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 + superpoly_list s; + s = gen_taxiway_edge_lights( taxiway_info, "B", false ); + for ( i = 0; i < s.size(); ++i ) { + lights.push_back( s[i] ); + } + } + +} diff --git a/src/Airports/GenAirports/lights.hxx b/src/Airports/GenAirports/lights.hxx index a21148a4..382c2f58 100644 --- a/src/Airports/GenAirports/lights.hxx +++ b/src/Airports/GenAirports/lights.hxx @@ -37,5 +37,8 @@ void gen_runway_lights( const FGRunway& rwy_info, float alt_m, superpoly_list &lights ); +// generate taxiway lighting +void gen_taxiway_lights( const FGRunway& taxiway_info, float alt_m, + superpoly_list &lights ); #endif // _RWY_LIGHTS_HXX