X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScenery%2Ftileentry.hxx;h=54cebe768ead04c2ec6e2d5cdc6429a1a2726343;hb=948aa70af78626584042b70fdf3c3babfb5aa804;hp=719536110b167e19f8dd4334b991b9c39e5f23a2;hpb=858f17b323a3c553dfa70195449fae594bff3e53;p=flightgear.git diff --git a/src/Scenery/tileentry.hxx b/src/Scenery/tileentry.hxx index 719536110..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, 1999 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,166 +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 -#include STL_STRING - -#include // plib includes - -#include -#include -#include -#include - -#ifdef FG_HAVE_NATIVE_SGI_COMPILERS -#include -#endif - -FG_USING_STD(string); -FG_USING_STD(vector); - +#include -typedef vector < Point3D > point_list; -typedef point_list::iterator point_list_iterator; -typedef point_list::const_iterator const_point_list_iterator; +#include +#include +#include +#include +#include +#include -// Scenery tile class -class FGTileEntry { - -private: - - // Tile state - enum tile_state { - Unused = 0, - Scheduled = 1, - Loaded = 2 - }; +/** + * A class to encapsulate everything we need to know about a scenery tile. + */ +class TileEntry { public: - - typedef vector < fgFRAGMENT > container; - typedef container::iterator FragmentIterator; - typedef container::const_iterator FragmentConstIterator; - -public: - // node list (the per fragment face lists reference this node list) - point_list nodes; - int ncount; - - // global tile culling data - Point3D center; - double bounding_radius; - Point3D offset; - - // model view matrix for this tile - GLfloat model_view[16]; - // this tile's official location in the world - FGBucket tile_bucket; + SGBucket tile_bucket; + std::string tileFileName; - // the tile cache will keep track here if the tile is being used - tile_state state; - - container fragment_list; - - // ssg related structures - sgVec3 *vtlist; - sgVec3 *vnlist; - sgVec2 *tclist; +private: - // pointer to ssg branch; - ssgTransform *branch_ptr; + // pointer to ssg range selector for this tile + osg::ref_ptr _node; + // Reference to DatabaseRequest object set and used by the + // osgDB::DatabasePager. + osg::ref_ptr _databaseRequest; + + /** + * 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. + */ + float _priority; + /** Flag indicating if tile belongs to current view. */ + bool _current_view; + /** Time when tile expires. */ + double _time_expired; public: // Constructor - FGTileEntry ( void ); + TileEntry( const SGBucket& b ); + TileEntry( const TileEntry& t ); // Destructor - ~FGTileEntry ( void ); - - FragmentIterator begin() { return fragment_list.begin(); } - FragmentConstIterator begin() const { return fragment_list.begin(); } - - FragmentIterator end() { return fragment_list.end(); } - FragmentConstIterator end() const { return fragment_list.end(); } - - void add_fragment( fgFRAGMENT& frag ) { - frag.tile_ptr = this; - fragment_list.push_back( frag ); - } - - size_t num_fragments() const { - return fragment_list.size(); - } - - // Step through the fragment list, deleting the display list, then - // the fragment, until the list is empty. - void release_fragments(); - - // Calculate this tile's offset - void SetOffset( const Point3D& off) + ~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); + + /** + * 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 { - offset = center - off; + return _node->getNumChildren() > 0; } - // Return this tile's offset - inline Point3D get_offset( void ) const { return offset; } - - // Calculate the model_view transformation matrix for this tile - inline void update_view_matrix(GLfloat *MODEL_VIEW) + /** + * Return the "bucket" for this tile + */ + inline const SGBucket& get_tile_bucket() const { return tile_bucket; } + + /** + * Add terrain mesh and ground lighting to scene graph. + */ + void addToSceneGraph( osg::Group *terrain_branch); + + /** + * disconnect terrain mesh and ground lighting nodes from scene + * graph for this tile. + */ + void removeFromSceneGraph(); + + /** + * Refresh a tile, reload the node from disk. + */ + void refresh(); + + /** + * return the scenegraph node for the terrain + */ + 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() { - -#if defined( USE_MEM ) || defined( WIN32 ) - memcpy( model_view, MODEL_VIEW, 16*sizeof(GLfloat) ); -#else - bcopy( MODEL_VIEW, model_view, 16*sizeof(GLfloat) ); -#endif - - // This is equivalent to doing a glTranslatef(x, y, z); - model_view[12] += (model_view[0]*offset.x() + - model_view[4]*offset.y() + - model_view[8]*offset.z()); - model_view[13] += (model_view[1]*offset.x() + - model_view[5]*offset.y() + - model_view[9]*offset.z()); - model_view[14] += (model_view[2]*offset.x() + - model_view[6]*offset.y() + - model_view[10]*offset.z() ); - // m[15] += (m[3]*x + m[7]*y + m[11]*z); - // m[3] m7[] m[11] are 0.0 see LookAt() in views.cxx - // so m[15] is unchanged + return _databaseRequest; } - - inline bool is_unused() const { return state == Unused; } - inline bool is_loaded() const { return state == Loaded; } - - inline void mark_unused() { state = Unused; } - inline void mark_scheduled() { state = Scheduled; } - inline void mark_loaded() { state = Loaded; } }; - -typedef vector < FGTileEntry > tile_list; -typedef tile_list::iterator tile_list_iterator; -typedef tile_list::const_iterator const_tile_list_iterator; - - #endif // _TILEENTRY_HXX