From 2538ac773f737e34e3a9d7e89c5ab2e1b4624cad Mon Sep 17 00:00:00 2001
From: curt <curt>
Date: Fri, 5 Sep 2003 01:37:04 +0000
Subject: [PATCH] Added support for generating displaced thresholds (finally)
 :-)

---
 src/Airports/GenAirports/build.cxx       |  38 ++-
 src/Airports/GenAirports/main.cxx        |  75 +++---
 src/Airports/GenAirports/rwy_common.cxx  |  33 ++-
 src/Airports/GenAirports/rwy_common.hxx  |   1 +
 src/Airports/GenAirports/rwy_nonprec.cxx |  12 +
 src/Airports/GenAirports/rwy_prec.cxx    | 317 +++++++++++++++++------
 src/Airports/GenAirports/rwy_visual.cxx  |  10 +
 src/Airports/GenAirports/texparams.hxx   |  20 ++
 src/Airports/xp2runway.pl                | 234 -----------------
 src/Airports/xp2simpleapt.pl             |  90 -------
 10 files changed, 366 insertions(+), 464 deletions(-)
 delete mode 100755 src/Airports/xp2runway.pl
 delete mode 100755 src/Airports/xp2simpleapt.pl

diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx
index be989ddb..9b834e76 100644
--- a/src/Airports/GenAirports/build.cxx
+++ b/src/Airports/GenAirports/build.cxx
@@ -95,6 +95,10 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly,
     double width = tp.get_width();
     double length = tp.get_length();
     double heading = tp.get_heading();
+    double minu = tp.get_minu();
+    double maxu = tp.get_maxu();
+    double minv = tp.get_minv();
+    double maxv = tp.get_maxv();
     SG_LOG( SG_GENERAL, SG_INFO, "section ref = " << ref );
     SG_LOG( SG_GENERAL, SG_INFO, "  width = " << width );
     SG_LOG( SG_GENERAL, SG_INFO, "  length = " << length );
@@ -142,18 +146,22 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly,
 	    //
 	    // 4. Map x, y point into texture coordinates
 	    //
-	    
-	    tx = x / width;
+	    double tmp;
+
+            tmp = x / width;
+            tx = tmp * (maxu - minu) + minu;
 	    // tx = ((int)(tx * 100)) / 100.0;
 	    SG_LOG(SG_GENERAL, SG_INFO, "  (" << tx << ")");
 
-            if ( clip_result ) {
+            if ( clip_result) {
                 if ( tx < 0.0 ) { tx = 0.0; }
                 if ( tx > 1.0 ) { tx = 1.0; }
             }
 
 	    // ty = (y - min.y()) / (max.y() - min.y());
 	    ty = y / length;
+            tmp = y / length;
+            ty = tmp * (maxv - minv) + minv;
 	    // ty = ((int)(ty * 100)) / 100.0;
 	    SG_LOG(SG_GENERAL, SG_INFO, "  (" << ty << ")");
 
@@ -493,22 +501,30 @@ 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" ) {
-	    build_runway( runways[i], alt_m,
-			  &rwy_polys, &texparams, &accum,
-                          &apt_base, &apt_clearing );
-	}
+            if ( surface_flag != "W" ) {
+                // only build non-water runways
+                build_runway( runways[i], alt_m,
+                              &rwy_polys, &texparams, &accum,
+                              &apt_base, &apt_clearing );
+            }
+        }
     }
 
     // 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") ) {
-	    build_runway( runways[i], alt_m,
-			  &rwy_polys, &texparams, &accum,
-                          &apt_base, &apt_clearing );
-	}
+            if ( surface_flag != "W" ) {
+                // only build non-water runways
+                build_runway( runways[i], alt_m,
+                              &rwy_polys, &texparams, &accum,
+                              &apt_base, &apt_clearing );
+            }
+        }
     }
 
     // 4th pass: generate all taxiways
diff --git a/src/Airports/GenAirports/main.cxx b/src/Airports/GenAirports/main.cxx
index d6e1652f..d73567b1 100644
--- a/src/Airports/GenAirports/main.cxx
+++ b/src/Airports/GenAirports/main.cxx
@@ -261,58 +261,51 @@ int main( int argc, char **argv ) {
         }
     }
 
