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