diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx index fff00a85..2b16c457 100644 --- a/src/Airports/GenAirports/build.cxx +++ b/src/Airports/GenAirports/build.cxx @@ -57,7 +57,7 @@ #include <Polygon/superpoly.hxx> #include <Triangulate/trieles.hxx> -#include "build.hxx" +#include "apt_surface.hxx" #include "convex_hull.hxx" #include "lights.hxx" #include "point2d.hxx" @@ -71,6 +71,8 @@ #include "taxiway.hxx" #include "texparams.hxx" +#include "build.hxx" + SG_USING_STD(map); SG_USING_STD(less); SG_USING_STD(string); @@ -172,6 +174,23 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, } +// Determine node elevations based on provide TGAptSurface. Offset is +// added to the final elevation +static point_list calc_elevations( TGAptSurface &surf, + const point_list& geod_nodes, + double offset ) +{ + point_list result = geod_nodes; + for ( unsigned int i = 0; i < result.size(); ++i ) { + double elev = surf.query( result[i].lon(), result[i].lat() ); + result[i].setelev( elev + offset ); + } + + return result; +} + + +#if 0 // fix node elevations. Offset is added to the final elevation static point_list calc_elevations( const string& root, const point_list& geod_nodes, @@ -186,7 +205,8 @@ static point_list calc_elevations( const string& root, bool done = false; point_list result = geod_nodes; - int i, j; + int i; + unsigned int j; TGArray array; // just bail if no work to do @@ -234,7 +254,7 @@ static point_list calc_elevations( const string& root, // this array file double elev; done = true; - for ( j = 0; j < (int)result.size(); ++j ) { + for ( j = 0; j < result.size(); ++j ) { if ( result[j].z() < -9000 ) { done = false; elev = array.interpolate_altitude( result[j].x() * 3600.0, @@ -254,6 +274,7 @@ static point_list calc_elevations( const string& root, return result; } +#endif // strip trailing spaces @@ -920,8 +941,51 @@ void build_airport( string airport_raw, float alt_m, tris_tc.push_back( base_tc ); } + // calculation min/max coordinates of airport area + Point3D min_deg(9999.0, 9999.0, 0), max_deg(-9999.0, -9999.0, 0); + for ( j = 0; j < (int)nodes.get_node_list().size(); ++j ) { + Point3D p = nodes.get_node_list()[j]; + if ( p.lon() < min_deg.lon() ) { + min_deg.setlon( p.lon() ); + } + if ( p.lon() > max_deg.lon() ) { + max_deg.setlon( p.lon() ); + } + if ( p.lat() < min_deg.lat() ) { + min_deg.setlat( p.lat() ); + } + if ( p.lat() > max_deg.lat() ) { + max_deg.setlat( p.lat() ); + } + } + + // extend the min/max coordinates of airport area to cover all + // lights as well + for ( i = 0; i < (int)rwy_lights.size(); ++i ) { + for ( j = 0; + j < (int)rwy_lights[i].get_poly().get_contour(0).size(); + ++j ) + { + Point3D p = rwy_lights[i].get_poly().get_contour(0)[j]; + if ( p.lon() < min_deg.lon() ) { + min_deg.setlon( p.lon() ); + } + if ( p.lon() > max_deg.lon() ) { + max_deg.setlon( p.lon() ); + } + if ( p.lat() < min_deg.lat() ) { + min_deg.setlat( p.lat() ); + } + if ( p.lat() > max_deg.lat() ) { + max_deg.setlat( p.lat() ); + } + } + } + + TGAptSurface apt_surf( root, min_deg, max_deg ); + // calculate node elevations - point_list geod_nodes = calc_elevations( root, nodes.get_node_list(), + point_list geod_nodes = calc_elevations( apt_surf, nodes.get_node_list(), 0.0 ); SG_LOG(SG_GENERAL, SG_DEBUG, "Done with calc_elevations()"); @@ -1039,7 +1103,7 @@ void build_airport( string airport_raw, float alt_m, // calculate light node elevations point_list geod_light_nodes - = calc_elevations( root, light_nodes.get_node_list(), 0.5 ); + = calc_elevations( apt_surf, light_nodes.get_node_list(), 0.5 ); TGPolygon p; p.add_contour( geod_light_nodes, 0 ); TGSuperPoly s;