-    if ( last_apt_id.length() ) {
-        // extract some airport runway info
+    cout << "last_apt_id.length() = " << last_apt_id.length() << endl;
+
+    if ( !last_apt_id.empty()) {
         char ctmp, tmpid[32], rwy[32];
         string id;
         float lat, lon;
         int elev = 0;
 
-        sscanf( line.c_str(), "%c %s %d",
-                &ctmp, tmpid, &elev );
-        id = tmpid;
-        SG_LOG( SG_GENERAL, SG_INFO, "Airport = " << id << " "
-                << elev );
+        if ( runways_list.size() ) {
+            sscanf( runways_list[0].c_str(), "%c %s %s %f %f",
+                    &ctmp, tmpid, rwy, &lat, &lon );
+        }
 
-        if ( !last_apt_id.empty()) {
-            if ( runways_list.size() ) {
-                sscanf( runways_list[0].c_str(), "%c %s %s %s %f %f",
-                        &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;
             }
 
-            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;
-                }
+            if ( ready_to_go ) {
+                // check point our location
+                char command[256];
+                sprintf( command,
+                         "echo before building %s >> last_apt",
+                         last_apt_id.c_str() );
+                system( command );
 
-                if ( ready_to_go ) {
-                    // check point our location
-                    char command[256];
-                    sprintf( command,
-                             "echo before building %s >> last_apt",
-                             last_apt_id.c_str() );
-                    system( command );
-
-                    // 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,
-                                       work_dir, elev_src );
-                    } catch (sg_exception &e) {
-                        SG_LOG( SG_GENERAL, SG_ALERT,
-                                "Failed to build airport = "
-                                << last_apt_id );
-                        SG_LOG( SG_GENERAL, SG_ALERT, "Exception: "
-                                << e.getMessage() );
-                        exit(-1);
-                    }
+                // 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,
+                                   work_dir, elev_src );
+                } catch (sg_exception &e) {
+                    SG_LOG( SG_GENERAL, SG_ALERT,
+                            "Failed to build airport = "
+                            << last_apt_id );
+                    SG_LOG( SG_GENERAL, SG_ALERT, "Exception: "
+                            << e.getMessage() );
+                    exit(-1);
                 }
-            } else {
-                SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id);
             }
+        } else {
+            SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id);
         }
     }
 
diff --git a/src/Airports/GenAirports/rwy_common.cxx b/src/Airports/GenAirports/rwy_common.cxx
index 0733fbed..300b4120 100644
--- a/src/Airports/GenAirports/rwy_common.cxx
+++ b/src/Airports/GenAirports/rwy_common.cxx
@@ -64,6 +64,7 @@ void gen_number_block( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, poly,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    heading,
 			    material, tex1,
 			    rwy_polys, texparams, accum );
@@ -71,22 +72,25 @@ void gen_number_block( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, poly,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    heading,
 			    material, tex1,
 			    rwy_polys, texparams, accum );
     } else {
-	    gen_runway_section( rwy_info, poly,
-				start_pct, end_pct,
-				0.0, 0.5,
-				heading,
-				material, tex1,
-				rwy_polys, texparams, accum );
-	    gen_runway_section( rwy_info, poly,
-				start_pct, end_pct,
-				0.5, 1.0,
-				heading,
-				material, tex2,
-				rwy_polys, texparams, accum );
+        gen_runway_section( rwy_info, poly,
+                            start_pct, end_pct,
+                            0.0, 0.5,
+                            0.0, 1.0, 0.0, 1.0,
+                            heading,
+                            material, tex1,
+                            rwy_polys, texparams, accum );
+        gen_runway_section( rwy_info, poly,
+                            start_pct, end_pct,
+                            0.5, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
+                            heading,
+                            material, tex2,
+                            rwy_polys, texparams, accum );
     }
 }
 
@@ -96,6 +100,7 @@ void gen_runway_section( const TGRunway& rwy_info,
 			 const TGPolygon& runway,
 			 double startl_pct, double endl_pct,
 			 double startw_pct, double endw_pct,
+                         double minu, double maxu, double minv, double maxv,
 			 double heading,
 			 const string& prefix,
 			 const string& material,
@@ -238,6 +243,10 @@ void gen_runway_section( const TGRunway& rwy_info,
                       sect_wid * SG_FEET_TO_METER,
                       sect_len * SG_FEET_TO_METER,
                       heading );
+    tp.set_minu( minu );
+    tp.set_maxu( maxu );
+    tp.set_minv( minv );
+    tp.set_maxv( maxv );
     texparams->push_back( tp );
 
     // print runway points
diff --git a/src/Airports/GenAirports/rwy_common.hxx b/src/Airports/GenAirports/rwy_common.hxx
index 4e1ff7aa..4572ce80 100644
--- a/src/Airports/GenAirports/rwy_common.hxx
+++ b/src/Airports/GenAirports/rwy_common.hxx
@@ -46,6 +46,7 @@ void gen_runway_section( const TGRunway& rwy_info,
 			 const TGPolygon& runway,
 			 double startl_pct, double endl_pct,
 			 double startw_pct, double endw_pct,
+                         double minu, double maxu, double minv, double maxv,
 			 double heading,
 			 const string& prefix,
 			 const string& material,
diff --git a/src/Airports/GenAirports/rwy_nonprec.cxx b/src/Airports/GenAirports/rwy_nonprec.cxx
index 46bf4946..5c58313f 100644
--- a/src/Airports/GenAirports/rwy_nonprec.cxx
+++ b/src/Airports/GenAirports/rwy_nonprec.cxx
@@ -107,6 +107,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
     gen_runway_section( rwy_info, runway_a,
 			start_pct, end_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "threshold",
 			rwy_polys, texparams, accum );
@@ -114,6 +115,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
     gen_runway_section( rwy_info, runway_b,
 			start_pct, end_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "threshold",
 			rwy_polys, texparams, accum );
@@ -148,6 +150,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, rev_letter,
 			    rwy_polys, texparams, accum );
@@ -155,6 +158,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, letter,
 			    rwy_polys, texparams, accum );
