00001 #ifndef __Terrain__
00002 #define __Terrain__
00003 
00004 #include <osg/Vec3d>
00005 #include <osg/Group>
00006 #include <osgDB/Registry>
00007 #include <osg/Geode>
00008 #include <osg/ref_ptr>
00009 #include <osg/Uniform>
00010 #include <osg/MatrixTransform>
00011 #include <osg/Matrix>
00012 #include <osg/Program>
00013 #include <osg/ShapeDrawable>
00014 #include <osg/Material>
00015 
00016 #include "SharedResource.h"
00017 #include "Thread.h"
00018 
00019 #include "Log.h"
00020 #include "MyNormalVisitor.h"
00021 #include "TileData.h"
00022 #include "TerrainDatabase.h"
00023 #include "LODManager.h"
00024 #include "TerrainGeometry.h"
00025 #include "UAVDatabase.h"
00026 #include "BitmapPool.h"
00027 #include "Tile.h"
00028 
00029 #include <list>
00030 #include <string>
00031 
00032 using namespace std;
00033 
00038 class Terrain : public osg::Group, public SharedResource {
00039 public:
00040     ~Terrain();
00041 
00042     double getVisibilityRadius();
00043     void setVisibilityRadius(double radius);
00044     void updatePosition(osg::Vec3d& position);
00045 
00046     double getHeight(double x, double y);
00047 
00048     static Terrain& instance();
00049 
00050     osg::Program* getTerrainShader();
00051 
00052     void stopAndJoinAll();
00053 
00054     const char* getFileName();
00055     void setFileName(const char* fileName);
00056 
00057     void resetDatabase();
00058 
00059 protected:
00065     class Pager : public Thread, public SharedResource {
00066     public:
00067         static const int WAIT_STATE = 1;
00068         static const int READY_STATE = 2;
00069 
00070         Pager();
00071                 
00072         void request(osg::Vec3d& position);     
00073 
00074         int getState();
00075 
00076 
00077         void operator()();
00078 
00079                 Terrain& _terrain;
00080                 
00081                 void initLodManager();
00082                 void initTerrainBuffers();
00083 
00084                 void updateGeometry();
00085                 void updateTiles();     
00086 
00087                 void addTile(TileData* tileData, osg::Group* terrain);          
00088                 void swapTerrainBuffers();
00089                                 
00090                 void releaseLodManager();               
00091                 
00092                 void addAirfields();
00093                 void transformPosition(osg::MatrixTransform* mt, double latdeg, double latmin, double latsec, double londeg, double lonmin, double lonsec);
00094                 void addCoordinateAxes();
00095                 void addGridLines();
00096 
00098                 list<osg::Vec3d> _updateRequests;
00100                 osg::ref_ptr <osg::Group> _terrainBuffer;
00102                 int _freeTerrainBuffer;
00103 
00104                 UAVDatabase* _database;
00105                 LODManager* _lodManager;
00106                 TerrainGeometry* _terrainGeometry;
00107                 double frameTimeStamp;
00108                 Log myLog;
00109                 float _skirtHeight;
00110 
00111         int _state;
00112 
00113                 osg::ref_ptr <osg::Group> _airfields;           
00114                 osg::ref_ptr <osg::Geode> _greenball;
00115     };
00116    
00117     Terrain();
00118 
00119     SharedResource _fileNameResource;
00120     volatile char* _fileName;
00121 
00122     double _visibilityRadius;
00123     osg::Program* _terrainShader;
00124         osg::Vec3d* _lastPosition;
00125     Pager _pager;       
00126 };
00127 
00128 
00129 
00130 #endif