]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/sky/cloudfield.hxx
simgear/scene/sky/sky.cxx: Include sg_inlines.h with simgear/ prefix as all other...
[simgear.git] / simgear / scene / sky / cloudfield.hxx
index f5027b43157bdc256d97b63221ec7e957d325693..38fa9e95a3bc73b125efbd8e746990d154042ea2 100644 (file)
 #ifndef _CLOUDFIELD_HXX
 #define _CLOUDFIELD_HXX
 
-#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>
+#include <simgear/math/SGMath.hxx>
 
 using std::vector;
 
@@ -51,7 +58,7 @@ private:
        class Cloud  {
        public:
                SGNewCloud      *aCloud;
-               sgVec3          pos;
+               SGVec3f         pos;
                bool            visible;
        };
 
@@ -62,11 +69,12 @@ private:
         static const int QUADTREE_SIZE = 32;
 
        // this is a relative position only, with that we can move all clouds at once
-       sgVec3 relative_position;
+       SGVec3f relative_position;
         //     double lon, lat;
 
         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];
         
@@ -74,10 +82,15 @@ private:
 
        double deltax, deltay, alt;
         double last_course;
-        sgSphere field_sphere;
-       float   last_coverage;
+       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();
@@ -106,23 +119,28 @@ public:
        // visibility distance for clouds in meters
        static float CloudVis;
 
-       static sgVec3 view_vec, view_X, view_Y;
+       static SGVec3f view_vec, view_X, view_Y;
 
-       static float coverage;
         static float view_distance;
         static double timer_dt;
        static float fieldSize;
        
         bool defined3D;
 
-       static float getCoverage(void) { return coverage; }
-       static void setCoverage(float coverage) { coverage = coverage; }
+       float getCoverage(void) { return coverage; }
+       void setCoverage(float c) { coverage = c; }
 
         static float getVisRange(void) { return view_distance; }
         static void setVisRange(float d) { view_distance = d; }
         
         void applyCoverage(void);
         void applyVisRange(void);
+        
+        static osg::Fog* getFog()
+        {
+                return CloudFog::instance()->fog.get();
+        }
+        static void updateFog(double visibility, const osg::Vec4f& color);
 };
 
 #endif // _CLOUDFIELD_HXX