@@ -202,6 +206,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -209,6 +214,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -218,6 +224,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -226,6 +233,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 			    start_pct, end_pct,
 			    0.0, 1.0,
 			    rwy_info.heading + 180.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
 
@@ -242,6 +250,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "aim",
 			    rwy_polys, texparams, accum );
@@ -249,6 +258,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "aim",
 			    rwy_polys, texparams, accum );
@@ -272,6 +282,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -279,6 +290,7 @@ void gen_non_precision_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
diff --git a/src/Airports/GenAirports/rwy_prec.cxx b/src/Airports/GenAirports/rwy_prec.cxx
index 75bcad09..e23563f4 100644
--- a/src/Airports/GenAirports/rwy_prec.cxx
+++ b/src/Airports/GenAirports/rwy_prec.cxx
@@ -46,7 +46,7 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Generate the basic runway outlines
     //
 
-    int i, j;
+    int i;
 
     TGPolygon runway = gen_runway_w_mid( rwy_info, alt_m,
                                          2 * SG_FEET_TO_METER,
@@ -71,13 +71,13 @@ void gen_precision_rwy( const TGRunway& rwy_info,
 	
     Point3D p;
     SG_LOG(SG_GENERAL, SG_DEBUG, "raw runway pts (a half)");
-    for ( j = 0; j < runway_a.contour_size( 0 ); ++j ) {
-	p = runway_a.get_pt(0, j);
+    for ( i = 0; i < runway_a.contour_size( 0 ); ++i ) {
+	p = runway_a.get_pt(0, i);
 	SG_LOG(SG_GENERAL, SG_DEBUG, " point = " << p);
     }
     SG_LOG(SG_GENERAL, SG_DEBUG, "raw runway pts (b half)");
-    for ( j = 0; j < runway_b.contour_size( 0 ); ++j ) {
-	p = runway_b.get_pt(0, j);
+    for ( i = 0; i < runway_b.contour_size( 0 ); ++i ) {
+	p = runway_b.get_pt(0, i);
 	SG_LOG(SG_GENERAL, SG_DEBUG, " point = " << p);
     }
 
@@ -99,24 +99,129 @@ void gen_precision_rwy( const TGRunway& rwy_info,
                 << rwy_info.length << ") for precision markings!");
     }
 
-    double start_pct = 0;
-    double end_pct = 0;
+    double start1_pct = 0.0;
+    double start2_pct = 0.0;
+    double end1_pct = 0.0;
+    double end2_pct = 0.0;
+
+    // 
+    // Displaced threshold if it exists
+    //
+
+    if ( rwy_info.disp_thresh1 > 0.0 ) {
+        // reserve 100' for final arrows
+        double thresh = rwy_info.disp_thresh1 - 100.0;
+
+        // number of full center arrows
+        int count = (int)(thresh / 200.0);
+
+        // length of starting partial arrow
+        double part_len = thresh - ( count * 200.0 );
+        double tex_pct = (200.0 - part_len) / 200.0;
+
+        // starting (possibly partial chunk)
+        start1_pct = end1_pct;
+        end1_pct = start1_pct + ( part_len / length );
+        gen_runway_section( rwy_info, runway_a,
+                            start1_pct, end1_pct,
+                            0.0, 1.0,
+                            0.0, 1.0, tex_pct, 1.0,
+                            rwy_info.heading,
+                            material, "dspl_thresh",
+                            rwy_polys, texparams, accum );
+
+        // main chunks
+        for ( i = 0; i < count; ++i ) {
+            start1_pct = end1_pct;
+            end1_pct = start1_pct + ( 200.0 / length );
+            gen_runway_section( rwy_info, runway_a,
+                                start1_pct, end1_pct,
+                                0.0, 1.0,
+                                0.0, 1.0, 0.0, 1.0,
+                                rwy_info.heading,
+                                material, "dspl_thresh",
+                                rwy_polys, texparams, accum );
+        }
+
+        // final arrows
+        start1_pct = end1_pct;
+        end1_pct = start1_pct + ( 100.0 / length );
+        gen_runway_section( rwy_info, runway_a,
+                            start1_pct, end1_pct,
+                            0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
+                            rwy_info.heading,
+                            material, "dspl_arrows",
+                            rwy_polys, texparams, accum );
+    }
+
+    if ( rwy_info.disp_thresh2 > 0.0 ) {
+        // reserve 100' for final arrows
+        double thresh = rwy_info.disp_thresh2 - 100.0;
+
+        // number of full center arrows
+        int count = (int)(thresh / 200.0);
+
+        // length of starting partial arrow
+        double part_len = thresh - ( count * 200.0 );
+        double tex_pct = (200.0 - part_len) / 200.0;
+
+        // starting (possibly partial chunk)
+        start2_pct = end2_pct;
+        end2_pct = start2_pct + ( part_len / length );
+        gen_runway_section( rwy_info, runway_b,
+                            start2_pct, end2_pct,
+                            0.0, 1.0,
+                            0.0, 1.0, tex_pct, 1.0,
+                            rwy_info.heading + 180.0,
+                            material, "dspl_thresh",
+                            rwy_polys, texparams, accum );
+
+        // main chunks
+        for ( i = 0; i < count; ++i ) {
+            start2_pct = end2_pct;
+            end2_pct = start2_pct + ( 200.0 / length );
+            gen_runway_section( rwy_info, runway_b,
+                                start2_pct, end2_pct,
+                                0.0, 1.0,
+                                0.0, 1.0, 0.0, 1.0,
+                                rwy_info.heading + 180.0,
+                                material, "dspl_thresh",
+                                rwy_polys, texparams, accum );
+        }
+
+        // final arrows
+        start2_pct = end2_pct;
+        end2_pct = start2_pct + ( 100.0 / length );
+        gen_runway_section( rwy_info, runway_b,
+                            start2_pct, end2_pct,
+                            0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
+                            rwy_info.heading + 180.0,
+                            material, "dspl_arrows",
+                            rwy_polys, texparams, accum );
+    }
 
     //
     // Threshold
     //
 
-    end_pct = start_pct + ( 192.0 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 192.0 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "threshold",
 			rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 192.0 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "threshold",
 			rwy_polys, texparams, accum );
@@ -146,18 +251,22 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation letter = " << letter);
 
     if ( !letter.empty() ) {
-	start_pct = end_pct;
-	end_pct = start_pct + ( 90.0 / length );
+	start1_pct = end1_pct;
+	end1_pct = start1_pct + ( 90.0 / length );
 	gen_runway_section( rwy_info, runway_a,
-			    start_pct, end_pct,
+			    start1_pct, end1_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, rev_letter,
 			    rwy_polys, texparams, accum );
 
+	start2_pct = end2_pct;
+	end2_pct = start2_pct + ( 90.0 / length );
 	gen_runway_section( rwy_info, runway_b,
-			    start_pct, end_pct,
+			    start2_pct, end2_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, letter,
 			    rwy_polys, texparams, accum );
@@ -167,9 +276,6 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Runway designation number(s)
     //
 
-    start_pct = end_pct;
-    end_pct = start_pct + ( 90.0 / length );
-
     len = rwy_info.rwy_no.length();
     string snum = rwy_info.rwy_no;
     for ( i = 0; i < len; ++i ) {
@@ -184,50 +290,62 @@ void gen_precision_rwy( const TGRunway& rwy_info,
         num += 36;
     }
 
-    gen_number_block( rwy_info, material, runway_b, rwy_info.heading + 180.0,
-		      num, start_pct, end_pct, rwy_polys, texparams, accum );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 90.0 / length );
+    gen_number_block( rwy_info, material, runway_a, rwy_info.heading,
+		      num, start1_pct, end1_pct, rwy_polys, texparams, accum );
 
     num += 18;
     while ( num > 36 ) {
 	num -= 36;
     }
 
-    gen_number_block( rwy_info, material, runway_a, rwy_info.heading,
-		      num, start_pct, end_pct, rwy_polys, texparams, accum );
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 90.0 / length );
+    gen_number_block( rwy_info, material, runway_b, rwy_info.heading + 180.0,
+		      num, start2_pct, end2_pct, rwy_polys, texparams, accum );
 
     //
     // Touch down zone x3
     //
 
-    start_pct = end_pct;
-    end_pct = start_pct + ( 380 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 380 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "tz_three",
 			rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 380 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "tz_three",
 			rwy_polys, texparams, accum );
 
     // add a section of center stripe
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-                        start_pct, end_pct,
+                        start1_pct, end1_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading,
                         material, "rest",
                         rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-                        start_pct, end_pct,
+                        start2_pct, end2_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading + 180.0,
                         material, "rest",
                         rwy_polys, texparams, accum );
@@ -236,18 +354,22 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Aiming point
     //
 
-    start_pct = end_pct;
-    end_pct = start_pct + ( 400 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "aim",
 			rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "aim",
 			rwy_polys, texparams, accum );
@@ -256,39 +378,49 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Touch down zone x2 (first)
     //
 
-    if ( end_pct >= 1.0 ) {
+    if ( end1_pct >= 1.0 ) {
 	return;
     }
-
-    start_pct = end_pct;
-    end_pct = start_pct + ( 400 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "tz_two_a",
 			rwy_polys, texparams, accum );
 
+    if ( end2_pct >= 1.0 ) {
+	return;
+    }
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "tz_two_a",
 			rwy_polys, texparams, accum );
 
     // add a section of center stripe
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-                        start_pct, end_pct,
+                        start1_pct, end1_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading,
                         material, "rest",
                         rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-                        start_pct, end_pct,
+                        start2_pct, end2_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading + 180.0,
                         material, "rest",
                         rwy_polys, texparams, accum );
@@ -297,39 +429,49 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Touch down zone x2 (second)
     //
 
-    if ( end_pct >= 1.0 ) {
+    if ( end1_pct >= 1.0 ) {
 	return;
     }
-
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "tz_two_b",
 			rwy_polys, texparams, accum );
 
+    if ( end2_pct >= 1.0 ) {
+	return;
+    }
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "tz_two_b",
 			rwy_polys, texparams, accum );
 
     // add a section of center stripe
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-                        start_pct, end_pct,
+                        start1_pct, end1_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading,
                         material, "rest",
                         rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-                        start_pct, end_pct,
