X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftileentry.hxx;h=54cebe768ead04c2ec6e2d5cdc6429a1a2726343;hb=68c71d5787f2a0309e35c3e05939950113618cb7;hp=d1fdb93e26c0709c79620856f01da52c18c1f69b;hpb=2afcbb4bc815e02f8b0c2e42f0047387b6bddb49;p=flightgear.git diff --git a/src/Scenery/tileentry.hxx b/src/Scenery/tileentry.hxx index d1fdb93e2..54cebe768 100644 --- a/src/Scenery/tileentry.hxx +++ b/src/Scenery/tileentry.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started May 1998. // -// Copyright (C) 1998 - 2001 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 1998 - 2001 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$ @@ -25,219 +25,126 @@ #define _TILEENTRY_HXX -#ifndef __cplusplus +#ifndef __cplusplus # error This library requires C++ -#endif - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_WINDOWS_H -# include #endif -#include -#include - #include #include -#include STL_STRING - -#include // plib includes +#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; - ssgTransform *obj_trans; - -public: - - inline FGDeferredModel() { } - inline FGDeferredModel( const string mp, const string tp, - FGTileEntry *t, ssgTransform *ot ) - { - model_path = mp; - texture_path = tp; - tile = t; - obj_trans = ot; - } - inline ~FGDeferredModel() { } - inline string get_model_path() const { return model_path; } - inline string get_texture_path() const { return texture_path; } - inline FGTileEntry *get_tile() const { return tile; } - inline ssgTransform *get_obj_trans() const { return obj_trans; } -}; +#include +#include +#include +#include +#include /** * A class to encapsulate everything we need to know about a scenery tile. */ -class FGTileEntry { +class TileEntry { public: - - typedef vector < sgVec3 * > free_vec3_list; - typedef vector < sgVec2 * > free_vec2_list; - typedef vector < unsigned short * > free_index_list; - - // node list - point_list nodes; - int ncount; - - // global tile culling data - Point3D center; - double bounding_radius; - Point3D offset; - // this tile's official location in the world SGBucket tile_bucket; - - // list of pointers to memory chunks that need to be freed when - // tile entry goes away - free_vec3_list vec3_ptrs; - free_vec2_list vec2_ptrs; - free_index_list index_ptrs; + std::string tileFileName; private: - // ssg tree structure for this tile is as follows: - // ssgRoot(scene) - // - ssgBranch(terrain) - // - ssgTransform(tile) - // - ssgRangeSelector(tile) - // - ssgEntity(tile) - // - kid1(fan) - // - kid2(fan) - // ... - // - kidn(fan) - - // pointer to ssg transform for this tile - ssgTransform *terra_transform; - ssgTransform *lights_transform; - // pointer to ssg range selector for this tile - ssgRangeSelector *terra_range; - ssgRangeSelector *lights_range; - - // we create several preset brightness and can choose which one we - // want based on lighting conditions. - ssgSelector *lights_brightness; + osg::ref_ptr _node; + // Reference to DatabaseRequest object set and used by the + // osgDB::DatabasePager. + osg::ref_ptr _databaseRequest; /** - * 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. + * 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 bool loaded; - - /** - * 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.) - */ - volatile int pending_models; - - ssgBranch* obj_load( const std::string& path, - ssgVertexArray* lights, bool is_base ); - - ssgLeaf* gen_lights( ssgVertexArray *lights, int inc, float bright ); + 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(); - -#ifdef WISH_PLIB_WAS_THREADED // but it isn't - // Schedule tile to be freed/removed - void sched_removal(); -#endif - - // Clean up the memory used by this tile and delete the arrays - // used by ssg as well as the whole ssg branch - void free_tile(); - - // Calculate this tile's offset - void SetOffset( const Point3D& p) - { - offset = center - p; - } - - // Return this tile's offset - inline Point3D get_offset() const { return offset; } + ~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( const Point3D& p, float vis); + 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 SGPath& base, 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; } + inline bool is_loaded() const + { + return _node->getNumChildren() > 0; + } /** - * decrement the pending models count + * Return the "bucket" for this tile */ - inline void dec_pending_models() { pending_models--; } + inline const SGBucket& get_tile_bucket() const { return tile_bucket; } /** - * return the number of remaining pending models for this tile + * Add terrain mesh and ground lighting to scene graph. */ - inline int get_pending_models() const { return pending_models; } + void addToSceneGraph( osg::Group *terrain_branch); /** - * Return the "bucket" for this tile + * disconnect terrain mesh and ground lighting nodes from scene + * graph for this tile. */ - inline SGBucket get_tile_bucket() const { return tile_bucket; } + void removeFromSceneGraph(); + + /** + * Refresh a tile, reload the node from disk. + */ + void refresh(); /** - * Add terrain mesh and ground lighting to scene graph. + * return the scenegraph node for the terrain */ - void add_ssg_nodes( ssgBranch* terrain, ssgBranch* ground ); + osg::LOD *getNode() const { return _node.get(); } + + 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