1
0
Fork 0

water runway support

This commit is contained in:
Christian Schmitt 2011-09-27 12:54:41 +02:00
parent d1aece0be3
commit dfd63f3fd8
3 changed files with 92 additions and 33 deletions

View file

@ -236,46 +236,50 @@ static void build_runway( const TGRunway& rwy_info,
material = "grass_rwy";
} else if ( surface_code == 4 /* Dirt */
|| surface_code == 5 /* Gravel */
|| surface_code == 12 /* Dry lakebed */ ) {
|| surface_code == 12 /* Dry lakebed */
|| surface_code == 13 /* Water */
|| surface_code == 14 /* Snow/Ice */
|| surface_code == 15 /* Transparent */) {
material = "dirt_rwy";
} else {
SG_LOG(SG_GENERAL, SG_WARN, "surface_code = " << surface_code);
throw sg_exception("unknown runway type!");
}
if ( rwy_info.type == 102 ){
SG_LOG(SG_GENERAL, SG_INFO, "Generating Helipad" );
gen_heli( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
}
if ( rwy_info.type == 102 ){
SG_LOG(SG_GENERAL, SG_INFO, "Generating Helipad" );
gen_heli( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
}
SG_LOG(SG_GENERAL, SG_DEBUG, "marking code = " << rwy_info.marking_code1 << " / " << rwy_info.marking_code2);
if ( rwy_info.type == 100 ){
if ( surface_code == 3 /* Turf/Grass */
|| surface_code == 4 /* Dirt */
|| surface_code == 5 /* Gravel */ )
{
gen_simple_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if (rwy_info.marking_code1 == 5 ||
rwy_info.marking_code1 == 4 ||
rwy_info.marking_code1 == 3 ||
rwy_info.marking_code1 == 2 ||
rwy_info.marking_code1 == 1 ||
rwy_info.marking_code1 == 0 ) {
if ( rwy_info.type == 100 ){
if ( surface_code == 3 /* Turf/Grass */
|| surface_code == 4 /* Dirt */
|| surface_code == 5 /* Gravel */ )
{
gen_simple_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if (rwy_info.marking_code1 == 5 ||
rwy_info.marking_code1 == 4 ||
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 */ ) {
// do nothing for now.
} else {
// unknown runway code ... hehe, I know, let's just die
// 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 marking code = " <<
rwy_info.marking_code1 );
throw sg_exception("Unknown runway code in build.cxx:build_airport()");
gen_rwy( rwy_info, alt_m, material,
rwy_polys, texparams, accum );
} else if ( surface_code == 13 /* Water buoys */ ) {
// do nothing for now.
} else {
// unknown runway code ... hehe, I know, let's just die
// 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 marking code = " <<
rwy_info.marking_code1 );
throw sg_exception("Unknown runway code in build.cxx:build_airport()");
}
}
}
TGPolygon base, safe_base;
if (rwy_info.type == 100){
@ -303,6 +307,7 @@ if ( rwy_info.type == 100 ){
// build 3d airport
void build_airport( string airport_id, float alt_m,
string_list& runways_raw,
string_list& water_raw,
string_list& beacons_raw,
string_list& towers_raw,
string_list& windsocks_raw,
@ -459,6 +464,38 @@ void build_airport( string airport_id, float alt_m,
SGBucket b( apt_lon / (double)rwy_count, apt_lat / (double)rwy_count );
SG_LOG(SG_GENERAL, SG_INFO, b.gen_base_path() << "/" << b.gen_index_str());
point_list water_rw; water_rw.clear();
for ( i = 0; i < (int)water_raw.size(); ++i ) {
string water_str = water_raw[i];
vector<string> token = simgear::strutils::split( water_str );
//first runway end coordinates
double lat_1 = atof( token[4].c_str() );
double lon_1 = atof( token[5].c_str() );
SGGeod pos_1(SGGeod::fromDegFt(lon_1, lat_1, 0.0));
//opposite end coordinates
double lat_2 = atof( token[7].c_str() );
double lon_2 = atof( token[8].c_str() );
SGGeod pos_2(SGGeod::fromDegFt(lon_2, lat_2, 0.0));
//runway centerpoint
Point3D rw_center = Point3D( (lon_1 + lon_2) / 2 , (lat_1 + lat_2) / 2, 0);
double heading = (SGGeodesy::courseDeg(pos_1, pos_2));
double length = (SGGeodesy::distanceM(pos_1, pos_2));
double width = atoi( token[1].c_str() );
TGPolygon rw_outline = gen_wgs84_area(rw_center, length, 0, 0, width,
heading, 0, false);
for ( i = 0; i < rw_outline.contour_size( 0 ); ++i ) {
water_rw.push_back( rw_outline.get_pt( 0, i ) );
}
}
point_list beacons; beacons.clear();
for ( i = 0; i < (int)beacons_raw.size(); ++i ) {
string beacon_str = beacons_raw[i];
@ -1050,6 +1087,8 @@ void build_airport( string airport_id, float alt_m,
SG_LOG(SG_GENERAL, SG_DEBUG, "Done with base calc_elevations()");
SG_LOG(SG_GENERAL, SG_INFO, "Computing beacon node elevations");
point_list water_buoys_nodes = calc_elevations( apt_surf, water_rw, 0.0 );
SG_LOG(SG_GENERAL, SG_INFO, "Computing beacon node elevations");
point_list beacon_nodes = calc_elevations( apt_surf, beacons, 0.0 );
SG_LOG(SG_GENERAL, SG_INFO, "Computing tower node elevations");
@ -1338,6 +1377,13 @@ void build_airport( string airport_id, float alt_m,
// write out airport object reference
write_index( objpath, b, name );
// write out water runway buoys references
for ( i = 0; i < (int)water_buoys_nodes.size(); ++i ) {
write_index_shared( objpath, b, water_buoys_nodes[i],
"Models/Airport/water_rw_buoy.ac",
0.0 );
}
// write out beacon references
for ( i = 0; i < (int)beacon_nodes.size(); ++i ) {
write_index_shared( objpath, b, beacon_nodes[i],

View file

@ -36,6 +36,7 @@
// build 3d airport
void build_airport( string airport_id, float alt_m,
string_list& runways_raw,
string_list& water_raw,
string_list& beacons_raw,
string_list& towers_raw,
string_list& windsocks_raw,

View file

@ -248,6 +248,7 @@ int main( int argc, char **argv ) {
}
string_list runways_list;
string_list water_rw_list;
string_list beacon_list;
string_list tower_list;
string_list windsock_list;
@ -302,9 +303,11 @@ int main( int argc, char **argv ) {
if ( runways_list.size() ) {
vector<string> rwy_token
= simgear::strutils::split( runways_list[0] );
if ( token[0] == "100" ){
rwy = token[8];
lat = atof( token[9].c_str() );
lon = atof( token[10].c_str() );
}
if ( airport_id.length() && airport_id == last_apt_id ) {
ready_to_go = true;
@ -331,6 +334,7 @@ int main( int argc, char **argv ) {
build_airport( last_apt_id,
elev * SG_FEET_TO_METER,
runways_list,
water_rw_list,
beacon_list,
tower_list,
windsock_list,
@ -364,13 +368,18 @@ int main( int argc, char **argv ) {
// clear runway list for start of next airport
runways_list.clear();
water_rw_list.clear();
beacon_list.clear();
tower_list.clear();
windsock_list.clear();
light_list.clear();
} else if ( token[0] == "100" || token[0] == "102") {
// runway entry
// runway entry (Land or heli)
runways_list.push_back(line);
} else if ( token[0] == "101" ) {
// Water runway. Here we don't have to create any textures.
// Only place some buoys
water_rw_list.push_back(line);
} else if ( token[0] == "18" ) {
// beacon entry
beacon_list.push_back(line);
@ -395,7 +404,9 @@ int main( int argc, char **argv ) {
} else if ( token[0] == "00" ) {
// ??
} else if ( token[0] >= "110" ) {
//ignore lines for now
//ignore taxiways for now
} else if ( token[0] == "10" ) {
//ignore old taxiways for now
} else {
SG_LOG( SG_GENERAL, SG_ALERT,
"Unknown line in file: " << line );
@ -438,6 +449,7 @@ int main( int argc, char **argv ) {
if( is_in_range( runways_list, min_lat, max_lat, min_lon, max_lon ) ) {
build_airport( last_apt_id, elev * SG_FEET_TO_METER,
runways_list,
water_rw_list,
beacon_list,
tower_list,
windsock_list,