diff --git a/src/Airports/GenAirports850/build.cxx b/src/Airports/GenAirports850/build.cxx index 92414298..e9ff5f20 100644 --- a/src/Airports/GenAirports850/build.cxx +++ b/src/Airports/GenAirports850/build.cxx @@ -254,7 +254,9 @@ static void build_runway( const TGRunway& rwy_info, { gen_simple_rwy( rwy_info, alt_m, material, rwy_polys, texparams, accum ); - } else if ( rwy_info.marking_code1 == 3 || + } else if (rwy_info.marking_code1 == 5 || + rwy_info.marking_code1 == 4 || + rwy_info.marking_code1 == 3 || rwy_info.marking_code1 == 2 || rwy_info.marking_code1 == 1 || rwy_info.marking_code1 == 0 ) { @@ -267,7 +269,7 @@ static void build_runway( const TGRunway& rwy_info, // 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 = " << + SG_LOG( SG_GENERAL, SG_ALERT, "Unknown runway marking code = " << rwy_info.marking_code1 ); throw sg_exception("Unknown runway code in build.cxx:build_airport()"); } diff --git a/src/Airports/GenAirports850/rwy_gen.cxx b/src/Airports/GenAirports850/rwy_gen.cxx index 417afbaa..9efd981a 100644 --- a/src/Airports/GenAirports850/rwy_gen.cxx +++ b/src/Airports/GenAirports850/rwy_gen.cxx @@ -29,87 +29,109 @@ using std::string; -struct marking +struct sections { const char* tex; int size; }; -void gen_prec_marking( const TGRunway& rwy_info, +void gen_rw_marking( const TGRunway& rwy_info, const TGPolygon& runway, double &start1_pct, double &end1_pct, double heading, const string& material, superpoly_list *rwy_polys, texparams_list *texparams, - TGPolygon *accum) { + TGPolygon *accum, int marking) { + std::vector<sections> rw_marking_list; + + if (marking == 5){ + // UK Precision runway sections from after the designation number + // onwards to the middle (one half). + // Set order of sections and their corresponding size + static const struct sections uk_prec[] = { + { "tz_one_a", 380 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "aim_uk", 400 * SG_FEET_TO_METER }, + { "tz_one_a", 400 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_one_b", 200 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_one_a", 400 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_one_b", 200 * SG_FEET_TO_METER } + }; + rw_marking_list.clear(); + rw_marking_list.insert( rw_marking_list.begin(), uk_prec, uk_prec + sizeof(uk_prec) / sizeof(uk_prec[0]) ); + } + + else if (marking == 4){ + // UK non-precision runway sections from after the designation number + // onwards to the middle (one half). + // Set order of sections and their corresponding size + static const struct sections uk_nprec[] = { + { "centerline", 200 * SG_FEET_TO_METER }, + { "aim_uk", 400 * SG_FEET_TO_METER }, + }; + rw_marking_list.clear(); + rw_marking_list.insert( rw_marking_list.begin(), uk_nprec, uk_nprec + sizeof(uk_nprec) / sizeof(uk_nprec[0]) ); + } + + else if (marking == 3){ // Precision runway sections from after the designation number // onwards to the middle (one half). // Set order of sections and their corresponding size - static const struct marking prec_rw[] = { - { "tz_three", 380 * SG_FEET_TO_METER }, - { "rest", 200 * SG_FEET_TO_METER }, - { "aim", 400 * SG_FEET_TO_METER }, - { "tz_two_a", 400 * SG_FEET_TO_METER }, - { "rest", 200 * SG_FEET_TO_METER }, - { "tz_two_b", 200 * SG_FEET_TO_METER }, - { "rest", 200 * SG_FEET_TO_METER }, - { "tz_one_a", 400 * SG_FEET_TO_METER }, - { "rest", 200 * SG_FEET_TO_METER }, - { "tz_one_b", 200 * SG_FEET_TO_METER } - }; - - double length = rwy_info.length / 2.0 + 2.0 * SG_FEET_TO_METER; - - for ( int i=0; i < sizeof prec_rw / sizeof prec_rw[0]; ++i) { - SG_LOG(SG_GENERAL, SG_INFO, "PREC_RW = " << prec_rw[i].tex << " lenght: " << prec_rw[i].size); - start1_pct = end1_pct; - end1_pct = start1_pct + ( prec_rw[i].size / length ); - gen_runway_section( rwy_info, runway, - start1_pct, end1_pct, - 0.0, 1.0, - 0.0, 1.0, 0.0, 1.0, - heading, - material, prec_rw[i].tex, - rwy_polys, texparams, accum ); + static const struct sections prec[] = { + { "tz_three", 380 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "aim", 400 * SG_FEET_TO_METER }, + { "tz_two_a", 400 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_two_b", 200 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_one_a", 400 * SG_FEET_TO_METER }, + { "rest", 200 * SG_FEET_TO_METER }, + { "tz_one_b", 200 * SG_FEET_TO_METER } + }; + rw_marking_list.clear(); + rw_marking_list.insert( rw_marking_list.begin(), prec, prec + sizeof(prec) / sizeof(prec[0]) ); } -} - -void gen_non_prec_marking( const TGRunway& rwy_info, - const TGPolygon& runway, - double &start1_pct, double &end1_pct, - double heading, - const string& material, - superpoly_list *rwy_polys, - texparams_list *texparams, - TGPolygon *accum) { - + else if (marking == 2){ // Non-precision runway sections from after the designation number // onwards to the middle (one half). // Set order of sections and their corresponding size - static const struct marking non_prec_rw[] = { - { "centerline", 200 * SG_FEET_TO_METER }, - { "aim", 400 * SG_FEET_TO_METER } - }; + static const struct sections nprec[] = { + { "centerline", 200 * SG_FEET_TO_METER }, + { "aim", 400 * SG_FEET_TO_METER } + }; + rw_marking_list.clear(); + rw_marking_list.insert( rw_marking_list.begin(), nprec, nprec + sizeof(nprec) / sizeof(nprec[0]) ); + } - double length = rwy_info.length / 2.0 + 2.0 * SG_FEET_TO_METER; + //Now create the sections of the runway type + double length = rwy_info.length / 2.0 + 0.5; - for ( int i=0; i < sizeof non_prec_rw / sizeof non_prec_rw[0]; ++i) { - SG_LOG(SG_GENERAL, SG_INFO, "NON_PREC_RW = " << non_prec_rw[i].tex << " lenght: " << non_prec_rw[i].size); - start1_pct = end1_pct; - end1_pct = start1_pct + ( non_prec_rw[i].size / length ); - gen_runway_section( rwy_info, runway, + for ( int i=0; i < rw_marking_list.size(); ++i) { + SG_LOG(SG_GENERAL, SG_INFO, "Runway section texture = " << rw_marking_list[i].tex << " lenght: " << rw_marking_list[i].size); + + if ( end1_pct < 1.0 ) { + start1_pct = end1_pct; + end1_pct = start1_pct + ( rw_marking_list[i].size / length ); + gen_runway_section( rwy_info, runway, start1_pct, end1_pct, - 0.0, 1.0, - 0.0, 1.0, 0.0, 1.0, - heading, - material, non_prec_rw[i].tex, - rwy_polys, texparams, accum ); + 0.0, 1.0, + 0.0, 1.0, 0.0, 1.0, + heading, + material, rw_marking_list[i].tex, + rwy_polys, texparams, accum ); + } } } + + // generate a runway. The routine modifies // rwy_polys, texparams, and accum. For specific details and // dimensions of precision runway markings, please refer to FAA @@ -140,8 +162,7 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ if (rwhalf == 1) { - //Create first half of the runway (first entry in apt.dat) - // runway half "b" (actually the first half) + //Create the first half of the runway (first entry in apt.dat) runway_half.erase(); runway_half.add_node( 0, runway.get_pt(0, 3) ); runway_half.add_node( 0, runway.get_pt(0, 4) ); @@ -151,14 +172,14 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ else if (rwhalf == 2) { - // runway half "a" (actually the second half in apt.dat) + //Create the second runway half from apt.dat runway_half.erase(); runway_half.add_node( 0, runway.get_pt(0, 0) ); runway_half.add_node( 0, runway.get_pt(0, 1) ); runway_half.add_node( 0, runway.get_pt(0, 2) ); runway_half.add_node( 0, runway.get_pt(0, 5) ); } - + Point3D p; SG_LOG(SG_GENERAL, SG_DEBUG, "raw runway half pts (run " << rwhalf << ")"); for ( i = 0; i < runway_half.contour_size( 0 ); ++i ) { @@ -166,16 +187,17 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ SG_LOG(SG_GENERAL, SG_DEBUG, " point = " << p); } - // we add 2' to the length for texture overlap. This puts the + // we add 0.5m to the length for texture overlap. This puts the // lines on the texture back to the edge of the runway where they // belong. - double length = rwy_info.length / 2.0 + 2.0 * SG_FEET_TO_METER; + double length = rwy_info.length / 2.0 + 0.5; if ( length < 3075 * SG_FEET_TO_METER ) { SG_LOG( SG_GENERAL, SG_ALERT, "Runway " << rwy_info.rwy_no1 << " is not long enough (" << rwy_info.length << ") for precision markings!"); } + int marking = 0; double start1_pct = 0.0; double end1_pct = 0.0; double disp_thresh = 0.0; @@ -189,18 +211,20 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ // if (rwhalf == 1) { + marking = rwy_info.marking_code1; disp_thresh = rwy_info.disp_thresh1; heading = rwy_info.heading + 180.0; rwname = rwy_info.rwy_no1; stopway = rwy_info.stopway1; } else if (rwhalf == 2) { + marking = rwy_info.marking_code2; disp_thresh = rwy_info.disp_thresh2; heading = rwy_info.heading; rwname = rwy_info.rwy_no2; stopway = rwy_info.stopway2; } - + SG_LOG( SG_GENERAL, SG_INFO, "runway marking = " << marking ); if ( disp_thresh > 0.0 ) { SG_LOG( SG_GENERAL, SG_INFO, "Displaced threshold for RW side " << rwhalf << " is " << disp_thresh ); @@ -252,7 +276,7 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ } - if ((rwhalf == 1 && !rwy_info.marking_code1 == 0) || (rwhalf == 2 && !rwy_info.marking_code2 == 0)){ + if (!marking == 0){ // // Threshold @@ -329,21 +353,14 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ } - if ((rwhalf == 1 && rwy_info.marking_code1 == 3) || (rwhalf == 2 && rwy_info.marking_code2 == 3)){ - gen_prec_marking( rwy_info, runway_half, + if (marking > 1){ + // Generate remaining markings depending on type of runway + gen_rw_marking( rwy_info, runway_half, start1_pct, end1_pct, heading, material, - rwy_polys, texparams, accum ); + rwy_polys, texparams, accum, marking ); } - if ((rwhalf == 1 && rwy_info.marking_code1 == 2) || (rwhalf == 2 && rwy_info.marking_code2 == 2)){ - gen_non_prec_marking( rwy_info, runway_half, - start1_pct, end1_pct, - heading, material, - rwy_polys, texparams, accum ); - } - - // // The rest ... // @@ -374,6 +391,4 @@ for ( int rwhalf=1; rwhalf<3; ++rwhalf ){ } - - }