1
0
Fork 0

Implement individual runway markings for both ends.

Simplified code a lot, removed runway-specific files with
a lot of duplicate code. Put marking logic into
functions.
This commit is contained in:
Christian Schmitt 2011-09-13 18:28:42 +02:00
parent 8ac29ac8a8
commit 66fc88c666
4 changed files with 200 additions and 513 deletions

View file

@ -275,7 +275,7 @@ static void build_runway( const TGRunway& rwy_info,
}
SG_LOG(SG_GENERAL, SG_DEBUG, "marking code = " << rwy_info.marking_code);
SG_LOG(SG_GENERAL, SG_DEBUG, "marking code = " << rwy_info.marking_code1 << " / " << rwy_info.marking_code2);
if ( rwy_info.really_taxiway ) {
gen_taxiway( rwy_info, alt_m, material,
@ -286,20 +286,11 @@ 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_code == 3 /* Precision */ ) {
// precision runway markings
gen_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if ( rwy_info.marking_code == 2 /* Non-precision */ ) {
// non-precision runway markings
gen_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if ( rwy_info.marking_code == 1 /* Visual */ ) {
// visual runway markings
gen_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if ( rwy_info.marking_code == 0 /* No known markings, lets assume Visual */ ) {
// visual runway markings
} else if ( rwy_info.marking_code1 == 3 ||
rwy_info.marking_code1 == 2 ||
rwy_info.marking_code1 == 1 ||
rwy_info.marking_code1 == 0 ) {
gen_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if ( surface_code == 13 /* Water buoys */ ) {
@ -309,7 +300,7 @@ static void build_runway( const TGRunway& rwy_info,
// 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 );
rwy_info.marking_code1 );
throw sg_exception("Unknown runway code in build.cxx:build_airport()");
}
@ -380,6 +371,10 @@ void build_airport( string airport_id, float alt_m,
rwy.really_taxiway = (rwy.rwy_no1 == "xxx");
rwy.generated = false;
rwy.surface_code = atoi( token[2].c_str() );
rwy.shoulder_code = token[3];
rwy.smoothness = atof( token[4].c_str() );
//first runway end coordinates
double lat_1 = atof( token[9].c_str() );
double lon_1 = atof( token[10].c_str() );
@ -422,11 +417,11 @@ void build_airport( string airport_id, float alt_m,
rwy.stopway1 = atoi( token[12].c_str() ) * SG_METER_TO_FEET;
rwy.stopway2 = atoi( token[21].c_str() ) * SG_METER_TO_FEET;
rwy.marking_code1 = atoi( token[13].c_str() );
rwy.marking_code2 = atoi( token[22].c_str() );
rwy.lighting_flags = token[9];
rwy.surface_code = atoi( token[2].c_str() );
rwy.shoulder_code = token[3];
rwy.marking_code = atoi( token[13].c_str() );
rwy.smoothness = atof( token[4].c_str() );
rwy.dist_remaining = (atoi( token[14].c_str() ) == 1 );
if (token.size()>15) {
@ -446,7 +441,7 @@ void build_airport( string airport_id, float alt_m,
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, " mrkgs1/2 = " << rwy.marking_code1 << " / " << rwy.marking_code2);
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);
@ -528,13 +523,11 @@ void build_airport( string airport_id, float alt_m,
}
}
TGSuperPoly sp;
TGTexParams tp;
// First pass: generate the precision runways since these have
// precidence
for ( i = 0; i < (int)runways.size(); ++i ) {
if ( runways[i].marking_code == 3 /* Precision */ ) {
if ( runways[i].marking_code1 == 3 /* Precision */ ) {
build_runway( runways[i], alt_m,
&rwy_polys, &texparams, &accum,
&apt_base, &apt_clearing );
@ -543,8 +536,8 @@ 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 ) {
if ( runways[i].marking_code == 2 /* Non-precision */
|| runways[i].marking_code == 1 /* Visual */ )
if ( runways[i].marking_code1 == 2 /* Non-precision */
|| runways[i].marking_code1 == 1 /* Visual */ )
{
if ( runways[i].surface_code != 13 /* Water */ ) {
// only build non-water runways
@ -557,9 +550,9 @@ 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 ) {
if ( runways[i].marking_code != 3 /* Precision */
&& runways[i].marking_code != 2 /* Non-precision */
&& runways[i].marking_code != 1 /* Visual */ )
if ( runways[i].marking_code1 != 3 /* Precision */
&& runways[i].marking_code1 != 2 /* Non-precision */
&& runways[i].marking_code1 != 1 /* Visual */ )
{
if ( runways[i].surface_code != 6 /* Asphalt Helipad */ &&
runways[i].surface_code != 7 /* Concrete Helipad */ &&
@ -577,37 +570,6 @@ void build_airport( string airport_id, float alt_m,
// 4th pass: generate all taxiways
#if 0
// we want to generate in order of largest size first so this will
// look a little weird, but that's all I'm doing, otherwise a
// simple list traversal would work fine.
bool done = false;
while ( !done ) {
// find the largest taxiway
int largest_idx = -1;
double max_size = 0;
for ( i = 0; i < (int)taxiways.size(); ++i ) {
SG_LOG( SG_GENERAL, SG_DEBUG, "taxiway i = " << i );
double size = taxiways[i].length * taxiways[i].width;
if ( size > max_size && !taxiways[i].generated ) {
SG_LOG( SG_GENERAL, SG_DEBUG, "taxiway max i = " << i );
max_size = size;
largest_idx = i;
}
}
if ( largest_idx >= 0 ) {
SG_LOG( SG_GENERAL, SG_DEBUG, "generating " << largest_idx );
build_runway( taxiways[largest_idx], alt_m,
&rwy_polys, &texparams, &accum,
&apt_base, &apt_clearing );
taxiways[largest_idx].generated = true;
} else {
SG_LOG( SG_GENERAL, SG_DEBUG, "done with taxiways." );
done = true;
}
}
#else
/* Ralf Gerlich: Generate Taxiways in specified order from bottom to top */
for ( i=0; i<taxiways.size(); ++i ) {
SG_LOG( SG_GENERAL, SG_DEBUG, "generating " << i );
@ -616,7 +578,6 @@ void build_airport( string airport_id, float alt_m,
&apt_base, &apt_clearing );
taxiways[i].generated = true;
}
#endif
// Now generate small surface for each beacon
TGPolygon obj_base, obj_safe_base;

View file

@ -51,7 +51,8 @@ struct TGRunway {
std::string lighting_flags;
int surface_code;
std::string shoulder_code;
int marking_code;
int marking_code1;
int marking_code2;
double smoothness;
bool dist_remaining;

View file

@ -64,15 +64,7 @@ void gen_number_block( const TGRunway& rwy_info,
// printf("tex1 = '%s' tex2 = '%s'\n", tex1, tex2);
if ( num < 10 ) {
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 if ( num == 11 ) {
if ( num < 10 || num == 11 ) {
gen_runway_section( rwy_info, poly,
start_pct, end_pct,
0.0, 1.0,

View file

@ -18,8 +18,6 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// $Id: rwy_gen.cxx,v 1.18 2004-11-19 22:25:49 curt Exp $
//
#include <simgear/compiler.h>
#include <simgear/constants.h>
@ -31,7 +29,87 @@
using std::string;
struct marking
{
const char* tex;
int size;
};
void gen_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) {
// 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 },
{ "rest", 200 },
{ "aim", 400 },
{ "tz_two_a", 400 },
{ "rest", 200 },
{ "tz_two_b", 200 },
{ "rest", 200 },
{ "tz_one_a", 400 },
{ "rest", 200 },
{ "tz_one_b", 200 }
};
double length = rwy_info.length / 2.0 + 2.0;
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 );
}
}
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) {
// 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 },
{ "aim", 400 }
};
double length = rwy_info.length / 2.0 + 2.0;
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,
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 );
}
}
// generate a runway. The routine modifies
// rwy_polys, texparams, and accum. For specific details and
// dimensions of precision runway markings, please refer to FAA
@ -56,42 +134,37 @@ void gen_rwy( const TGRunway& rwy_info,
2 * SG_FEET_TO_METER,
2 * SG_FEET_TO_METER );
// runway half "a" (actually the reverse half)
TGPolygon runway_a;
runway_a.erase();
runway_a.add_node( 0, runway.get_pt(0, 0) );
runway_a.add_node( 0, runway.get_pt(0, 1) );
runway_a.add_node( 0, runway.get_pt(0, 2) );
runway_a.add_node( 0, runway.get_pt(0, 5) );
TGPolygon runway_half;
for ( int rwhalf=1; rwhalf<3; ++rwhalf ){
// runway half "b" (actually the forward half)
TGPolygon runway_b;
runway_b.erase();
runway_b.add_node( 0, runway.get_pt(0, 3) );
runway_b.add_node( 0, runway.get_pt(0, 4) );
runway_b.add_node( 0, runway.get_pt(0, 5) );
runway_b.add_node( 0, runway.get_pt(0, 2) );
if (rwhalf == 1) {
//Create first half of the runway (first entry in apt.dat)
// runway half "b" (actually the first half)
runway_half.erase();
runway_half.add_node( 0, runway.get_pt(0, 3) );
runway_half.add_node( 0, runway.get_pt(0, 4) );
runway_half.add_node( 0, runway.get_pt(0, 5) );
runway_half.add_node( 0, runway.get_pt(0, 2) );
}
else if (rwhalf == 2) {
// runway half "a" (actually the second half in 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 pts (a half)");
for ( i = 0; i < runway_a.contour_size( 0 ); ++i ) {
p = runway_a.get_pt(0, i);
SG_LOG(SG_GENERAL, SG_DEBUG, "raw runway half pts (run " << rwhalf << ")");
for ( i = 0; i < runway_half.contour_size( 0 ); ++i ) {
p = runway_half.get_pt(0, i);
SG_LOG(SG_GENERAL, SG_DEBUG, " point = " << p);
}
SG_LOG(SG_GENERAL, SG_DEBUG, "raw runway pts (b half)");
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);
}
//
// Setup some variables and values to help us chop up the runway
// into its various sections
//
TGSuperPoly sp;
TGTexParams tp;
// we add 2' to the length for texture overlap. This puts the
// lines on the texture back to the edge of the runway where they
@ -104,70 +177,36 @@ void gen_rwy( const TGRunway& rwy_info,
}
double start1_pct = 0.0;
double start2_pct = 0.0;
double end1_pct = 0.0;
double end2_pct = 0.0;
double disp_thresh = 0.0;
double heading = 0.0;
double stopway = 0.0;
string rwname;
//
// Displaced threshold if it exists
//
if ( rwy_info.disp_thresh1 > 0.0 ) {
SG_LOG( SG_GENERAL, SG_INFO, "Forward displaced threshold = "
<< rwy_info.disp_thresh1 );
// reserve 90' for final arrows
double thresh = rwy_info.disp_thresh1 - 90.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 );
if (rwhalf == 1) {
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) {
disp_thresh = rwy_info.disp_thresh2;
heading = rwy_info.heading;
rwname = rwy_info.rwy_no2;
stopway = rwy_info.stopway2;
}
// final arrows
start2_pct = end2_pct;
end2_pct = start2_pct + ( 90.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 );
}
if ( rwy_info.disp_thresh2 > 0.0 ) {
SG_LOG( SG_GENERAL, SG_INFO, "Reverse displaced threshold = "
<< rwy_info.disp_thresh2 );
if ( disp_thresh > 0.0 ) {
SG_LOG( SG_GENERAL, SG_INFO, "Displaced threshold for RW side " << rwhalf << " is "
<< disp_thresh );
// reserve 90' for final arrows
double thresh = rwy_info.disp_thresh2 - 90.0;
double thresh = disp_thresh - 90.0;
// number of full center arrows
int count = (int)(thresh / 200.0);
@ -179,11 +218,11 @@ void gen_rwy( const TGRunway& rwy_info,
// starting (possibly partial chunk)
start1_pct = end1_pct;
end1_pct = start1_pct + ( part_len / length );
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, tex_pct, 1.0,
rwy_info.heading,
heading,
material, "dspl_thresh",
rwy_polys, texparams, accum );
@ -191,11 +230,11 @@ void gen_rwy( const TGRunway& rwy_info,
for ( i = 0; i < count; ++i ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200.0 / length );
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
heading,
material, "dspl_thresh",
rwy_polys, texparams, accum );
}
@ -203,94 +242,63 @@ void gen_rwy( const TGRunway& rwy_info,
// final arrows
start1_pct = end1_pct;
end1_pct = start1_pct + ( 90.0 / length );
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
heading,
material, "dspl_arrows",
rwy_polys, texparams, accum );
}
if ((rwhalf == 1 && !rwy_info.marking_code1 == 0) || (rwhalf == 2 && !rwy_info.marking_code2 == 0)){
//
// Threshold
//
start1_pct = end1_pct;
end1_pct = start1_pct + ( 202.0 / length );
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
heading,
material, "threshold",
rwy_polys, texparams, accum );
start2_pct = end2_pct;
end2_pct = start2_pct + ( 202.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, "threshold",
rwy_polys, texparams, accum );
//
// Runway designation letter
//
int len = rwy_info.rwy_no1.length();
string letter1 = "";
string letter2 = "";
int len = rwname.length();
string letter = "";
for ( i = 0; i < len; ++i ) {
string tmp = rwy_info.rwy_no1.substr(i, 1);
string tmp = rwname.substr(i, 1);
if ( tmp == "L" ) {
letter1 = "L";
letter = "L";
} else if ( tmp == "R" ) {
letter1 = "R";
letter = "R";
} else if ( tmp == "C" ) {
letter1 = "C";
letter = "C";
}
}
len = rwy_info.rwy_no2.length();
for ( i = 0; i < len; ++i ) {
string tmp = rwy_info.rwy_no2.substr(i, 1);
if ( tmp == "L" ) {
letter2 = "L";
} else if ( tmp == "R" ) {
letter2 = "R";
} else if ( tmp == "C" ) {
letter2 = "C";
}
}
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation1 = " << rwy_info.rwy_no1);
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation letter1 = " << letter1);
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation2 = " << rwy_info.rwy_no2);
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation letter2 = " << letter2);
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation1 = " << rwname);
SG_LOG(SG_GENERAL, SG_DEBUG, "Runway designation letter1 = " << letter);
//TODO: add empty airport end generation
if ( !letter1.empty() && !letter2.empty() ) {
if ( !letter.empty() ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 90.0 / length );
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
material, letter2,
rwy_polys, texparams, accum );
start2_pct = end2_pct;
end2_pct = start2_pct + ( 90.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, letter1,
heading,
material, letter,
rwy_polys, texparams, accum );
}
@ -298,301 +306,43 @@ void gen_rwy( const TGRunway& rwy_info,
// Runway designation number(s)
//
len = rwy_info.rwy_no1.length();
string snum1 = rwy_info.rwy_no1;
len = rwname.length();
string snum = rwname;
for ( i = 0; i < len; ++i ) {
string tmp = rwy_info.rwy_no1.substr(i, 1);
string tmp = rwname.substr(i, 1);
if ( tmp == "L" || tmp == "R" || tmp == "C" || tmp == " " ) {
snum1 = rwy_info.rwy_no1.substr(0, i);
snum = rwname.substr(0, i);
}
}
len = rwy_info.rwy_no2.length();
string snum2 = rwy_info.rwy_no2;
for ( i = 0; i < len; ++i ) {
string tmp = rwy_info.rwy_no2.substr(i, 1);
if ( tmp == "L" || tmp == "R" || tmp == "C" || tmp == " " ) {
snum2 = rwy_info.rwy_no2.substr(0, i);
}
}
SG_LOG(SG_GENERAL, SG_INFO, "Runway num1 = '" << snum1 << "'");
SG_LOG(SG_GENERAL, SG_INFO, "Runway num2 = '" << snum2 << "'");
SG_LOG(SG_GENERAL, SG_INFO, "Runway num = '" << snum );
int num1 = atoi( snum1.c_str() );
int num2 = atoi( snum2.c_str() );
while ( num1 <= 0 ) {
num1 += 36;
}
start2_pct = end2_pct;
end2_pct = start2_pct + ( 80.0 / length );
gen_number_block( rwy_info, material, runway_b, rwy_info.heading + 180.0,
num1, start2_pct, end2_pct, rwy_polys, texparams, accum );
while ( num2 <= 0 ) {
num2 += 36;
int num = atoi( snum.c_str() );
while ( num <= 0 ) {
num += 36;
}
start1_pct = end1_pct;
end1_pct = start1_pct + ( 80.0 / length );
gen_number_block( rwy_info, material, runway_a, rwy_info.heading,
num2, start1_pct, end1_pct, rwy_polys, texparams, accum );
gen_number_block( rwy_info, material, runway_half, heading,
num, start1_pct, end1_pct, rwy_polys, texparams, accum );
}
//
// Touch down zone x3
//
start1_pct = end1_pct;
end1_pct = start1_pct + ( 380 / length );
gen_runway_section( rwy_info, runway_a,
if ((rwhalf == 1 && rwy_info.marking_code1 == 3) || (rwhalf == 2 && rwy_info.marking_code2 == 3)){
gen_prec_marking( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
material, "tz_three",
heading, material,
rwy_polys, texparams, accum );
}
start2_pct = end2_pct;
end2_pct = start2_pct + ( 380 / 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, "tz_three",
rwy_polys, texparams, accum );
// add a section of center stripe
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / length );
gen_runway_section( rwy_info, runway_a,
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,
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,
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 );
//
// Aiming point
//
start1_pct = end1_pct;
end1_pct = start1_pct + ( 400 / 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, "aim",
rwy_polys, texparams, accum );
start2_pct = end2_pct;
end2_pct = start2_pct + ( 400 / 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, "aim",
rwy_polys, texparams, accum );
//
// Touch down zone x2 (first)
//
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 400 / 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, "tz_two_a",
heading, material,
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 400 / 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, "tz_two_a",
rwy_polys, texparams, accum );
}
// add a section of center stripe
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
//
// Touch down zone x2 (second)
//
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / 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, "tz_two_b",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 200 / 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, "tz_two_b",
rwy_polys, texparams, accum );
}
// add a section of center stripe
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
//
// Touch down zone x1 (first)
//
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 400 / 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, "tz_one_a",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 400 / 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, "tz_one_a",
rwy_polys, texparams, accum );
}
// add a section of center stripe
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 200 / 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, "rest",
rwy_polys, texparams, accum );
}
//
// Touch down zone x1 (second)
//
if ( end1_pct < 1.0 ) {
start1_pct = end1_pct;
end1_pct = start1_pct + ( 200 / 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, "tz_one_b",
rwy_polys, texparams, accum );
}
if ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + ( 200 / 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, "tz_one_b",
rwy_polys, texparams, accum );
}
//
// The rest ...
@ -609,33 +359,16 @@ void gen_rwy( const TGRunway& rwy_info,
start1_pct = end1_pct;
end1_pct = start1_pct + rest1_inc;
gen_runway_section( rwy_info, runway_a,
gen_runway_section( rwy_info, runway_half,
start1_pct, end1_pct,
0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
rwy_info.heading,
heading,
material, "rest",
rwy_polys, texparams, accum );
}
ideal_rest_inc = ( 200.0 / length );
divs = (int)((1.0 - end2_pct) / ideal_rest_inc) + 1;
double rest2_inc = (1.0 - end2_pct) / divs;
while ( end2_pct < 1.0 ) {
start2_pct = end2_pct;
end2_pct = start2_pct + rest2_inc;
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, "rest",
rwy_polys, texparams, accum );
}
gen_runway_stopway( rwy_info, runway_a, runway_b,
material,
rwy_polys, texparams, accum );
}
}