+                        start2_pct, end2_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading + 180.0,
                         material, "rest",
                         rwy_polys, texparams, accum );
@@ -338,39 +480,49 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Touch down zone x1 (first)
     //
 
-    if ( end_pct >= 1.0 ) {
+    if ( end1_pct >= 1.0 ) {
 	return;
     }
-
-    start_pct = end_pct;
-    end_pct = start_pct + ( 400 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "tz_one_a",
 			rwy_polys, texparams, accum );
 
+    if ( end2_pct >= 1.0 ) {
+	return;
+    }
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 400 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "tz_one_a",
 			rwy_polys, texparams, accum );
 
     // add a section of center stripe
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-                        start_pct, end_pct,
+                        start1_pct, end1_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading,
                         material, "rest",
                         rwy_polys, texparams, accum );
 
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-                        start_pct, end_pct,
+                        start2_pct, end2_pct,
                         0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
                         rwy_info.heading + 180.0,
                         material, "rest",
                         rwy_polys, texparams, accum );
@@ -379,22 +531,28 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // Touch down zone x1 (second)
     //
 
-    if ( end_pct >= 1.0 ) {
+    if ( end1_pct >= 1.0 ) {
 	return;
     }
-
-    start_pct = end_pct;
-    end_pct = start_pct + ( 200 / length );
+    start1_pct = end1_pct;
+    end1_pct = start1_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_a,
-			start_pct, end_pct,
+			start1_pct, end1_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading,
 			material, "tz_one_b",
 			rwy_polys, texparams, accum );
 
