X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftilemgr.hxx;h=9eebc5dcb5af0c9166d9685320b455e0cfe40e85;hb=048da049f87fe3f543795f3b1b511d774caa2787;hp=7c1740e8be8ba1b9debee55d394e9cd5eccdc135;hpb=c90db01dc8d5462a3da22771ffa7c96f5ea31217;p=flightgear.git diff --git a/src/Scenery/tilemgr.hxx b/src/Scenery/tilemgr.hxx index 7c1740e8b..9eebc5dcb 100644 --- a/src/Scenery/tilemgr.hxx +++ b/src/Scenery/tilemgr.hxx @@ -29,19 +29,21 @@ # error This library requires C++ #endif -#include +#include +#include -#include +#include -#include +#include +#include +#ifdef ENABLE_THREADS +# include +#endif // ENABLE_THREADS -FG_USING_STD(list); - - -#define FG_LOCAL_X_Y 81 // max(o->tile_diameter) ** 2 - -#define FG_SQUARE( X ) ( (X) * (X) ) +#include "FGTileLoader.hxx" +#include "hitlist.hxx" +#include "newcache.hxx" #if defined(USE_MEM) || defined(WIN32) # define FG_MEM_COPY(to,from,n) memcpy(to, from, n) @@ -49,24 +51,18 @@ FG_USING_STD(list); # define FG_MEM_COPY(to,from,n) bcopy(from, to, n) #endif +SG_USING_STD( queue ); -class FGLoadRec { - -public: - FGBucket b; - int index; -}; +// forward declaration +class FGTileEntry; +class FGDeferredModel; class FGTileMgr { private: - // closest (potentially viewable) tiles, centered on current tile. - // This is an array of pointers to cache indexes. - int tiles[FG_LOCAL_X_Y]; - // Tile loading state enum load_state { Start = 0, @@ -76,40 +72,126 @@ private: load_state state; - // pending tile load queue - list < FGLoadRec > load_queue; + // initialize the cache + void initialize_queue(); // schedule a tile for loading - void sched_tile( const FGBucket& b, int *index ); + void sched_tile( const SGBucket& b ); + + // schedule a needed buckets for loading + void schedule_needed(double visibility_meters, SGBucket curr_bucket); + + // see comment at prep_ssg_nodes() + void prep_ssg_node( int idx ); + + FGHitList hit_list; + + SGBucket previous_bucket; + SGBucket current_bucket; + SGBucket pending; + + FGTileEntry *current_tile; + + // x and y distance of tiles to load/draw + float vis; + int xrange, yrange; + + // current longitude latitude + double longitude; + double latitude; + double last_longitude; + double last_latitude; + + /** + * tile cache + */ + FGNewCache tile_cache; + + /** + * Queue tiles for loading. + */ + FGTileLoader loader; + int counter_hack; + + /** + * Work queues. + * + * attach_queue is the tiles that have been loaded [by the pager] + * that can be attached to the scene graph by the render thread. + * + * model_queue is the set of models that need to be loaded by the + * primary render thread. + */ +#ifdef ENABLE_THREADS + static SGLockedQueue attach_queue; + static SGLockedQueue model_queue; +#else + static queue attach_queue; + static queue model_queue; +#endif // ENABLE_THREADS - // load a tile - void load_tile( const FGBucket& b, int cache_index ); +public: + + /** + * Add a loaded tile to the 'attach to the scene graph' queue. + */ + static void ready_to_attach( FGTileEntry *t ) { attach_queue.push( t ); } + +#ifdef WISH_PLIB_WAS_THREADED // but it isn't + /** + * Tile is detatched from scene graph and is ready to delete + */ + inline void ready_to_delete( FGTileEntry *t ) { loader.remove( t ); } +#endif + + /** + * Add a pending model to the 'deferred model load' queue + */ + static void model_ready( FGDeferredModel *dm ) { model_queue.push( dm ); } public: // Constructor - FGTileMgr ( void ); + FGTileMgr(); // Destructor - ~FGTileMgr ( void ); + ~FGTileMgr(); // Initialize the Tile Manager subsystem - int init( void ); + int init(); - // given the current lon/lat, fill in the array of local chunks. - // If the chunk isn't already in the cache, then read it from - // disk. - int update( void ); + // given the current lon/lat (in degrees), fill in the array of + // local chunks. If the chunk isn't already in the cache, then + // read it from disk. + int update( double lon, double lat, double visibility_meters ); + int update( double lon, double lat, double visibility_meters, sgdVec3 abs_pos_vector, SGBucket p_current, SGBucket p_previous, Point3D center ); + void setCurrentTile( double longitude, double latitude ); + int updateCurrentElevAtPos(sgdVec3 abs_pos_vector, Point3D center ); // Determine scenery altitude. Normally this just happens when we // render the scene, but we'd also like to be able to do this // explicitely. lat & lon are in radians. abs_view_pos in // meters. Returns result in meters. - double current_elev_new( const FGBucket& p ); - double current_elev( double lon, double lat, const Point3D& abs_view_pos ); - - // Render the local tiles --- hack, hack, hack - void render( void ); + void my_ssg_los( string s, ssgBranch *branch, sgdMat4 m, + const sgdVec3 p, const sgdVec3 dir, sgdVec3 normal ); + + void my_ssg_los( ssgBranch *branch, sgdMat4 m, + const sgdVec3 p, const sgdVec3 dir, + FGHitList *list ); + + // Prepare the ssg nodes ... for each tile, set it's proper + // transform and update it's range selector based on current + // visibilty + void prep_ssg_nodes(float visibility_meters); + void prep_ssg_nodes(float visibility_meters, sgVec3 up, Point3D center); + + // + // Set flag with event manager so that non-moving view refreshes tiles... + // + void refresh_view_timestamps(); + + inline SGBucket get_current_bucket () { return current_bucket; } + inline SGBucket get_previous_bucket () { return previous_bucket; } }; @@ -118,5 +200,3 @@ extern FGTileMgr global_tile_mgr; #endif // _TILEMGR_HXX - -