X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftilemgr.hxx;h=766513d019053ae7f8b900fa9bbf17eca95b8130;hb=3d4806adbe6705f785fd950bd4b4afde1cb4f8d2;hp=ab4c422a9744dec9d78afa15c34c6d47f9963a6b;hpb=3d7f467c61873b624bdcc0389273415791852f73;p=flightgear.git diff --git a/src/Scenery/tilemgr.hxx b/src/Scenery/tilemgr.hxx index ab4c422a9..766513d01 100644 --- a/src/Scenery/tilemgr.hxx +++ b/src/Scenery/tilemgr.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started January 1998. // -// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com +// Copyright (C) 1997 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -24,173 +24,92 @@ #ifndef _TILEMGR_HXX #define _TILEMGR_HXX - -#ifndef __cplusplus -# error This library requires C++ -#endif - #include -#include -#include - -#include - -#include +#include #include -#ifdef ENABLE_THREADS -# include -#endif // ENABLE_THREADS - -#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) -#else -# define FG_MEM_COPY(to,from,n) bcopy(from, to, n) -#endif - -SG_USING_STD( queue ); +#include "SceneryPager.hxx" +#include "tileentry.hxx" +#include "tilecache.hxx" +namespace osg +{ +class Node; +} -// forward declaration -class FGTileEntry; -class FGDeferredModel; +namespace simgear +{ +class SGTerraSync; +class SGReaderWriterOptions; +} - -class FGTileMgr { +class FGTileMgr : public SGSubsystem { private: // Tile loading state enum load_state { - Start = 0, - Inited = 1, - Running = 2 + Start = 0, + Inited = 1, + Running = 2 }; - load_state state; - - // initialize the cache - void initialize_queue(); + load_state state, last_state; - // schedule a tile for loading - void sched_tile( const SGBucket& b ); + // schedule a tile for loading, returns true when tile is already loaded + bool sched_tile( const SGBucket& b, double priority,bool current_view, double request_time); // 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; + void schedule_needed(const SGBucket& curr_bucket, double rangeM); 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; - + osg::ref_ptr _options; + // current longitude latitude double longitude; double latitude; - double altitude_m; + double scheduled_visibility; /** * tile cache */ - FGNewCache tile_cache; + TileCache tile_cache; + simgear::SGTerraSync* _terra_sync; - /** - * Queue tiles for loading. - */ - FGTileLoader loader; - int counter_hack; + // update various queues internal queues + void update_queues(); - /** - * 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 - static queue delete_queue; + // schedule tiles for the viewer bucket + void schedule_tiles_at(const SGGeod& location, double rangeM); -public: + static void refresh_tile(void* tileMgr, long tileIndex); - /** - * Add a loaded tile to the 'attach to the scene graph' queue. - */ - static void ready_to_attach( FGTileEntry *t ) { attach_queue.push( t ); } + SGPropertyNode_ptr _visibilityMeters; + SGPropertyNode_ptr _maxTileRangeM, _disableNasalHooks; + SGPropertyNode_ptr _scenery_loaded, _scenery_override; - /** - * Add a pending model to the 'deferred model load' queue - */ - static void model_ready( FGDeferredModel *dm ) { model_queue.push( dm ); } + osg::ref_ptr _pager; public: - - // Constructor FGTileMgr(); - - // Destructor ~FGTileMgr(); - // Initialize the Tile Manager subsystem - int init(); + // Initialize the Tile Manager + virtual void init(); + virtual void reinit(); + virtual void update(double dt); - // Update the various queues maintained by the tilemagr (private - // internal function, do not call directly.) - void update_queues(); + const SGBucket& get_current_bucket () const { return current_bucket; } + + // Returns true if scenery is available for the given lat, lon position + // within a range of range_m. + // lat and lon are expected to be in degrees. + bool schedule_scenery(const SGGeod& position, double range_m, double duration=0.0); - // 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 visibility_meters ); - int update( SGLocation *location, double visibility_meters, - sgdVec3 abs_pos_vector ); - - int updateCurrentElevAtPos( sgdVec3 abs_pos_vector, double altitude_m, - 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. - 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 corresponding to each tile. For each - // tile, set the ssg transform and update it's range selector - // based on current visibilty void prep_ssg_nodes( float - // visibility_meters ); - void prep_ssg_nodes( SGLocation *location, float visibility_meters ); - - // 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; } + // Returns true if tiles around current view position have been loaded + bool isSceneryLoaded(); };