1
0
Fork 0

- Change the global_tile_mgr to a globals->get_tile_mgr() which is

dynamically created at run time.
- Further clean ups to the FGTileMgr class interface.
This commit is contained in:
curt 2002-12-06 22:29:46 +00:00
parent 49d843e22e
commit 1feedec8d1
8 changed files with 71 additions and 104 deletions

View file

@ -83,7 +83,7 @@ void reInit(puObject *cb)
fgReInitSubsystems();
global_tile_mgr.update( fgGetDouble("/environment/visibility-m") );
globals->get_tile_mgr()->update( fgGetDouble("/environment/visibility-m") );
cur_light_params.Update();

View file

@ -237,7 +237,7 @@ do_view_next( bool )
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->next_view();
fix_hud_visibility();
global_tile_mgr.refresh_view_timestamps();
globals->get_tile_mgr()->refresh_view_timestamps();
}
void
@ -246,7 +246,7 @@ do_view_prev( bool )
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->prev_view();
fix_hud_visibility();
global_tile_mgr.refresh_view_timestamps();
globals->get_tile_mgr()->refresh_view_timestamps();
}
/**
@ -258,7 +258,7 @@ do_view_cycle (const SGPropertyNode * arg)
globals->get_current_view()->setHeadingOffset_deg(0.0);
globals->get_viewmgr()->next_view();
fix_hud_visibility();
global_tile_mgr.refresh_view_timestamps();
globals->get_tile_mgr()->refresh_view_timestamps();
// fgReshape(fgGetInt("/sim/startup/xsize"), fgGetInt("/sim/startup/ysize"));
return true;
}
@ -288,10 +288,10 @@ do_tile_cache_reload (const SGPropertyNode * arg)
fgSetBool("/sim/freeze/master", true);
}
// BusyCursor(0);
if ( global_tile_mgr.init() ) {
if ( globals->get_tile_mgr()->init() ) {
// Load the local scenery data
double visibility_meters = fgGetDouble("/environment/visibility-m");
global_tile_mgr.update( visibility_meters );
globals->get_tile_mgr()->update( visibility_meters );
} else {
SG_LOG( SG_GENERAL, SG_ALERT,
"Error in Tile Manager initialization!" );
@ -607,7 +607,7 @@ do_presets_commit (const SGPropertyNode * arg)
// BusyCursor(0);
fgReInitSubsystems();
global_tile_mgr.update( fgGetDouble("/environment/visibility-m") );
globals->get_tile_mgr()->update( fgGetDouble("/environment/visibility-m") );
if ( ! fgGetBool("/sim/presets/onground") ) {
fgSetBool( "/sim/freeze/master", true );

View file

@ -1264,11 +1264,11 @@ bool fgInitSubsystems() {
// Initialize the scenery management subsystem.
////////////////////////////////////////////////////////////////////
if ( global_tile_mgr.init() ) {
if ( globals->get_tile_mgr()->init() ) {
// Load the local scenery data
double visibility_meters = fgGetDouble("/environment/visibility-m");
global_tile_mgr.update( visibility_meters );
globals->get_tile_mgr()->update( visibility_meters );
} else {
SG_LOG( SG_GENERAL, SG_ALERT, "Error in Tile Manager initialization!" );
exit(-1);
@ -1276,7 +1276,8 @@ bool fgInitSubsystems() {
// cause refresh of viewer scenery timestamps every 15 seconds...
global_events.Register( "FGTileMgr::refresh_view_timestamps()",
&global_tile_mgr, &FGTileMgr::refresh_view_timestamps,
globals->get_tile_mgr(),
&FGTileMgr::refresh_view_timestamps,
15000 );
SG_LOG( SG_GENERAL, SG_DEBUG,

View file

@ -47,30 +47,32 @@ typedef vector<string> string_list;
class SGEphemeris;
class SGCommandMgr;
class SGMagVar;
class SGPropertyNode;
class SGRoute;
class SGTime;
class SGPropertyNode;
class SGCommandMgr;
class FGSubsystemMgr;
class FGEnvironmentMgr;
class FGEnvironment;
class FGControls;
class FGSteam;
class FGSoundMgr;
class FGAutopilot;
class FGViewMgr;
class FGViewer;
class FGAIMgr;
class FGATCMgr;
class FGATCDisplay;
class FGAIMgr;
class FGModelLoader;
class FGTextureLoader;
class FGAircraftModel;
class FGAutopilot;
class FGControls;
class FGEnvironment;
class FGEnvironmentMgr;
class FGIO;
class FGModelLoader;
class FGModelMgr;
class FGScenery;
class FGIO;
class FGSoundMgr;
class FGSteam;
class FGSubsystemMgr;
class FGTextureLoader;
class FGTileMgr;
class FGViewMgr;
class FGViewer;
/**
* Bucket for subsystem pointers representing the sim's state.
@ -166,6 +168,9 @@ private:
// FlightGear scenery manager
FGScenery *scenery;
// Tile manager
FGTileMgr *tile_mgr;
FGIO* io;
public:
@ -290,6 +295,9 @@ public:
inline FGScenery * get_scenery () const { return scenery; }
inline void set_scenery ( FGScenery *s ) { scenery = s; }
inline FGTileMgr * get_tile_mgr () const { return tile_mgr; }
inline void set_tile_mgr ( FGTileMgr *t ) { tile_mgr = t; }
FGIO* get_io() const { return io; }
/**

View file

@ -31,7 +31,6 @@
#include <simgear/compiler.h>
#include <simgear/constants.h>
#include <simgear/bucket/newbucket.hxx>
#include <simgear/math/point3d.hxx>
#include <plib/sg.h> // plib include
@ -112,10 +111,6 @@ public:
void set_cur_elev_m ( double elev ) { _cur_elev_m = elev; }
inline double get_cur_elev_m () { return _cur_elev_m; }
// Interface to current buckets for use with tilemgr...
void set_current_bucket ( SGBucket current_bucket ) { _current_bucket = current_bucket; }
inline SGBucket get_current_bucket () { return _current_bucket; }
void set_previous_bucket ( SGBucket previous_bucket ) { _previous_bucket = previous_bucket; }
inline SGBucket get_previous_bucket () { return _previous_bucket; }
void set_tile_center ( Point3D tile_center ) { _tile_center = tile_center; }
inline Point3D get_tile_center () { return _tile_center; }
@ -149,10 +144,6 @@ private:
// elevation of ground under this location...
double _cur_elev_m;
// current and previous scenery buckets to be saved for use in
// getting current elevation from tilemgr.
SGBucket _previous_bucket;
SGBucket _current_bucket;
Point3D _tile_center;
// surface vector heading south

View file

@ -699,11 +699,6 @@ void fgRenderFrame() {
}
# endif
// position tile nodes and update range selectors
// this is done in the main loop now...
// global_tile_mgr.prep_ssg_nodes(visibility_meters);
if ( fgGetBool("/sim/rendering/skyblend") ) {
// draw the sky backdrop
@ -1208,42 +1203,34 @@ static void fgMainLoop( void ) {
// ...only if location is different than the viewer (to avoid duplicating effort)
if( acmodel_location != current_view->getFGLocation() ) {
if( acmodel_location != 0 ) {
global_tile_mgr.prep_ssg_nodes( acmodel_location, visibility_meters );
global_tile_mgr.update( acmodel_location, visibility_meters,
acmodel_location->get_absolute_view_pos(),
acmodel_location->get_current_bucket(),
acmodel_location->get_previous_bucket(),
globals->get_scenery()->get_center()
);
globals->get_tile_mgr()->prep_ssg_nodes( acmodel_location,
visibility_meters );
globals->get_tile_mgr()->
update( acmodel_location, visibility_meters,
acmodel_location->get_absolute_view_pos() );
// save results of update in FGLocation for fdm...
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
acmodel_location->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
acmodel_location->
set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
}
acmodel_location->set_current_bucket( global_tile_mgr.get_current_bucket() );
acmodel_location->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
acmodel_location->set_tile_center( globals->get_scenery()->get_next_center() );
acmodel_location->
set_tile_center( globals->get_scenery()->get_next_center() );
}
}
global_tile_mgr.prep_ssg_nodes( current_view->getFGLocation(),
visibility_meters );
globals->get_tile_mgr()->prep_ssg_nodes( current_view->getFGLocation(),
visibility_meters );
// update tile manager for view...
// IMPORTANT!!! the tilemgr update for view location _must_ be done last
// after the FDM's until all of Flight Gear code references the viewer's location
// for elevation instead of the "scenery's" current elevation.
FGLocation *view_location = globals->get_current_view()->getFGLocation();
global_tile_mgr.update( view_location, visibility_meters,
current_view->get_absolute_view_pos(),
current_view->getFGLocation()->get_current_bucket(),
current_view->getFGLocation()->get_previous_bucket(),
globals->get_scenery()->get_center()
);
globals->get_tile_mgr()->update( view_location, visibility_meters,
current_view->get_absolute_view_pos() );
// save results of update in FGLocation for fdm...
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
current_view->getFGLocation()->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
}
current_view->getFGLocation()->set_current_bucket( global_tile_mgr.get_current_bucket() );
current_view->getFGLocation()->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
current_view->getFGLocation()->set_tile_center( globals->get_scenery()->get_next_center() );
// If fdm location is same as viewer's then we didn't do the update for fdm location
@ -1253,8 +1240,6 @@ static void fgMainLoop( void ) {
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
acmodel_location->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
}
acmodel_location->set_current_bucket( global_tile_mgr.get_current_bucket() );
acmodel_location->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
acmodel_location->set_tile_center( globals->get_scenery()->get_next_center() );
}
}
@ -1640,6 +1625,9 @@ static bool fgMainInit( int argc, char **argv ) {
globals->get_scenery()->init();
globals->get_scenery()->bind();
// Initialize the global tile manager
globals->set_tile_mgr( new FGTileMgr );
////////////////////////////////////////////////////////////////////
// Initialize the property-based built-in commands
////////////////////////////////////////////////////////////////////

View file

@ -53,10 +53,6 @@
#define TEST_LAST_HIT_CACHE
// the tile manager
FGTileMgr global_tile_mgr;
#ifdef ENABLE_THREADS
SGLockedQueue<FGTileEntry *> FGTileMgr::attach_queue;
SGLockedQueue<FGDeferredModel *> FGTileMgr::model_queue;
@ -364,30 +360,30 @@ int FGTileMgr::update( double visibility_meters )
sgdVec3 abs_pos_vector;
sgdCopyVec3( abs_pos_vector,
globals->get_current_view()->get_absolute_view_pos() );
return update( location, visibility_meters, abs_pos_vector,
current_bucket, previous_bucket,
globals->get_scenery()->get_center() );
return update( location, visibility_meters, abs_pos_vector );
}
int FGTileMgr::update( FGLocation *location, double visibility_meters,
sgdVec3 abs_pos_vector, SGBucket p_current,
SGBucket p_previous, Point3D center )
sgdVec3 abs_pos_vector )
{
// SG_LOG( SG_TERRAIN, SG_DEBUG, "FGTileMgr::update() for "
// << lon << " " << lat );
longitude = location->getLongitude_deg();
latitude = location->getLatitude_deg();
current_bucket = p_current;
previous_bucket = p_previous;
// SG_LOG( SG_TERRAIN, SG_DEBUG, "FGTileMgr::update() for "
// << longitude << " " << latatitude );
// SG_LOG( SG_TERRAIN, SG_DEBUG, "lon "<< lonlat[LON] <<
// " lat " << lonlat[LAT] );
current_bucket.set_bucket( longitude, latitude );
// SG_LOG( SG_TERRAIN, SG_DEBUG, "Updating tile list for "
// << current_bucket );
// SG_LOG( SG_TERRAIN, SG_DEBUG, "Updating Tile list for " << current_bucket );
setCurrentTile( longitude, latitude);
// set global scenery center from current tile center
current_tile = tile_cache.get_tile( current_bucket );
if ( current_tile != NULL ) {
globals->get_scenery()->set_next_center( current_tile->center );
} else {
SG_LOG( SG_TERRAIN, SG_WARN, "Tile not found (Ok if initializing)" );
globals->get_scenery()->set_next_center( Point3D(0.0) );
}
// do tile load scheduling.
// Note that we need keep track of both viewer buckets and fdm buckets.
@ -416,7 +412,9 @@ int FGTileMgr::update( FGLocation *location, double visibility_meters,
// no reason to update this if we haven't moved...
if ( longitude != last_longitude || latitude != last_latitude ) {
// update current elevation...
if ( updateCurrentElevAtPos( abs_pos_vector, center ) ) {
if ( updateCurrentElevAtPos( abs_pos_vector,
globals->get_scenery()->get_center() ) )
{
last_longitude = longitude;
last_latitude = latitude;
}
@ -425,6 +423,7 @@ int FGTileMgr::update( FGLocation *location, double visibility_meters,
return 1;
}
// timer event driven call to scheduler for the purpose of refreshing the tile timestamps
void FGTileMgr::refresh_view_timestamps() {
SG_LOG( SG_TERRAIN, SG_INFO,
@ -434,21 +433,6 @@ void FGTileMgr::refresh_view_timestamps() {
}
// check and set current tile and scenery center...
void FGTileMgr::setCurrentTile(double longitude, double latitude) {
// check tile cache entry...
current_bucket.set_bucket( longitude, latitude );
if ( tile_cache.exists( current_bucket ) ) {
current_tile = tile_cache.get_tile( current_bucket );
globals->get_scenery()->set_next_center( current_tile->center );
} else {
SG_LOG( SG_TERRAIN, SG_WARN, "Tile not found (Ok if initializing)" );
globals->get_scenery()->set_next_center( Point3D(0.0) );
}
}
int FGTileMgr::updateCurrentElevAtPos(sgdVec3 abs_pos_vector, Point3D center) {
sgdVec3 sc;

View file

@ -165,9 +165,8 @@ public:
// read it from disk.
int update( double visibility_meters );
int update( FGLocation *location, double visibility_meters,
sgdVec3 abs_pos_vector, SGBucket p_current,
SGBucket p_previous, Point3D center );
void setCurrentTile( double longitude, double latitude );
sgdVec3 abs_pos_vector );
int updateCurrentElevAtPos(sgdVec3 abs_pos_vector, Point3D center );
// Determine scenery altitude. Normally this just happens when we
@ -196,8 +195,4 @@ public:
};
// the tile manager
extern FGTileMgr global_tile_mgr;
#endif // _TILEMGR_HXX