00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _CLOUDFIELD_HXX
00024 #define _CLOUDFIELD_HXX
00025
00026 #include <plib/sg.h>
00027 #include <simgear/compiler.h>
00028 #include <vector>
00029
00030 #include <osgDB/ReaderWriter>
00031
00032 #include <osg/ref_ptr>
00033 #include <osg/Array>
00034 #include <osg/Geometry>
00035 #include <osg/Group>
00036 #include <osg/Switch>
00037
00038 namespace osg
00039 {
00040 class Fog;
00041 class StateSet;
00042 class Vec4f;
00043 }
00044
00045 #include <simgear/misc/sg_path.hxx>
00046 #include <simgear/structure/Singleton.hxx>
00047
00048 using std::vector;
00049
00050 class SGNewCloud;
00051
00055 class SGCloudField {
00056
00057 private:
00058 class Cloud {
00059 public:
00060 SGNewCloud *aCloud;
00061 sgVec3 pos;
00062 bool visible;
00063 };
00064
00065 float Rnd(float);
00066
00067
00068 static const int BRANCH_SIZE = 16;
00069 static const int QUADTREE_SIZE = 32;
00070
00071
00072 sgVec3 relative_position;
00073
00074
00075 osg::ref_ptr<osg::Group> field_root;
00076 osg::ref_ptr<osg::MatrixTransform> field_transform;
00077 osg::ref_ptr<osg::PositionAttitudeTransform> altitude_transform;
00078 osg::ref_ptr<osg::Switch> field_group[QUADTREE_SIZE][QUADTREE_SIZE];
00079 osg::ref_ptr<osg::LOD> quad[BRANCH_SIZE][BRANCH_SIZE];
00080
00081 osg::ref_ptr<osg::LOD> field_lod;
00082
00083 double deltax, deltay, alt;
00084 double last_course;
00085 sgSphere field_sphere;
00086 float last_coverage;
00087 float coverage;
00088 SGGeoc cld_pos;
00089 int reposition_count;
00090 struct CloudFog : public simgear::Singleton<CloudFog>
00091 {
00092 CloudFog();
00093 osg::ref_ptr<osg::Fog> fog;
00094 };
00095 public:
00096
00097 SGCloudField();
00098 ~SGCloudField();
00099
00100 void clear(void);
00101
00102
00103 void addCloud( SGVec3f& pos, SGNewCloud *cloud);
00104
00115 bool reposition( const SGVec3f& p, const SGVec3f& up,
00116 double lon, double lat, double dt, int asl);
00117
00118 osg::Group* getNode() { return field_root.get(); }
00119
00120
00121 static float CloudVis;
00122
00123 static sgVec3 view_vec, view_X, view_Y;
00124
00125 static float view_distance;
00126 static double timer_dt;
00127 static float fieldSize;
00128
00129 bool defined3D;
00130
00131 float getCoverage(void) { return coverage; }
00132 void setCoverage(float c) { coverage = c; }
00133
00134 static float getVisRange(void) { return view_distance; }
00135 static void setVisRange(float d) { view_distance = d; }
00136
00137 void applyCoverage(void);
00138 void applyVisRange(void);
00139
00140 static osg::Fog* getFog()
00141 {
00142 return CloudFog::instance()->fog.get();
00143 }
00144 static void updateFog(double visibility, const osg::Vec4f& color);
00145 };
00146
00147 #endif // _CLOUDFIELD_HXX