From fb6cee3bb07b3e9aa08c8b757aa2b369e095da87 Mon Sep 17 00:00:00 2001 From: Christian Schmitt <chris@ilovelinux.de> Date: Thu, 20 Sep 2012 21:48:15 +0200 Subject: [PATCH] Tweak PAPI/VASI object creation, add missing object types --- src/Airports/GenAirports850/airport.cxx | 4 +- src/Airports/GenAirports850/object.cxx | 188 +++++++++--------------- src/Airports/GenAirports850/object.hxx | 3 +- 3 files changed, 73 insertions(+), 122 deletions(-) diff --git a/src/Airports/GenAirports850/airport.cxx b/src/Airports/GenAirports850/airport.cxx index 6d79c02b..c2433fc3 100644 --- a/src/Airports/GenAirports850/airport.cxx +++ b/src/Airports/GenAirports850/airport.cxx @@ -94,7 +94,7 @@ Airport::Airport( int c, char* def) dbg_taxi_poly = 0; - SG_LOG( SG_GENERAL, SG_DEBUG, "Created airport with icao " << icao << ", control tower " << ct << ", and description " << description ); + SG_LOG( SG_GENERAL, SG_DEBUG, "Read airport with icao " << icao << ", control tower " << ct << ", and description " << description ); } Airport::~Airport() @@ -673,7 +673,7 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src ) for ( unsigned int i=0; i<lightobjects.size(); i++ ) { SG_LOG(SG_GENERAL, SG_INFO, "Build runway light " << i + 1 << " of " << lightobjects.size()); - lightobjects[i]->BuildBtg( altitude, &rwy_lights ); + lightobjects[i]->BuildBtg( &rwy_lights ); } } diff --git a/src/Airports/GenAirports850/object.cxx b/src/Airports/GenAirports850/object.cxx index 6a4ddef9..4715dabc 100644 --- a/src/Airports/GenAirports850/object.cxx +++ b/src/Airports/GenAirports850/object.cxx @@ -9,57 +9,30 @@ LightingObj::LightingObj( char* definition ) SG_LOG(SG_GENERAL, SG_DEBUG, "Read lighting object: (" << lon << "," << lat << ") heading: " << heading << " type: " << type ); } -void LightingObj::BuildBtg( int alt_m, superpoly_list* lights ) +void LightingObj::BuildBtg( superpoly_list* lights ) { point_list lightobj; lightobj.clear(); point_list normals; normals.clear(); - Point3D ref; - double lon2 = 0, lat2 = 0, r; double left_hdg = heading - 90.0; if ( left_hdg < 0 ) { left_hdg += 360.0; } - ref.setlat( lat ); - ref.setlon( lon ); + Point3D ref(lon, lat, 0.0); - if ( glideslope < 0.5 ) { - glideslope = 3.0; - } - - // Calculate the normal once for all object parts. - // SG takes care of the angle. + // Calculate the normal direction once for all objects. + // SimGear takes care of the glideslope angle calculation from the normal // calculate a second point in the object heading direction + double lon2 = 0, lat2 = 0, r; geo_direct_wgs_84 ( lat, lon, heading, - 100, &lat2, &lon2, &r); + 10, &lat2, &lon2, &r); - Point3D end1, end2; - - end1.setlat( lat2 ); - end1.setlon( lon2 ); - - end2.setlat( lat); - end2.setlon( lon); - - Point3D cart1 = sgGeodToCart( end1 * SG_DEGREES_TO_RADIANS ); - Point3D cart2 = sgGeodToCart( end2 * SG_DEGREES_TO_RADIANS ); - - Point3D up = cart1; - double length = up.distance3D( Point3D(0.0) ); - up = up / length; - - Point3D obj_vec = cart2 - cart1; - - // angle up specified amount - length = obj_vec.distance3D( Point3D(0.0) ); - double up_length = length * tan( glideslope * SG_DEGREES_TO_RADIANS); - Point3D light_vec = obj_vec + (up * up_length); - - length = light_vec.distance3D( Point3D(0.0) ); - Point3D normal = light_vec / length; - - SG_LOG(SG_GENERAL, SG_DEBUG, "obj_normal = " << normal); + Point3D cart1 = sgGeodToCart( Point3D(lon2, lat2, 0.0) * SG_DEGREES_TO_RADIANS ); + Point3D cart2 = sgGeodToCart( ref * SG_DEGREES_TO_RADIANS ); + Point3D normal = cart2 - cart1; + double length = normal.distance3D( Point3D(0.0) ); + normal = normal / length; // We know our normal, now create the lights Point3D pt1; @@ -69,127 +42,106 @@ void LightingObj::BuildBtg( int alt_m, superpoly_list* lights ) SG_LOG(SG_GENERAL, SG_DEBUG, "Generating VASI = " << assoc_rw); // VASI coordinates describe the center between the two bars. - // Space between the bars is 700 ft + // Space between the bars is 200m // Go to downwind bar - geo_direct_wgs_84 ( alt_m, ref.lat(), ref.lon(), heading, - -350 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( ref.lat(), ref.lon(), heading, + -100, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); // unit1 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - -16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + -5, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); lightobj.push_back( pt1 ); normals.push_back( normal ); - // unit2 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); - - // unit3 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); + // unit2+3 + for (int i = 0; i < 2; ++i) + { + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + 5, &lat2, &lon2, &r ); + pt1 = Point3D( lon2, lat2, 0.0 ); + lightobj.push_back( pt1 ); + normals.push_back( normal ); + } // Go to upwind bar - geo_direct_wgs_84 ( alt_m, ref.lat(), ref.lon(), heading, - 350 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( ref.lat(), ref.lon(), heading, + 100, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); // unit4 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - -16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + -5, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); lightobj.push_back( pt1 ); normals.push_back( normal ); - // unit5 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); - - // unit6 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 16 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); + // unit5+6 + for (int i = 0; i < 2; ++i) + { + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + 5, &lat2, &lon2, &r ); + pt1 = Point3D( lon2, lat2, 0.0 ); + lightobj.push_back( pt1 ); + normals.push_back( normal ); + } } - else if (type == 2) { SG_LOG(SG_GENERAL, SG_DEBUG, "Generating PAPI 4L = " << assoc_rw); // unit1 - geo_direct_wgs_84 ( alt_m, ref.lat(), ref.lon(), left_hdg, - -45 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( ref.lat(), ref.lon(), left_hdg, + -12, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); lightobj.push_back( pt1 ); normals.push_back( normal ); - // unit2 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); - - // unit3 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); - - // unit4 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - 30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); + // unit2-4 + for (int i = 0; i < 3; ++i) + { + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + 8, &lat2, &lon2, &r ); + pt1 = Point3D( lon2, lat2, 0.0 ); + lightobj.push_back( pt1 ); + normals.push_back( normal ); + } } - else if (type == 3) { SG_LOG(SG_GENERAL, SG_DEBUG, "Generating PAPI 4R = " << assoc_rw); // unit1 - geo_direct_wgs_84 ( alt_m, ref.lat(), ref.lon(), left_hdg, - 45 * SG_FEET_TO_METER, &lat2, &lon2, &r ); + geo_direct_wgs_84 ( ref.lat(), ref.lon(), left_hdg, + 12, &lat2, &lon2, &r ); pt1 = Point3D( lon2, lat2, 0.0 ); lightobj.push_back( pt1 ); normals.push_back( normal ); - // unit2 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - -30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); + // unit2-4 + for (int i = 0; i < 3; ++i) + { + geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, + -8, &lat2, &lon2, &r ); + pt1 = Point3D( lon2, lat2, 0.0 ); + lightobj.push_back( pt1 ); + normals.push_back( normal ); + } + } + else if (type == 4) + { + SG_LOG(SG_GENERAL, SG_DEBUG, "Space Shuttle PAPI is deprecated. Use the normal PAPI and set the glideslope accordingly"); + } + else if (type == 5) + { + SG_LOG(SG_GENERAL, SG_DEBUG, "Generating tri-colour VASI = " << assoc_rw); - // unit3 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - -30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); - normals.push_back( normal ); - - // unit4 - geo_direct_wgs_84 ( alt_m, pt1.lat(), pt1.lon(), left_hdg, - -30 * SG_FEET_TO_METER, &lat2, &lon2, &r ); - pt1 = Point3D( lon2, lat2, 0.0 ); - lightobj.push_back( pt1 ); + // only one light here + lightobj.push_back( ref ); normals.push_back( normal ); } - else { SG_LOG(SG_GENERAL, SG_ALERT, "Unknown lighting object (PAPI/VASI...) code: " << type); diff --git a/src/Airports/GenAirports850/object.hxx b/src/Airports/GenAirports850/object.hxx index 0edfe935..ced50a7e 100644 --- a/src/Airports/GenAirports850/object.hxx +++ b/src/Airports/GenAirports850/object.hxx @@ -6,7 +6,6 @@ #include <Polygon/polygon.hxx> #include <Polygon/superpoly.hxx> -#include <Polygon/texparams.hxx> #include <Geometry/point3d.hxx> using std::string; @@ -24,7 +23,7 @@ public: char assoc_rw; -void BuildBtg( int alt_m, superpoly_list* lights ); +void BuildBtg( superpoly_list* lights ); }; typedef std::vector <LightingObj *> LightingObjList;