X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftileentry.hxx;h=54cebe768ead04c2ec6e2d5cdc6429a1a2726343;hb=68c71d5787f2a0309e35c3e05939950113618cb7;hp=a296269647f08bd723d6b5994d9f85e12e89ce88;hpb=b51292d9dbddbdd79ded6f793805d08c11c0e286;p=flightgear.git diff --git a/src/Scenery/tileentry.hxx b/src/Scenery/tileentry.hxx index a29626964..54cebe768 100644 --- a/src/Scenery/tileentry.hxx +++ b/src/Scenery/tileentry.hxx @@ -29,185 +29,75 @@ # error This library requires C++ #endif -#ifdef HAVE_CONFIG_H -# include -#endif - #include #include -#include STL_STRING +#include #include -#include #include -#include #include -#include +#include #include #include -#include -#include - -#if defined( sgi ) -#include -#endif - -SG_USING_STD(string); -SG_USING_STD(vector); - - -typedef vector < Point3D > point_list; -typedef point_list::iterator point_list_iterator; -typedef point_list::const_iterator const_point_list_iterator; - - -class FGTileEntry; - - -/** - * A class to hold deferred model loading info - */ -class FGDeferredModel { - -private: - - string model_path; - string texture_path; - FGTileEntry *tile; - osg::ref_ptr obj_trans; - SGBucket bucket; - bool cache_obj; - - -public: - - inline FGDeferredModel() { } - inline FGDeferredModel( const string& mp, const string& tp, SGBucket b, - FGTileEntry *t, osg::MatrixTransform *ot, bool co ) - { - model_path = mp; - texture_path = tp; - bucket = b; - tile = t; - obj_trans = ot; - cache_obj = co; - } - inline ~FGDeferredModel() { } - inline const string& get_model_path() const { return model_path; } - inline const string& get_texture_path() const { return texture_path; } - inline const SGBucket& get_bucket() const { return bucket; } - inline const bool get_cache_state() const { return cache_obj; } - inline FGTileEntry *get_tile() const { return tile; } - inline osg::MatrixTransform *get_obj_trans() const { return obj_trans.get(); } -}; - /** * A class to encapsulate everything we need to know about a scenery tile. */ -class FGTileEntry { +class TileEntry { public: // this tile's official location in the world SGBucket tile_bucket; + std::string tileFileName; private: - // pointer to ssg transform for this tile - osg::ref_ptr terra_transform; - // pointer to ssg range selector for this tile - osg::ref_ptr terra_range; - - /** - * Indicates this tile has been loaded from a file and connected - * into the scene graph. Note that this may be set asynchronously - * by another thread. - */ - volatile bool loaded; + osg::ref_ptr _node; + // Reference to DatabaseRequest object set and used by the + // osgDB::DatabasePager. + osg::ref_ptr _databaseRequest; /** - * Count of pending models to load for this tile. This tile - * cannot be removed until this number reaches zero (i.e. no - * pending models to load for this tile.) + * This value is used by the tile scheduler/loader to load tiles + * in a useful sequence. The priority is set to reflect the tiles + * distance from the center, so all tiles are loaded in an innermost + * to outermost sequence. */ - volatile int pending_models; - - bool obj_load( const string& path, - osg::Group* geometry, - bool is_base ); - - double timestamp; - - /** - * this value is used by the tile scheduler/loader to mark which - * tiles are in the primary ring (i.e. the current tile or the - * surrounding eight.) Other routines then can use this as an - * optimization and not do some operation to tiles outside of this - * inner ring. (For instance vasi color updating) - */ - bool is_inner_ring; - - /** - * this variable tracks the status of the incremental memory - * freeing. - */ - enum { - NODES = 0x01, - VEC_PTRS = 0x02, - TERRA_NODE = 0x04, - GROUND_LIGHTS = 0x08, - VASI_LIGHTS = 0x10, - RWY_LIGHTS = 0x20, - TAXI_LIGHTS = 0x40, - LIGHTMAPS = 0x80 - }; - int free_tracker; + float _priority; + /** Flag indicating if tile belongs to current view. */ + bool _current_view; + /** Time when tile expires. */ + double _time_expired; public: // Constructor - FGTileEntry( const SGBucket& b ); + TileEntry( const SGBucket& b ); + TileEntry( const TileEntry& t ); // Destructor - ~FGTileEntry(); - - // Clean up the memory used by this tile and delete the arrays - // used by ssg as well as the whole ssg branch. This does a - // partial clean up and exits so we can spread the load across - // multiple frames. Returns false if work remaining to be done, - // true if dynamically allocated memory used by this tile is - // completely freed. - bool free_tile(); + ~TileEntry(); // Update the ssg transform node for this tile so it can be // properly drawn relative to our (0,0,0) point void prep_ssg_node(float vis); /** - * Load tile data from a file. - * @param base name of directory containing tile data file. - * @param is_base is this a base terrain object for which we should generate - * random ground light points */ - void load( const string_list &base_path, bool is_base ); - + * Transition to OSG database pager + */ + static osg::Node* loadTileByFileName(const std::string& index_str, + const osgDB::Options*); /** * Return true if the tile entry is loaded, otherwise return false * indicating that the loading thread is still working on this. */ - inline bool is_loaded() const { return loaded; } - - /** - * decrement the pending models count - */ - inline void dec_pending_models() { pending_models--; } - - /** - * return the number of remaining pending models for this tile - */ - inline int get_pending_models() const { return pending_models; } + inline bool is_loaded() const + { + return _node->getNumChildren() > 0; + } /** * Return the "bucket" for this tile @@ -217,26 +107,44 @@ public: /** * Add terrain mesh and ground lighting to scene graph. */ - void add_ssg_nodes( osg::Group *terrain_branch); + void addToSceneGraph( osg::Group *terrain_branch); /** * disconnect terrain mesh and ground lighting nodes from scene * graph for this tile. */ - void disconnect_ssg_nodes(); + void removeFromSceneGraph(); + + /** + * Refresh a tile, reload the node from disk. + */ + void refresh(); - /** - * return the SSG Transform node for the terrain + * return the scenegraph node for the terrain */ - osg::Group *get_terra_transform() const { return terra_transform.get(); } + osg::LOD *getNode() const { return _node.get(); } - inline double get_timestamp() const { return timestamp; } - inline void set_timestamp( double time_ms ) { timestamp = time_ms; } + inline double get_time_expired() const { return _time_expired; } + inline void update_time_expired( double time_expired ) { if (_time_expired _time_expired); } + // Get the ref_ptr to the DatabaseRequest object, in order to pass + // this to the pager. + osg::ref_ptr& getDatabaseRequest() + { + return _databaseRequest; + } +}; #endif // _TILEENTRY_HXX