#include <simgear/bucket/newbucket.hxx>
#include <simgear/debug/logstream.hxx>
+#include <simgear/math/polar3d.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/math/sg_random.h>
#include <simgear/misc/sgstream.hxx>
#include <simgear/scene/material/matlib.hxx>
#include <simgear/scene/tgdb/apt_signs.hxx>
#include <simgear/scene/tgdb/obj.hxx>
+#include <simgear/scene/tgdb/vasi.hxx>
#include <Aircraft/aircraft.hxx>
#include <Include/general.hxx>
taxi_lights_selector( new ssgSelector ),
loaded(false),
pending_models(0),
+ is_inner_ring(false),
free_tracker(0)
{
// update the contents
}
if ( general.get_glDepthBits() > 16 ) {
- sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+ sgScaleVec3( lift_vec, 0.25 + agl / 400.0 + agl*agl / 5000000.0 );
} else {
- sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+ sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
sgVec3 lt_trans;
}
if ( general.get_glDepthBits() > 16 ) {
- sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+ sgScaleVec3( lift_vec, 0.01 + agl / 400.0 + agl*agl / 5000000.0 );
} else {
- sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+ sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
sgVec3 lt_trans;
}
if ( general.get_glDepthBits() > 16 ) {
- sgScaleVec3( lift_vec, 0.0 + agl / 500.0 );
+ sgScaleVec3( lift_vec, 0.01 + agl / 400.0 + agl*agl / 5000000.0 );
} else {
- sgScaleVec3( lift_vec, 0.0 + agl / 150.0 );
+ sgScaleVec3( lift_vec, 0.25 + agl / 150.0 );
}
sgVec3 lt_trans;
taxi_lights_selector->select(0x00);
}
}
+
+ if ( vasi_lights_transform && is_inner_ring ) {
+ // now we need to traverse the list of vasi lights and update
+ // their coloring (but only for the inner ring, no point in
+ // doing this extra work for tiles that are relatively far
+ // away.)
+ for ( int i = 0; i < vasi_lights_transform->getNumKids(); ++i ) {
+ // cout << "vasi root = " << i << endl;
+ ssgBranch *v = (ssgBranch *)vasi_lights_transform->getKid(i);
+ for ( int j = 0; j < v->getNumKids(); ++j ) {
+ // cout << " vasi branch = " << j << endl;
+ ssgTransform *kid = (ssgTransform *)v->getKid(j);
+ SGVASIUserData *vasi = (SGVASIUserData *)kid->getUserData();
+
+ if ( vasi != NULL ) {
+ sgdVec3 s;
+ sgdCopyVec3( s, vasi->get_abs_pos() );
+ Point3D start(s[0], s[1], s[2]);
+
+ sgdVec3 d;
+ sgdCopyVec3( d, globals->get_current_view()->get_absolute_view_pos() );
+
+ double dist = sgdDistanceVec3( s, d );
+
+ if ( dist < 10000 ) {
+ double cur_alt
+ = globals->get_current_view()->getAltitudeASL_ft()
+ * SG_FEET_TO_METER;
+
+ double y = cur_alt - vasi->get_alt_m();
+
+ double angle;
+ if ( dist != 0 ) {
+ angle = asin( y / dist );
+ } else {
+ angle = 0.0;
+ }
+
+ vasi->set_color(angle * SG_RADIANS_TO_DEGREES);
+ }
+ // cout << " dist = " << dist
+ // << " angle = " << angle * SG_RADIANS_TO_DEGREES
+ // << endl;
+ } else {
+ SG_LOG( SG_TERRAIN, SG_ALERT, "no vasi data!" );
+ }
+ }
+ }
+ }
}
void
-FGTileEntry::load( const string &base_path, bool is_base )
+FGTileEntry::load( const string_list &path_list, bool is_base )
{
- SG_LOG( SG_TERRAIN, SG_INFO, "load() base search path = "
- << base_path );
-
bool found_tile_base = false;
- string_list search = sgPathSplit( base_path );
-
// obj_load() will generate ground lighting for us ...
ssgVertexArray *light_pts = new ssgVertexArray( 100 );
ssgBranch* new_tile = new ssgBranch;
unsigned int i = 0;
- while ( i < search.size() ) {
+ while ( i < path_list.size() ) {
bool has_base = false;
// Generate names for later use
string index_str = tile_bucket.gen_index_str();
- SGPath tile_path = search[i];
+ SGPath tile_path = path_list[i];
tile_path.append( tile_bucket.gen_base_path() );
SGPath basename = tile_path;
geometry, NULL, NULL, NULL, light_pts,
true ) )
{
+ geometry->getKid( 0 )->setTravCallback(
+ SSG_CALLBACK_PRETRAV,
+ &FGTileMgr::tile_filter_cb );
new_tile -> addKid( geometry );
} else {
delete geometry;
taxi_lights, NULL, false ) )
{
if ( geometry -> getNumKids() > 0 ) {
+ geometry->getKid( 0 )->setTravCallback(
+ SSG_CALLBACK_PRETRAV,
+ &FGTileMgr::tile_filter_cb );
new_tile -> addKid( geometry );
} else {
delete geometry;
FGDeferredModel *dm
= new FGDeferredModel( custom_path.str(),
tile_path.str(),
+ tile_bucket,
this, obj_trans );
FGTileMgr::model_ready( dm );
ssgBranch *geometry = new ssgBranch;
Point3D c;
double br;
- if ( sgGenTile( search[0], tile_bucket, &c, &br,
+ if ( sgGenTile( path_list[0], tile_bucket, &c, &br,
globals->get_matlib(), geometry ) )
{
center = c;
}
}
+void
+FGTileEntry::makeDList( ssgBranch *b )
+{
+ int nb = b->getNumKids();
+ for (int i = 0; i<nb; i++) {
+ ssgEntity *e = b->getKid(i);
+ if (e->isAKindOf(ssgTypeLeaf())) {
+ ((ssgLeaf*)e)->makeDList();
+ } else if (e->isAKindOf(ssgTypeBranch())) {
+ makeDList( (ssgBranch*)e );
+ }
+ }
+}
void
FGTileEntry::add_ssg_nodes( ssgBranch *terrain_branch,
{
// bump up the ref count so we can remove this later without
// having ssg try to free the memory.
+#if PLIB_VERSION > 183
+ makeDList( terra_transform );
+#endif
+
terra_transform->ref();
terrain_branch->addKid( terra_transform );