#include <plib/sg.h>
#include <simgear/compiler.h>
#include <vector>
-#include <osgSim/Impostor>
+
#include <osgDB/ReaderWriter>
#include <osg/ref_ptr>
#include <osg/Geometry>
#include <osg/Group>
#include <osg/Switch>
-#include <osg/Billboard>
+
+namespace osg
+{
+ class Fog;
+ class StateSet;
+ class Vec4f;
+}
#include <simgear/misc/sg_path.hxx>
+#include <simgear/structure/Singleton.hxx>
using std::vector;
osg::ref_ptr<osg::Group> field_root;
osg::ref_ptr<osg::MatrixTransform> field_transform;
+ osg::ref_ptr<osg::PositionAttitudeTransform> altitude_transform;
osg::ref_ptr<osg::Switch> field_group[QUADTREE_SIZE][QUADTREE_SIZE];
+ osg::ref_ptr<osg::LOD> quad[BRANCH_SIZE][BRANCH_SIZE];
+
osg::ref_ptr<osg::LOD> field_lod;
double deltax, deltay, alt;
double last_course;
sgSphere field_sphere;
- float last_density;
+ float last_coverage;
+ float coverage;
SGGeoc cld_pos;
int reposition_count;
+ struct CloudFog : public simgear::Singleton<CloudFog>
+ {
+ CloudFog();
+ osg::ref_ptr<osg::Fog> fog;
+ };
public:
SGCloudField();
static sgVec3 view_vec, view_X, view_Y;
- static float density;
- static double timer_dt;
+ static float view_distance;
+ static double timer_dt;
static float fieldSize;
bool defined3D;
- static float get_density(void) { return density; }
+ float getCoverage(void) { return coverage; }
+ void setCoverage(float c) { coverage = c; }
- static void set_density(float density);
-
- void applyDensity(void);
+ static float getVisRange(void) { return view_distance; }
+ static void setVisRange(float d) { view_distance = d; }
+
+ void applyCoverage(void);
+ void applyVisRange(void);
+
+ typedef std::map<std::string, osg::ref_ptr<osg::StateSet> > StateSetMap;
+ static StateSetMap cloudTextureMap;
+
+ static osg::Fog* getFog()
+ {
+ return CloudFog::instance()->fog.get();
+ }
+ static void updateFog(double visibility, const osg::Vec4f& color);
};
#endif // _CLOUDFIELD_HXX