X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FScenery%2Ftilemgr.hxx;h=ff5fe42ba3eb1bf8038e1c15f3d1447f33350cfd;hb=73b92a697d023daf128110ac96ec0d630155b6b1;hp=39616d0c74e5a9efd7c9bf553f8e6064a0efaedd;hpb=0537a0ac84d4c8c723436fa313dc1d1ea240e0c4;p=flightgear.git diff --git a/src/Scenery/tilemgr.hxx b/src/Scenery/tilemgr.hxx index 39616d0c7..ff5fe42ba 100644 --- a/src/Scenery/tilemgr.hxx +++ b/src/Scenery/tilemgr.hxx @@ -31,20 +31,18 @@ #include -#include +#include #include #include +#ifdef ENABLE_THREADS +# include +#endif // ENABLE_THREADS +#include "FGTileLoader.hxx" #include "hitlist.hxx" - -FG_USING_STD(list); - - -#define FG_LOCAL_X_Y 81 // max(o->tile_diameter) ** 2 - -#define FG_SQUARE( X ) ( (X) * (X) ) +#include "newcache.hxx" #if defined(USE_MEM) || defined(WIN32) # define FG_MEM_COPY(to,from,n) memcpy(to, from, n) @@ -52,18 +50,12 @@ FG_USING_STD(list); # define FG_MEM_COPY(to,from,n) bcopy(from, to, n) #endif +SG_USING_STD( queue ); + // forward declaration class FGTileEntry; - - -class FGLoadRec { - -public: - - FGBucket b; - int cache_index; -}; +class FGDeferredModel; class FGTileMgr { @@ -79,57 +71,29 @@ private: load_state state; - enum SCROLL_DIRECTION { - SCROLL_INIT = -1, - SCROLL_NONE = 0, - SCROLL_NORTH, - SCROLL_EAST, - SCROLL_SOUTH, - SCROLL_WEST, - }; - - SCROLL_DIRECTION scroll_direction; - - // pending tile load queue - list < FGLoadRec > load_queue; - // initialize the cache void initialize_queue(); - // forced emptying of the queue. This is necessay to keep - // bookeeping straight for the tile_cache -- which actually - // handles all the (de)allocations - void destroy_queue(); - - FGBucket BucketOffset( int dx, int dy ); - // schedule a tile for loading - int sched_tile( const FGBucket& b ); - - // load a tile - void load_tile( const FGBucket& b, int cache_index ); + void sched_tile( const SGBucket& b ); - // schedule a tile row(column) for loading - void scroll( void ); + // schedule a needed buckets for loading + void schedule_needed(); // see comment at prep_ssg_nodes() void prep_ssg_node( int idx ); - // int hitcount; - // sgdVec3 hit_pts [ MAX_HITS ] ; - - // ssgEntity *last_hit; FGHitList hit_list; - FGBucket previous_bucket; - FGBucket current_bucket; - FGBucket pending; + SGBucket previous_bucket; + SGBucket current_bucket; + SGBucket pending; FGTileEntry *current_tile; - // index of current tile in tile cache; - long int tile_index; - int tile_diameter; + // x and y distance of tiles to load/draw + float vis; + int xrange, yrange; // current longitude latitude double longitude; @@ -137,16 +101,63 @@ private: 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 + +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 (in degrees), fill in the array of // local chunks. If the chunk isn't already in the cache, then @@ -164,13 +175,10 @@ public: const sgdVec3 p, const sgdVec3 dir, FGHitList *list ); - bool current_elev_ssg( const Point3D& abs_view_pos, - const Point3D& view_pos ); - // 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( void ); + void prep_ssg_nodes(); };