+    if ( end2_pct >= 1.0 ) {
+	return;
+    }
+    start2_pct = end2_pct;
+    end2_pct = start2_pct + ( 200 / length );
     gen_runway_section( rwy_info, runway_b,
-			start_pct, end_pct,
+			start2_pct, end2_pct,
 			0.0, 1.0,
+                        0.0, 1.0, 0.0, 1.0,
 			rwy_info.heading + 180.0,
 			material, "tz_one_b",
 			rwy_polys, texparams, accum );
@@ -407,23 +565,30 @@ void gen_precision_rwy( const TGRunway& rwy_info,
     // the remaining distance so we don't end up with a super short
     // section at the end.
     double ideal_rest_inc = ( 200.0 / length );
-    int divs = (int)((1.0 - end_pct) / ideal_rest_inc) + 1;
-    double rest_inc = (1.0 - end_pct) / divs;
+    int divs = (int)((1.0 - end1_pct) / ideal_rest_inc) + 1;
+    double rest_inc = (1.0 - end1_pct) / divs;
 
-    while ( end_pct < 1.0 ) {
-	start_pct = end_pct;
-	end_pct = start_pct + rest_inc;
+    while ( end1_pct < 1.0 ) {
+	start1_pct = end1_pct;
+	end1_pct = start1_pct + rest_inc;
 
 	gen_runway_section( rwy_info, runway_a,
-			    start_pct, end_pct,
+			    start1_pct, end1_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
+    }
+
+    while ( end2_pct < 1.0 ) {
+	start2_pct = end2_pct;
+	end2_pct = start2_pct + rest_inc;
 
 	gen_runway_section( rwy_info, runway_b,
-			    start_pct, end_pct,
+			    start2_pct, end2_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
diff --git a/src/Airports/GenAirports/rwy_visual.cxx b/src/Airports/GenAirports/rwy_visual.cxx
index e0a45af8..77925ac8 100644
--- a/src/Airports/GenAirports/rwy_visual.cxx
+++ b/src/Airports/GenAirports/rwy_visual.cxx
@@ -137,6 +137,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, rev_letter,
 			    rwy_polys, texparams, accum );
@@ -144,6 +145,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, letter,
 			    rwy_polys, texparams, accum );
@@ -195,6 +197,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -202,6 +205,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -215,6 +219,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -222,6 +227,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -240,6 +246,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "aim",
 			    rwy_polys, texparams, accum );
@@ -247,6 +254,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "aim",
 			    rwy_polys, texparams, accum );
@@ -270,6 +278,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_a,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
@@ -277,6 +286,7 @@ void gen_visual_rwy( const TGRunway& rwy_info,
 	gen_runway_section( rwy_info, runway_b,
 			    start_pct, end_pct,
 			    0.0, 1.0,
+                            0.0, 1.0, 0.0, 1.0,
 			    rwy_info.heading + 180.0,
 			    material, "rest",
 			    rwy_polys, texparams, accum );
diff --git a/src/Airports/GenAirports/texparams.hxx b/src/Airports/GenAirports/texparams.hxx
index fb0256e4..8b1f118b 100644
--- a/src/Airports/GenAirports/texparams.hxx
+++ b/src/Airports/GenAirports/texparams.hxx
@@ -48,6 +48,11 @@ private:
     double length;
     double heading;
 
+    double minu;
+    double maxu;
+    double minv;
+    double maxv;
+
 public:
 
     // Constructor and destructor
@@ -58,6 +63,9 @@ public:
 	width = w;
 	length = l;
 	heading = h;
+
+        minu = minv = 0.0;
+        maxu = maxv = 1.0;
     }
     inline ~TGTexParams( void ) { }
 
@@ -72,6 +80,18 @@ public:
 
     inline double get_heading() const { return heading; }
     inline void set_heading( const double h ) { heading = h; }
+
+    inline double get_minu() const { return minu; }
+    inline void set_minu( const double x ) { minu = x; }
+
+    inline double get_maxu() const { return maxu; }
+    inline void set_maxu( const double x ) { maxu = x; }
+
+    inline double get_minv() const { return minv; }
+    inline void set_minv( const double x ) { minv = x; }
+
+    inline double get_maxv() const { return maxv; }
+    inline void set_maxv( const double x ) { maxv = x; }
 };
 
 
