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