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