Change runway object routine. Do elevation calculation and model write out in one loop
This commit is contained in:
parent
707e939337
commit
e9c3f3065c
6 changed files with 67 additions and 124 deletions
|
@ -194,6 +194,16 @@ static tgContour calc_elevations( TGAptSurface &surf,
|
|||
return result;
|
||||
}
|
||||
|
||||
static double calc_elevation( TGAptSurface &surf,
|
||||
const SGGeod& node,
|
||||
double offset )
|
||||
{
|
||||
double elev = surf.query( node.getLongitudeDeg(), node.getLatitudeDeg() );
|
||||
elev += offset;
|
||||
|
||||
return elev;
|
||||
}
|
||||
|
||||
|
||||
// Determine node elevations of each node of a TGPolygon based on the
|
||||
// provided TGAptSurface. Offset is added to the final elevation
|
||||
|
@ -992,51 +1002,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Done with base calc_elevations()");
|
||||
|
||||
#if 0 // TODO
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Computing tower node elevations");
|
||||
point_list tower_nodes = calc_elevations( apt_surf, towers, 0.0 );
|
||||
#endif
|
||||
|
||||
// calc windsock elevations:
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing windsock node elevations");
|
||||
point_list ws_nodes;
|
||||
ws_nodes.clear();
|
||||
for ( unsigned int i = 0; i < windsocks.size(); ++i )
|
||||
{
|
||||
p = windsocks[i]->GetLoc();
|
||||
ws_nodes.push_back( p );
|
||||
}
|
||||
point_list windsock_nodes = calc_elevations( apt_surf, ws_nodes, 0.0 );
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing beacon node elevations");
|
||||
point_list b_nodes;
|
||||
b_nodes.clear();
|
||||
for ( unsigned int i = 0; i < beacons.size(); ++i )
|
||||
{
|
||||
p = beacons[i]->GetLoc();
|
||||
b_nodes.push_back( p );
|
||||
}
|
||||
point_list beacon_nodes = calc_elevations( apt_surf, b_nodes, 0.0 );
|
||||
|
||||
// calc taxiway sign elevations:
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing taxiway sign node elevations");
|
||||
point_list ts_nodes;
|
||||
ts_nodes.clear();
|
||||
for ( unsigned int i = 0; i < signs.size(); ++i )
|
||||
{
|
||||
p = signs[i]->GetLoc();
|
||||
ts_nodes.push_back( p );
|
||||
}
|
||||
point_list taxisigns_nodes = calc_elevations( apt_surf, ts_nodes, 0.0 );
|
||||
|
||||
// calc water runway buoys elevations:
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing water buoy elevations");
|
||||
point_list buoy_nodes;
|
||||
for ( unsigned int i = 0; i < waterrunways.size(); ++i )
|
||||
{
|
||||
buoy_nodes = waterrunways[i]->TempGetAsPointList();
|
||||
}
|
||||
point_list water_buoys_nodes = calc_elevations( apt_surf, buoy_nodes, 0.0 );
|
||||
|
||||
// add base skirt (to hide potential cracks)
|
||||
// this has to happen after we've calculated the node elevations
|
||||
|
@ -1318,46 +1283,62 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
|
|||
}
|
||||
#endif
|
||||
|
||||
// write out windsock references : TODO - save elevation data in the windsock object
|
||||
for ( unsigned int i = 0; i < windsock_nodes.size(); ++i )
|
||||
SGGeod ref_geod;
|
||||
// calc elevations and write out windsock references
|
||||
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing windsock node elevations");
|
||||
|
||||
for ( unsigned int i = 0; i < windsocks.size(); ++i )
|
||||
{
|
||||
if ( windsocks[i]->IsLit() )
|
||||
SGGeod ref_geod = windsocks[i]->GetLoc();
|
||||
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
|
||||
|
||||
if ( windsocks[i]->IsLit() )
|
||||
{
|
||||
write_index_shared( objpath, b, windsock_nodes[i],
|
||||
"Models/Airport/windsock_lit.xml",
|
||||
0.0 );
|
||||
write_index_shared( objpath, b, ref_geod,
|
||||
"Models/Airport/windsock_lit.xml", 0.0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
write_index_shared( objpath, b, windsock_nodes[i],
|
||||
"Models/Airport/windsock.xml",
|
||||
0.0 );
|
||||
}
|
||||
write_index_shared( objpath, b, ref_geod,
|
||||
"Models/Airport/windsock.xml", 0.0 );
|
||||
}
|
||||
}
|
||||
|
||||
// write out beacon references
|
||||
for ( unsigned int i = 0; i < beacon_nodes.size(); ++i )
|
||||
for ( unsigned int i = 0; i < beacons.size(); ++i )
|
||||
{
|
||||
write_index_shared( objpath, b, beacon_nodes[i],
|
||||
ref_geod = beacons[i]->GetLoc();
|
||||
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
|
||||
|
||||
write_index_shared( objpath, b, ref_geod,
|
||||
"Models/Airport/beacon.xml",
|
||||
0.0 );
|
||||
}
|
||||
|
||||
// write out taxiway signs references
|
||||
for ( unsigned int i = 0; i < taxisigns_nodes.size(); ++i )
|
||||
for ( unsigned int i = 0; i < signs.size(); ++i )
|
||||
{
|
||||
write_object_sign( objpath, b, taxisigns_nodes[i],
|
||||
ref_geod = signs[i]->GetLoc();
|
||||
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
|
||||
write_object_sign( objpath, b, ref_geod,
|
||||
signs[i]->GetDefinition(),
|
||||
signs[i]->GetHeading(),
|
||||
signs[i]->GetSize() );
|
||||
}
|
||||
|
||||
// write out water buoys
|
||||
for ( unsigned int i = 0; i < water_buoys_nodes.size(); ++i )
|
||||
for ( unsigned int i = 0; i < waterrunways.size(); ++i )
|
||||
{
|
||||
write_index_shared( objpath, b, water_buoys_nodes[i],
|
||||
"Models/Airport/water_rw_buoy.xml",
|
||||
0.0 );
|
||||
tgContour buoys = waterrunways[i]->GetBuoys();
|
||||
|
||||
for ( unsigned int j = 0; j < buoys.GetSize(); ++j )
|
||||
{
|
||||
ref_geod = buoys.GetNode(j);
|
||||
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
|
||||
write_index_shared( objpath, b, ref_geod,
|
||||
"Models/Airport/water_rw_buoy.xml",
|
||||
0.0 );
|
||||
}
|
||||
}
|
||||
|
||||
string holepath = root + "/AirportArea";
|
||||
|
|
|
@ -5,10 +5,6 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#include <Polygon/polygon.hxx>
|
||||
#include <Polygon/superpoly.hxx>
|
||||
#include <Polygon/texparams.hxx>
|
||||
|
||||
#include <Geometry/point3d.hxx>
|
||||
|
||||
using std::string;
|
||||
|
||||
|
@ -21,9 +17,9 @@ public:
|
|||
double lon;
|
||||
int lit;
|
||||
|
||||
Point3D GetLoc()
|
||||
SGGeod GetLoc()
|
||||
{
|
||||
return Point3D( lon, lat, 0.0f );
|
||||
return SGGeod::fromDeg(lon, lat);
|
||||
}
|
||||
|
||||
bool IsLit()
|
||||
|
@ -44,9 +40,9 @@ public:
|
|||
double lon;
|
||||
int code;
|
||||
|
||||
Point3D GetLoc()
|
||||
SGGeod GetLoc()
|
||||
{
|
||||
return Point3D( lon, lat, 0.0f );
|
||||
return SGGeod::fromDeg(lon, lat);
|
||||
}
|
||||
|
||||
int GetCode()
|
||||
|
@ -69,9 +65,9 @@ public:
|
|||
int size;
|
||||
string sgn_def;
|
||||
|
||||
Point3D GetLoc()
|
||||
SGGeod GetLoc()
|
||||
{
|
||||
return Point3D( lon, lat, 0.0f );
|
||||
return SGGeod::fromDeg(lon, lat);
|
||||
}
|
||||
|
||||
double GetHeading()
|
||||
|
|
|
@ -60,7 +60,7 @@ WaterRunway::WaterRunway(char* definition)
|
|||
SG_LOG(SG_GENERAL, SG_DEBUG, "Read water runway: (" << lon[0] << "," << lat[0] << ") to (" << lon[1] << "," << lat[1] << ") width: " << width << " buoys = " << buoys );
|
||||
}
|
||||
|
||||
tgContour WaterRunway::GetNodes()
|
||||
tgContour WaterRunway::GetBuoys()
|
||||
{
|
||||
tgContour buoys_nodes;
|
||||
|
||||
|
@ -69,48 +69,18 @@ tgContour WaterRunway::GetNodes()
|
|||
// calculate runway heading and length
|
||||
SGGeodesy::inverse(GetStart(), GetEnd(), heading, az2, length);
|
||||
|
||||
// create a polygon for the outline and use it to calculate the point list
|
||||
int divs = (int)(length / 100.0);
|
||||
// create a contour with points every 100m
|
||||
tgContour area = gen_wgs84_area(GetStart(), GetEnd(),
|
||||
0, 0, 0, width, heading, false);
|
||||
Point3D pt, inc;
|
||||
|
||||
for ( unsigned int i = 0; i < area.GetSize(); ++i ) {
|
||||
pt = Point3D::fromSGGeod( area.GetNode(i) );
|
||||
inc = ( Point3D::fromSGGeod( area.GetNode(i==3 ? 0 : i+1) ) -
|
||||
Point3D::fromSGGeod( area.GetNode(i)) ) / divs;
|
||||
|
||||
for ( int j = 0; j < divs; ++j) {
|
||||
buoys_nodes.AddNode( pt.toSGGeod() );
|
||||
pt += inc;
|
||||
}
|
||||
}
|
||||
}
|
||||
return buoys_nodes;
|
||||
}
|
||||
|
||||
point_list WaterRunway::TempGetAsPointList()
|
||||
{
|
||||
point_list buoys_nodes;
|
||||
|
||||
if (buoys){
|
||||
double heading, az2, length;
|
||||
// calculate runway heading and length
|
||||
SGGeodesy::inverse(GetStart(), GetEnd(), heading, az2, length);
|
||||
|
||||
// create a polygon for the outline and use it to calculate the point list
|
||||
int divs = (int)(length / 100.0);
|
||||
tgContour area = gen_wgs84_area(GetStart(), GetEnd(),
|
||||
0, 0, 0, width, heading, false);
|
||||
Point3D pt, inc;
|
||||
|
||||
for ( unsigned int i = 0; i < area.GetSize(); ++i ) {
|
||||
pt = Point3D::fromSGGeod( area.GetNode( i ) );
|
||||
inc = ( Point3D::fromSGGeod( area.GetNode(i==3 ? 0 : i+1) ) -
|
||||
Point3D::fromSGGeod( area.GetNode(i)) ) / divs;
|
||||
for ( int j = 0; j < divs; ++j) {
|
||||
buoys_nodes.push_back( pt );
|
||||
pt += inc;
|
||||
double dist, course, cs;
|
||||
SGGeodesy::inverse(area.GetNode(i), area.GetNode(i==3 ? 0 : i+1), course, cs, dist );
|
||||
int divs = (int)(dist / 100.0);
|
||||
double step = dist/divs;
|
||||
SGGeod pt = area.GetNode(i);
|
||||
for (int j = 0; j < divs; ++j) {
|
||||
pt = SGGeodesy::direct(pt, course, step );
|
||||
buoys_nodes.AddNode( pt );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,9 +5,6 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
#include <Polygon/polygon.hxx>
|
||||
#include <Polygon/superpoly.hxx>
|
||||
#include <Polygon/texparams.hxx>
|
||||
#include <Geometry/point3d.hxx>
|
||||
|
||||
#include "apt_math.hxx"
|
||||
|
||||
|
@ -188,8 +185,7 @@ class WaterRunway
|
|||
public:
|
||||
WaterRunway(char* def);
|
||||
|
||||
tgContour GetNodes();
|
||||
point_list TempGetAsPointList();
|
||||
tgContour GetBuoys();
|
||||
|
||||
SGGeod GetStart(void)
|
||||
{
|
||||
|
|
|
@ -92,7 +92,7 @@ void write_index( const string& base, const SGBucket& b, const string& name )
|
|||
// update index file (list of shared objects to be included in final
|
||||
// scenery build)
|
||||
void write_index_shared( const string &base, const SGBucket &b,
|
||||
const Point3D &p, const string& name,
|
||||
const SGGeod &p, const string& name,
|
||||
const double &heading )
|
||||
{
|
||||
string dir = base + "/" + b.gen_base_path();
|
||||
|
@ -111,12 +111,12 @@ void write_index_shared( const string &base, const SGBucket &b,
|
|||
}
|
||||
|
||||
fprintf( fp, "OBJECT_SHARED %s %.6f %.6f %.1f %.2f\n", name.c_str(),
|
||||
p.lon(), p.lat(), p.elev(), heading );
|
||||
p.getLongitudeDeg(), p.getLatitudeDeg(), p.getElevationM(), heading );
|
||||
fclose( fp );
|
||||
}
|
||||
|
||||
void write_object_sign( const string &base, const SGBucket &b,
|
||||
const Point3D &p, const string& sign,
|
||||
const SGGeod &p, const string& sign,
|
||||
const double &heading, const int &size)
|
||||
{
|
||||
string dir = base + "/" + b.gen_base_path();
|
||||
|
@ -135,7 +135,7 @@ void write_object_sign( const string &base, const SGBucket &b,
|
|||
}
|
||||
|
||||
fprintf( fp, "OBJECT_SIGN %s %.6f %.6f %.1f %.2f %u\n", sign.c_str(),
|
||||
p.lon(), p.lat(), p.elev(), heading, size );
|
||||
p.getLongitudeDeg(), p.getLatitudeDeg(), p.getElevationM(), heading, size );
|
||||
fclose( fp );
|
||||
}
|
||||
|
||||
|
|
|
@ -50,13 +50,13 @@ void write_index( const std::string& base, const SGBucket& b, const std::string&
|
|||
// update index file (list of shared objects to be included in final
|
||||
// scenery build)
|
||||
void write_index_shared( const std::string &base, const SGBucket &b,
|
||||
const Point3D &p, const std::string& name,
|
||||
const SGGeod &p, const std::string& name,
|
||||
const double &heading );
|
||||
|
||||
// update index file (list of shared objects to be included in final
|
||||
// scenery build)
|
||||
void write_object_sign( const std::string &base, const SGBucket &b,
|
||||
const Point3D &p, const std::string& sign,
|
||||
const SGGeod &p, const std::string& sign,
|
||||
const double &heading, const int &size );
|
||||
|
||||
void write_boundary( const std::string& base, const SGBucket& b,
|
||||
|
|
Loading…
Add table
Reference in a new issue