diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx index 4be28c3b..c7940396 100644 --- a/src/Airports/GenAirports/build.cxx +++ b/src/Airports/GenAirports/build.cxx @@ -49,6 +49,7 @@ #include <Polygon/index.hxx> #include <Polygon/polygon.hxx> #include <Polygon/split.hxx> +#include <Polygon/superpoly.hxx> #include <Triangulate/trieles.hxx> #include "convex_hull.hxx" @@ -466,8 +467,9 @@ static void my_chomp( string& str ) { void build_airport( string airport_raw, string_list& runways_raw, const string& root ) { - poly_list rwy_polys, rwy_tris, rwy_txs; - FGPolygon runway, runway_a, runway_b, result, result_a, result_b; + superpoly_list rwy_polys; + // poly_list rwy_tris, rwy_txs; + FGPolygon runway, runway_a, runway_b, result, clipped_a, clipped_b; FGPolygon base; point_list apt_pts; Point3D p; @@ -563,8 +565,22 @@ void build_airport( string airport_raw, string_list& runways_raw, runways.push_back( rwy ); } + FGSuperPoly sp; + string surface_flag; + string material; for ( int i = 0; i < (int)runways.size(); ++i ) { runway = gen_runway_w_mid( runways[i] ); + surface_flag = runways[i].surface_flags.substr(0, 1); + cout << "surface flag = " << surface_flag << endl; + if ( surface_flag == "A" ) { + material = "Asphalt"; + } else if ( surface_flag == "C" ) { + material = "Concrete"; + } else if ( surface_flag == "D" ) { + material = "DryLake"; + } else if ( surface_flag == "T" ) { + material = "Grass"; + } // runway half "a" runway_a.erase(); @@ -591,14 +607,20 @@ void build_airport( string airport_raw, string_list& runways_raw, cout << " point = " << p << endl; } - result_a = polygon_diff( runway_a, accum ); - rwy_polys.push_back( result_a ); - cout << "result_a = " << result_a.contours() << endl; + clipped_a = polygon_diff( runway_a, accum ); + sp.erase(); + sp.set_poly( clipped_a ); + sp.set_material( material ); + rwy_polys.push_back( sp ); + cout << "clipped_a = " << clipped_a.contours() << endl; accum = polygon_union( runway_a, accum ); - result_b = polygon_diff( runway_b, accum ); - rwy_polys.push_back( result_b ); - cout << "result_b = " << result_b.contours() << endl; + clipped_b = polygon_diff( runway_b, accum ); + sp.erase(); + sp.set_poly( clipped_b ); + sp.set_material( material ); + rwy_polys.push_back( sp ); + cout << "clipped_b = " << clipped_b.contours() << endl; accum = polygon_union( runway_b, accum ); #if 0 @@ -606,24 +628,24 @@ void build_airport( string airport_raw, string_list& runways_raw, char tmpa[256], tmpb[256]; sprintf( tmpa, "a%d", i ); sprintf( tmpb, "b%d", i ); - write_polygon( result_a, tmpa ); - write_polygon( result_b, tmpb ); + write_polygon( clipped_a, tmpa ); + write_polygon( clipped_b, tmpb ); #endif // print runway points cout << "clipped runway pts (a)" << endl; - for ( int j = 0; j < result_a.contours(); ++j ) { - for ( int k = 0; k < result_a.contour_size( j ); ++k ) { - p = result_a.get_pt(j, k); + for ( int j = 0; j < clipped_a.contours(); ++j ) { + for ( int k = 0; k < clipped_a.contour_size( j ); ++k ) { + p = clipped_a.get_pt(j, k); cout << " point = " << p << endl; } } // print runway points cout << "clipped runway pts (b)" << endl; - for ( int j = 0; j < result_b.contours(); ++j ) { - for ( int k = 0; k < result_b.contour_size( j ); ++k ) { - p = result_b.get_pt(j, k); + for ( int j = 0; j < clipped_b.contours(); ++j ) { + for ( int k = 0; k < clipped_b.contour_size( j ); ++k ) { + p = clipped_b.get_pt(j, k); cout << " point = " << p << endl; } } @@ -654,9 +676,10 @@ void build_airport( string airport_raw, string_list& runways_raw, // build temporary node list for ( int k = 0; k < (int)rwy_polys.size(); ++k ) { - for ( int i = 0; i < rwy_polys[k].contours(); ++i ) { - for ( int j = 0; j < rwy_polys[k].contour_size( i ); ++j ) { - tmp_nodes.unique_add( rwy_polys[k].get_pt(i, j) ); + FGPolygon poly = rwy_polys[k].get_poly(); + for ( int i = 0; i < poly.contours(); ++i ) { + for ( int j = 0; j < poly.contour_size( i ); ++j ) { + tmp_nodes.unique_add( poly.get_pt(i, j) ); } } } @@ -698,16 +721,19 @@ void build_airport( string airport_raw, string_list& runways_raw, for ( int k = 0; k < (int)rwy_polys.size(); ++k ) { cout << "add nodes/remove dups runway = " << k << endl; - rwy_polys[k] = add_nodes_to_poly( rwy_polys[k], tmp_nodes ); + FGPolygon poly = rwy_polys[k].get_poly(); + poly = add_nodes_to_poly( poly, tmp_nodes ); #if 0 char tmp[256]; sprintf( tmp, "r%d", k ); - write_polygon( rwy_polys[k], tmp ); + write_polygon( poly, tmp ); #endif - rwy_polys[k] = remove_dups( rwy_polys[k] ); - rwy_polys[k] = remove_bad_contours( rwy_polys[k] ); + poly = remove_dups( poly ); + poly = remove_bad_contours( poly ); + + rwy_polys[k].set_poly( poly ); } cout << "add nodes/remove dups base " << endl; base_poly = add_nodes_to_poly( base_poly, tmp_nodes ); @@ -718,19 +744,24 @@ void build_airport( string airport_raw, string_list& runways_raw, // tesselate the polygons and prepair them for final output + FGPolygon poly; for ( int i = 0; i < (int)runways.size(); ++i ) { cout << "Tesselating runway = " << i << endl; FGPolygon tri_a, tri_b, tc_a, tc_b; - tri_a = polygon_tesselate_alt( rwy_polys[2 * i] ); + poly = rwy_polys[2 * i].get_poly(); + tri_a = polygon_tesselate_alt( poly ); tc_a = rwy_calc_tex_coords( runways[i], 0.0, tri_a ); - rwy_tris.push_back( tri_a ); - rwy_txs.push_back( tc_a ); + rwy_polys[2 * i].set_tris( tri_a ); + rwy_polys[2 * i].set_texcoords( tc_a ); + rwy_polys[2 * i].set_tri_mode( GL_TRIANGLES ); - tri_b = polygon_tesselate_alt( rwy_polys[2 * i + 1] ); + poly = rwy_polys[2 * i + 1].get_poly(); + tri_b = polygon_tesselate_alt( poly ); tc_b = rwy_calc_tex_coords( runways[i], 180.0, tri_b ); - rwy_tris.push_back( tri_b ); - rwy_txs.push_back( tc_b ); + rwy_polys[2 * i + 1].set_tris( tri_b ); + rwy_polys[2 * i + 1].set_texcoords( tc_b ); + rwy_polys[2 * i + 1].set_tri_mode( GL_TRIANGLES ); } cout << "Tesselating base" << endl; @@ -782,9 +813,13 @@ void build_airport( string airport_raw, string_list& runways_raw, int_list tri_v; int_list tri_tc; - for ( int k = 0; k < (int)rwy_tris.size(); ++k ) { + // for ( int k = 0; k < (int)rwy_tris.size(); ++k ) { + for ( int k = 0; k < (int)rwy_polys.size(); ++k ) { cout << "tri " << k << endl; - FGPolygon tri_poly = rwy_tris[k]; + // FGPolygon tri_poly = rwy_tris[k]; + FGPolygon tri_poly = rwy_polys[k].get_tris(); + FGPolygon tri_txs = rwy_polys[k].get_texcoords(); + string material = rwy_polys[k].get_material(); for ( int i = 0; i < tri_poly.contours(); ++i ) { tri_v.clear(); tri_tc.clear(); @@ -792,13 +827,13 @@ void build_airport( string airport_raw, string_list& runways_raw, p = tri_poly.get_pt( i, j ); index = nodes.unique_add( p ); tri_v.push_back( index ); - tc = rwy_txs[k].get_pt( i, j ); + tc = tri_txs.get_pt( i, j ); index = texcoords.unique_add( tc ); tri_tc.push_back( index ); } tris_v.push_back( tri_v ); tris_tc.push_back( tri_tc ); - tri_materials.push_back( "Concrete" ); + tri_materials.push_back( material ); } } diff --git a/src/Airports/GenAirports/main.cxx b/src/Airports/GenAirports/main.cxx index 9dfb3096..c02460ac 100644 --- a/src/Airports/GenAirports/main.cxx +++ b/src/Airports/GenAirports/main.cxx @@ -48,223 +48,6 @@ #include "convex_hull.hxx" -#if 0 -// write out airport data -void write_airport( long int p_index, const FGPolygon& hull_list, FGBucket b, - const string& root, const bool cut_and_keep ) { - char tile_name[256], poly_index[256]; - - string base = b.gen_base_path(); - string path = root + "/" + base; - string command = "mkdir -p " + path; - system( command.c_str() ); - - long int b_index = b.gen_index(); - sprintf(tile_name, "%ld", b_index); - string aptfile = path + "/" + tile_name; - - sprintf( poly_index, "%ld", p_index ); - aptfile += "."; - aptfile += poly_index; - cout << "apt file = " << aptfile << endl; - - FILE *fd; - if ( (fd = fopen(aptfile.c_str(), "a")) == NULL ) { - cout << "Cannot open file: " << aptfile << endl; - exit(-1); - } - - // polygon type - if ( cut_and_keep ) { - fprintf( fd, "AirportKeep\n" ); - } else { - fprintf( fd, "AirportIgnore\n" ); - } - - // number of contours - fprintf( fd, "1\n" ); - - // size of first contour - fprintf( fd, "%d\n", hull_list.contour_size(0) ); - - // hole flag - fprintf( fd, "%d\n", 0 ); // not a hole - - // write contour (polygon) points - for ( int i = 0; i < hull_list.contour_size(0); ++i ) { - fprintf( fd, "%.7f %.7f\n", - hull_list.get_pt(0,i).x(), - hull_list.get_pt(0,i).y() ); - } - - fclose(fd); -} - - -// process and airport + runway list -void process_airport( string airport, list < string > & runways_list, - const string& root ) { - FGPolygon rwy_list, hull; - point_list apt_list; - - // parse main airport information - int elev; - - cout << airport << endl; - string apt_type = airport.substr(0, 1); - string apt_code = airport.substr(2, 4); my_chomp(apt_code); - string apt_lat = airport.substr(7, 10); - string apt_lon = airport.substr(18, 11); - string apt_elev = airport.substr(30, 5); - sscanf( apt_elev.c_str(), "%d", &elev ); - string apt_use = airport.substr(36, 1); - string apt_twr = airport.substr(37, 1); - string apt_bldg = airport.substr(38, 1); - string apt_name = airport.substr(40); - - /* - cout << " type = " << apt_type << endl; - cout << " code = " << apt_code << endl; - cout << " lat = " << apt_lat << endl; - cout << " lon = " << apt_lon << endl; - cout << " elev = " << apt_elev << " " << elev << endl; - cout << " use = " << apt_use << endl; - cout << " twr = " << apt_twr << endl; - cout << " bldg = " << apt_bldg << endl; - cout << " name = " << apt_name << endl; - */ - - // Ignore any seaplane bases - if ( apt_type == "S" ) { - return; - } - - // parse runways and generate the vertex list - string rwy_str; - double lon, lat, hdg; - int len, width; - - list < string >::iterator last_runway = runways_list.end(); - for ( list < string >::iterator current_runway = runways_list.begin(); - current_runway != last_runway ; ++current_runway ) { - rwy_str = (*current_runway); - - cout << rwy_str << endl; - string rwy_no = rwy_str.substr(2, 4); - string rwy_lat = rwy_str.substr(6, 10); - sscanf( rwy_lat.c_str(), "%lf", &lat); - string rwy_lon = rwy_str.substr(17, 11); - sscanf( rwy_lon.c_str(), "%lf", &lon); - string rwy_hdg = rwy_str.substr(29, 7); - sscanf( rwy_hdg.c_str(), "%lf", &hdg); - string rwy_len = rwy_str.substr(36, 7); - sscanf( rwy_len.c_str(), "%d", &len); - string rwy_width = rwy_str.substr(43, 4); - sscanf( rwy_width.c_str(), "%d", &width); - string rwy_sfc = rwy_str.substr(47, 4); - string rwy_end1 = rwy_str.substr(52, 8); - string rwy_end2 = rwy_str.substr(61, 8); - - /* - cout << " no = " << rwy_no << endl; - cout << " lat = " << rwy_lat << " " << lat << endl; - cout << " lon = " << rwy_lon << " " << lon << endl; - cout << " hdg = " << rwy_hdg << " " << hdg << endl; - cout << " len = " << rwy_len << " " << len << endl; - cout << " width = " << rwy_width << " " << width << endl; - cout << " sfc = " << rwy_sfc << endl; - cout << " end1 = " << rwy_end1 << endl; - cout << " end2 = " << rwy_end2 << endl; - */ - - rwy_list = gen_runway_area( lon, lat, hdg * DEG_TO_RAD, - (double)len * FEET_TO_METER, - (double)width * FEET_TO_METER ); - - // add rwy_list to apt_list - for (int i = 0; i < (int)rwy_list.contour_size(0); ++i ) { - apt_list.push_back( rwy_list.get_pt(0,i) ); - } - } - - if ( apt_list.size() == 0 ) { - cout << "no runway points generated" << endl; - return; - } - - // printf("Runway points in degrees\n"); - // current = apt_list.begin(); - // last = apt_list.end(); - // for ( ; current != last; ++current ) { - // printf( "%.5f %.5f\n", current->lon, current->lat ); - // } - // printf("\n"); - - // generate convex hull - hull = convex_hull(apt_list); - - // get next polygon index - long int index = poly_index_next(); - - // find average center, min, and max point of convex hull - Point3D min(200.0), max(-200.0); - double sum_x, sum_y; - int count = hull.contour_size(0); - sum_x = sum_y = 0.0; - for ( int i = 0; i < count; ++i ) { - // printf("return = %.6f %.6f\n", (*current).x, (*current).y); - Point3D p = hull.get_pt( 0, i ); - sum_x += p.x(); - sum_y += p.y(); - - if ( p.x() < min.x() ) { min.setx( p.x() ); } - if ( p.y() < min.y() ) { min.sety( p.y() ); } - if ( p.x() > max.x() ) { max.setx( p.x() ); } - if ( p.y() > max.y() ) { max.sety( p.y() ); } - } - Point3D average( sum_x / count, sum_y / count, 0 ); - - // find buckets for center, min, and max points of convex hull. - // note to self: self, you should think about checking for runways - // that span the data line - FGBucket b(average.x(), average.y()); - FGBucket b_min(min.x(), min.y()); - FGBucket b_max(max.x(), max.y()); - cout << "Bucket center = " << b << endl; - cout << "Bucket min = " << b_min << endl; - cout << "Bucket max = " << b_max << endl; - - if ( b_min == b_max ) { - write_airport( index, hull, b, root, true ); - } else { - FGBucket b_cur; - int dx, dy, i, j; - - fgBucketDiff(b_min, b_max, &dx, &dy); - cout << "airport spans tile boundaries" << endl; - cout << " dx = " << dx << " dy = " << dy << endl; - - if ( (dx > 2) || (dy > 2) ) { - cout << "somethings really wrong!!!!" << endl; - exit(-1); - } - - for ( j = 0; j <= dy; j++ ) { - for ( i = 0; i <= dx; i++ ) { - b_cur = fgBucketOffset(min.x(), min.y(), i, j); - if ( b_cur == b ) { - write_airport( index, hull, b_cur, root, true ); - } else { - write_airport( index, hull, b_cur, root, true ); - } - } - } - // string answer; cin >> answer; - } -} -#endif - - // reads the apt_full file and extracts and processes the individual // airport records int main( int argc, char **argv ) { diff --git a/src/Airports/GenAirports/runway.hxx b/src/Airports/GenAirports/runway.hxx index 2fe87fbb..6e0ad348 100644 --- a/src/Airports/GenAirports/runway.hxx +++ b/src/Airports/GenAirports/runway.hxx @@ -46,6 +46,13 @@ struct FGRunway { string surface_flags; string end1_flags; string end2_flags; + + FGPolygon threshold; + FGPolygon tens, tens_margin, ones, ones_margin; + FGPolygon letter, letter_margin_left, letter_margin_right; + FGPolygon pre_td_zone; + FGPolygon td3_zone, td2_zone, td1a_zone, td1b_zone; + FGPolygon aim_point; };