00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _TILEENTRY_HXX
00025 #define _TILEENTRY_HXX
00026
00027
00028 #ifndef __cplusplus
00029 # error This library requires C++
00030 #endif
00031
00032 #include <simgear/compiler.h>
00033
00034 #include <vector>
00035 #include <string>
00036
00037 #include <simgear/bucket/newbucket.hxx>
00038 #include <simgear/math/point3d.hxx>
00039 #include <simgear/misc/sg_path.hxx>
00040
00041 #include <osg/ref_ptr>
00042 #include <osgDB/ReaderWriter>
00043 #include <osg/Group>
00044 #include <osg/LOD>
00045
00046 #if defined( sgi )
00047 #include <strings.h>
00048 #endif
00049
00050 using std::string;
00051 using std::vector;
00052
00053 namespace simgear {
00054
00055 class ModelLoadHelper;
00056
00060 class TileEntry {
00061
00062 public:
00063
00064 SGBucket tile_bucket;
00065 std::string tileFileName;
00066
00067 typedef vector < Point3D > point_list;
00068 typedef point_list::iterator point_list_iterator;
00069 typedef point_list::const_iterator const_point_list_iterator;
00070
00071 private:
00072
00073
00074 osg::ref_ptr<osg::LOD> _node;
00075
00076
00077 osg::ref_ptr<osg::Referenced> _databaseRequest;
00078
00079 static bool obj_load( const std::string& path,
00080 osg::Group* geometry,
00081 bool is_base,
00082 const osgDB::ReaderWriter::Options* options);
00083
00091 bool is_inner_ring;
00092
00093 static ModelLoadHelper *_modelLoader;
00094
00095 public:
00096
00097
00098 TileEntry( const SGBucket& b );
00099
00100
00101 ~TileEntry();
00102
00103 static void setModelLoadHelper(ModelLoadHelper *m) { _modelLoader=m; }
00104
00105
00106
00107 void prep_ssg_node(float vis);
00108
00112 static osg::Node* loadTileByFileName(const std::string& index_str,
00113 const osgDB::ReaderWriter::Options*);
00118 inline bool is_loaded() const
00119 {
00120 return _node->getNumChildren() > 0;
00121 }
00122
00126 inline const SGBucket& get_tile_bucket() const { return tile_bucket; }
00127
00131 void addToSceneGraph( osg::Group *terrain_branch);
00132
00137 void removeFromSceneGraph();
00138
00139
00143 osg::LOD *getNode() const { return _node.get(); }
00144
00145 double get_timestamp() const;
00146 void set_timestamp( double time_ms );
00147
00148 inline bool get_inner_ring() const { return is_inner_ring; }
00149 inline void set_inner_ring( bool val ) { is_inner_ring = val; }
00150
00151
00152
00153 osg::ref_ptr<osg::Referenced>& getDatabaseRequest()
00154 {
00155 return _databaseRequest;
00156 }
00157 };
00158
00159 class ModelLoadHelper {
00160 public:
00161 virtual osg::Node *loadTileModel(const string& modelPath, bool cacheModel)=0;
00162
00163 };
00164
00165 }
00166
00167 #endif // _TILEENTRY_HXX