diff --git a/src/Airports/xp2runway.pl b/src/Airports/xp2runway.pl
deleted file mode 100755
index f309835b..00000000
--- a/src/Airports/xp2runway.pl
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/perl
-#
-# Convert the XP apt.dat format to FlightGear's default.rwy format
-#
-# Data source is:
-#
-#     http://www.x-plane.org/users/robinp/
-#
-# Written by Curt Olson <curt@flightgear.org> Started Aug 2003
-
-use strict;
-
-my( $line );
-my( @F );
-my( $apt_id ) = "";
-
-# strip the first line
-$line = <>;
-
-# copy the license / source / credits line
-$line = <>;
-print "// " . $line;
-
-while ( <> ) {
-    @F = split( /\s+/, $_ );
-    if ( $F[0] == 1 ) {
-        # print "airport = " . $_;
-
-        # current airport definition
-        $apt_id = $F[4];
-    } elsif ( $F[0] == 10 ) {
-        # runway/taxiway definition
-        # print "runway = " . $_;
-        my( $rwy_no ) = $F[3];
-        $rwy_no =~ s/x+$//;
-        my( $xpvasi1, $xprwy1, $xpappr1,
-            $xpvasi2, $xprwy2, $xpappr2 )
-            = $F[9] =~ m/(\d)(\d)(\d)(\d)(\d)(\d)/;
-
-        my( $cll );
-        if ( $xprwy1 >= 4 || $xprwy2 >= 4 ) {
-            $cll = "Y";
-        } else {
-            $cll = "N";
-        }
-
-        my( $xpsurf ) = $F[10];
-        my( $surface );
-        if ( $xpsurf eq "01" ) {
-            $surface = "A";
-        } elsif ( $xpsurf eq "02" ) {
-            $surface = "C";
-        } elsif ( $xpsurf eq "03" ) {
-            $surface = "T";
-        } elsif ( $xpsurf eq "04" ) {
-            $surface = "D";
-        } elsif ( $xpsurf eq "05" ) {
-            $surface = "G";
-        } elsif ( $xpsurf eq "06" ) {
-            $surface = "A";
-        } elsif ( $xpsurf eq "07" ) {
-            $surface = "C";
-        } elsif ( $xpsurf eq "08" ) {
-            $surface = "T";
-        } elsif ( $xpsurf eq "09" ) {
-            $surface = "D";
-        } elsif ( $xpsurf eq "10" ) {
-            $surface = "A";
-        } elsif ( $xpsurf eq "11" ) {
-            $surface = "C";
-        } elsif ( $xpsurf eq "12" ) {
-            $surface = "L";
-        } elsif ( $xpsurf eq "13" ) {
-            $surface = "W";
-        } else {
-            die "unknown surface code = $xpsurf\n";
-        }
-
-        my( $xpmarkings ) = $F[12];
-        my( $markings );
-        if ( $xpmarkings == 0 ) {
-            $markings = "V";
-        } elsif ( $xpmarkings == 1 ) {
-            $markings = "V";
-        } elsif ( $xpmarkings == 2 ) {
-            $markings = "R";
-        } elsif ( $xpmarkings == 3 ) {
-            $markings = "P";
-        } elsif ( $xpmarkings == 4 ) {
-            $markings = "H";
-        } else {
-            die "unknown markings code = $xpmarkings\n";
-        }
-
-        my( $edgelights );
-        if ( $xprwy1 >= 2 || $xprwy2 >= 2 ) {
-            $edgelights = "H";
-        } else {
-            $edgelights = "N";
-        }
-
-        my( $rwy_codes ) = "$cll$surface$markings$edgelights" . "N";
-
-        my( $tdz1 );
-        if ( $xprwy1 >= 5 ) {
-            $tdz1 = "Y";
-        } else {
-            $tdz1 = "N";
-        }
-
-        my( $tdz2 );
-        if ( $xprwy2 >= 5 ) {
-            $tdz2 = "Y";
-        } else {
-            $tdz2 = "N";
-        }
-
-        my( $reil1 );
-        if ( $xprwy1 >= 3 ) {
-            $reil1 = "Y";
-        } else {
-            $reil1 = "N";
-        }
-
-        my( $reil2 );
-        if ( $xprwy2 >= 3 ) {
-            $reil2 = "Y";
-        } else {
-            $reil2 = "N";
-        }
-
-        my( $vasi1 );
-        if ( $xpvasi1 == 1 ) {
-            $vasi1 = "N";
-        } elsif ( $xpvasi1 == 2 ) {
-            $vasi1 = "V";
-        } elsif ( $xpvasi1 == 3 ) {
-            $vasi1 = "P";
-        } elsif ( $xpvasi1 == 4 ) {
-            $vasi1 = "P";
-        }
-
-        my( $vasi2 );
-        if ( $xpvasi2 == 1 ) {
-            $vasi2 = "N";
-        } elsif ( $xpvasi2 == 2 ) {
-            $vasi2 = "V";
-        } elsif ( $xpvasi2 == 3 ) {
-            $vasi2 = "P";
-        } elsif ( $xpvasi2 == 4 ) {
-            $vasi2 = "P";
-        }
-
-        my( $appr1 );
-        if ( $xpappr1 == 0 ) {
-            $appr1 = "N";
-        } elsif ( $xpappr1 == 1 ) {
-            $appr1 = "N";
-        } elsif ( $xpappr1 == 2 ) {
-            $appr1 = "S";
-        } elsif ( $xpappr1 == 3 ) {
-            $appr1 = "P";
-        } elsif ( $xpappr1 == 4 ) {
-            $appr1 = "B";
-        } elsif ( $xpappr1 == 5 ) {
-            $appr1 = "C";
-        } elsif ( $xpappr1 == 6 ) {
-            $appr1 = "L";
-        } elsif ( $xpappr1 == 7 ) {
-            $appr1 = "D";
-        } elsif ( $xpappr1 == 8 ) {
-            $appr1 = "E";
-        } else {
-            die "unknown approach lighting code = $xpappr1\n";
-        }
-        
-        my( $appr2 );
-        if ( $xpappr2 == 0 ) {
-            $appr2 = "N";
-        } elsif ( $xpappr2 == 1 ) {
-            $appr2 = "N";
-        } elsif ( $xpappr2 == 2 ) {
-            $appr2 = "S";
-        } elsif ( $xpappr2 == 3 ) {
-            $appr2 = "P";
-        } elsif ( $xpappr2 == 4 ) {
-            $appr2 = "B";
-        } elsif ( $xpappr2 == 5 ) {
-            $appr2 = "C";
-        } elsif ( $xpappr2 == 6 ) {
-            $appr2 = "L";
-        } elsif ( $xpappr2 == 7 ) {
-            $appr2 = "D";
-        } elsif ( $xpappr2 == 8 ) {
-            $appr2 = "E";
-        } else {
-            die "unknown approach lighting code = $xpappr2\n";
-        }
-        
-        my( $end1_codes, $end2_codes );
-
-        $end1_codes = "$tdz1$reil1$vasi1$appr1";
-        $end2_codes = "$tdz2$reil2$vasi2$appr2";
-
-        my( $end1_thresh, $end2_thresh ) = split( /\./, $F[6] );
-        my( $end1_stopway, $end2_stopway ) = split( /\./, $F[7] );
-
-        my( $taxi_edge );
-        if ( $xprwy1 >= 6 || $xprwy2 >= 6 ) {
-            $taxi_edge = "B";
-        } else {
-            $taxi_edge = "N";
-        }
-
-        my( $taxi_codes );
-        $taxi_codes = "$cll$surface$taxi_edge";
-
-        if ( $F[3] ne "xxx" ) {
-            # runway definition
-            printf("R %-4s %-3s %10.6f %11.6f %6.2f %5d %3d %s %s %4d %4d %s %4d %4d\n",
-                   $apt_id, $rwy_no, $F[1], $F[2], $F[4], $F[5], $F[8],
-                   $rwy_codes,
-                   $end1_codes, $end1_thresh, $end1_stopway,
-                   $end2_codes, $end2_thresh, $end2_stopway );
-        } else {
-            # taxiway definition
-            printf("T %-4s xxx %10.6f %11.6f %6.2f %5d %3d %s\n",
-                   $apt_id, $F[1], $F[2], $F[4], $F[5], $F[8],
-                   $taxi_codes );
-        }
-    } else {
-        # something we don't know how to handle right now
-    }
-}
diff --git a/src/Airports/xp2simpleapt.pl b/src/Airports/xp2simpleapt.pl
deleted file mode 100755
index 0fe99b97..00000000
--- a/src/Airports/xp2simpleapt.pl
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/perl
-#
-# Convert the XP apt.dat format to FlightGear's "simple.apt" format
-#
-# Data source is:
-#
-#     http://www.x-plane.org/users/robinp/
-#
-# Written by Curt Olson <curt@flightgear.org> Started Aug 2003
-
-use strict;
-
-my( $line );
-my( @F );
-my( $last_apt ) = "";
-my( $last_elev ) = "";
-my( $last_name ) = "";
-my( $apt_type ) = "C";
-my( $rwy_lon ) = 0.0;
-my( $rwy_lat ) = 0.0;
-my( $has_tower ) = 0;
-my( $default_bldgs ) = 0;
-my( $count ) = 0;
-
-# strip the first line
-$line = <>;
-
-# copy the license / source / credits line
-$line = <>;
-print "// " . $line;
-
-while ( <> ) {
-    @F = split( /\s+/, $_ );
-    if ( $F[0] == 1 ) {
-        # print "airport = " . $_;
-
-        if ( $last_apt ne "" ) {
-            # print out airport definition line
-            my( $lon ) = $rwy_lon / $count;
-            my( $lat ) = $rwy_lat / $count;
-            printf( "A %-4s %10.6f %11.6f %5d %s%s%s %s\n",
-                    $last_apt, $lat, $lon, $last_elev,
-                    $apt_type, $has_tower, $default_bldgs, $last_name );
-        }
-
-        # current airport definition
-        $last_elev = $F[1];
-        $apt_type = "C";
-        if( $F[2] ) {
-            $has_tower = "Y";
-        } else {
-            $has_tower = "N";
-        }
-        if ( $F[3] ) {
-            $default_bldgs = "Y";
-        } else {
-            $default_bldgs = "N";
-        }
-        $last_apt = $F[4];
-        $last_name = $F[5];
-        for( my($i) = 6; $i <= $#F; ++$i ) {
-            $last_name .= " " . $F[$i];
-        }
-        $count = 0;
-        $rwy_lon = 0.0;
-        $rwy_lat = 0.0;
-    } elsif ( $F[0] == 10 ) {
-        if ( $F[3] ne "xxx" ) {
-            # runway definition
-            # print "runway = " . $_;
-            $rwy_lon += $F[2];
-            $rwy_lat += $F[1];
-            $count++;
-        } else {
-            # taxiway definition
-        }
-    } else {
-        # something we don't know how to handle right now
-    }
-}
-
-# grab that last data point
-if ( $last_apt ne "" ) {
-    # print out airport definition line
-    my( $lon ) = $rwy_lon / $count;
-    my( $lat ) = $rwy_lat / $count;
-    printf( "A %-4s %10.6f %11.6f %5d %s%s%s %s\n",
-            $last_apt, $lat, $lon, $last_elev,
-            $apt_type, $has_tower, $default_bldgs, $last_name );
-}