]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/sky/sky.hxx
Added some OSG headers for the correct evaluation of the OSG_VERSION_LESS_THAN macro.
[simgear.git] / simgear / scene / sky / sky.hxx
index 7e34f9e4da7223883add15efda154ad42eb08c4a..a824b74a02db13bcb55253e00109b5ff80937d49 100644 (file)
 #define _SG_SKY_HXX
 
 
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
 #include <simgear/compiler.h>
+#include <simgear/math/sg_random.h>
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/props/props.hxx>
 
@@ -42,9 +39,9 @@
 #include <osg/ref_ptr>
 #include <osg/MatrixTransform>
 #include <osg/Node>
-#include <osg/Switch>
 
 #include <simgear/ephemeris/ephemeris.hxx>
+#include <simgear/math/SGMath.hxx>
 
 #include <simgear/scene/sky/cloud.hxx>
 #include <simgear/scene/sky/dome.hxx>
 #include <simgear/scene/sky/oursun.hxx>
 #include <simgear/scene/sky/stars.hxx>
 
-using std::vector;
-
-
-typedef struct {
-       SGVec3f view_pos, zero_elev, view_up;
-       double lon, lat, alt, spin;
-       double gst;
-       double sun_dist;
-       double moon_dist;
-       double sun_angle;
-} SGSkyState;
+namespace simgear {
+class SGReaderWriterOptions;
+}
+
+struct SGSkyState
+{
+  SGVec3d pos;     //!< View position in world Cartesian coordinates.
+  SGGeod pos_geod;
+  SGQuatd ori;
+  double spin;     //!< An offset angle for orienting the sky effects with the
+                   //   sun position so sunset and sunrise effects look correct.
+  double gst;      //!< GMT side real time.
+  double sun_dist; //!< the sun's distance from the current view point
+                   //   (to keep it inside your view volume).
+  double moon_dist;//!< The moon's distance from the current view point.
+  double sun_angle;
+};
 
-typedef struct {
-       SGVec3f sky_color;
-        SGVec3f adj_sky_color;
-        SGVec3f fog_color;
-       SGVec3f cloud_color;
-       double sun_angle, moon_angle;
-} SGSkyColor;
+struct SGSkyColor
+{
+  SGVec3f sky_color;
+  SGVec3f adj_sky_color;
+  SGVec3f fog_color;
+  SGVec3f cloud_color;
+  double sun_angle,
+         moon_angle;
+};
 
 /**
+ * \anchor SGSky-details
+ *
  * A class to model a realistic (time/date/position) based sky.
  *
- * Introduction 
+ * Introduction
  *
  * The SGSky class models a blended sky dome, a haloed sun, a textured
  * moon with phase that properly matches the date, stars and planets,
@@ -160,10 +167,10 @@ typedef struct {
 
  * A typical application might do the following: 
 
- * <li> thesky->preDraw( my_altitude );
- * <li> thesky->drawUpperClouds();
- * <li> ssgCullAndDraw ( myscene ) ;
- * <li> thesky->drawLowerClouds();
+ * \li thesky->preDraw( my_altitude );
+ * \li thesky->drawUpperClouds();
+ * \li ssgCullAndDraw ( myscene ) ;
+ * \li thesky->drawLowerClouds();
 
  * The current altitude in meters is passed to the preDraw() method
  * so the clouds layers can be rendered correction from most distant
@@ -218,9 +225,8 @@ private:
     SGSharedPtr<SGStars> stars;
     layer_list_type cloud_layers;
 
-    osg::ref_ptr<osg::Group> pre_root, cloud_root;
-    osg::ref_ptr<osg::Switch> pre_selector;
-    osg::ref_ptr<osg::Group> pre_transform;
+    osg::ref_ptr<osg::Group> pre_root, pre_transform;
+    osg::ref_ptr<osg::Switch> cloud_root;
 
     osg::ref_ptr<osg::MatrixTransform> _ephTransform;
 
@@ -231,7 +237,6 @@ private:
     float effective_visibility;
 
     int in_cloud;
-    int cur_layer_pos;
 
     // near cloud visibility state variables
     bool in_puff;
@@ -245,6 +250,9 @@ private:
 
     // 3D cloud density
     double clouds_3d_density;
+    
+    // RNG seed
+    mt seed;
 
 public:
 
@@ -256,115 +264,79 @@ public:
 
     /**
      * Initialize the sky and connect the components to the scene
-     * graph at the provided branch.  See discussion in detailed class
-     * description.
-     * @param h_radius_m horizontal radius of sky dome
-     * @param v_radius_m vertical radius of sky dome
-     * @param sun_size size of sun
-     * @param moon_size size of moon
-     * @param nplanets number of planets
-     * @param planet_data an array of planet right ascensions, declinations,
-     *        and magnitudes
-     * @param nstars number of stars
-     * @param star_data an array of star right ascensions, declinations,
-     *        and magnitudes
+     * graph at the provided branch.
+     *
+     * @note See discussion in \ref SGSky-details "detailed class description".
+     *
+     * @param h_radius_m    Horizontal radius of sky dome
+     * @param v_radius_m    Vertical radius of sky dome
+     * @param sun_size      Size of sun
+     * @param moon_size     Size of moon
+     * @param eph           Current positions of planets and stars
+     * @param node          Property node connecting sun with environment
+     * @param options
      */
-    void build( double h_radius_m, double v_radius_m,
-                double sun_size, double moon_size,
-                const SGEphemeris& eph, SGPropertyNode *property_tree_node );
+    void build( double h_radius_m,
+                double v_radius_m,
+                double sun_size,
+                double moon_size,
+                const SGEphemeris& eph,
+                SGPropertyNode *node,
+                simgear::SGReaderWriterOptions* options );
 
     /**
-     * Repaint the sky components based on current value of sun_angle,
-     * sky, and fog colors.  You can also specify new star and planet
-     * data so that we can optionally change the magnitude of these
-     * (for day/night transitions.)  See discussion in detailed
-     * class description.
+     * Repaint the sky components based on current sun angle, and sky and fog
+     * colors.
      *
-     * Sun and moon angles are specified in degrees relative to local up
-     * <li> 0 degrees = high noon
-     * <li> 90 degrees = sun rise/set
-     * <li> 180 degrees = darkest midnight
-     * @param sky_color the base sky color (for the top of the dome)
-     * @param fog_color the fog color (for the horizon)
-     * @param sun_angle the sun angle with the horizon (for sunrise/sunset
-     *        effects)
-     * @param moon_angle the moon angle (so we can make it more yellow
-     *        at the horizon)
-     * @param nplanets number of planets
-     * @param planet_data an array of planet right ascensions, declinations,
-     *        and magnitudes
-     * @param nstars number of stars
-     * @param star_data an array of star right ascensions, declinations,
-     *        and magnitudes
+     * @note See discussion in \ref SGSky-details "detailed class description".
+     *
+     * @param sky_color The base sky color (for the top of the dome)
+     * @param eph       Current positions of planets and stars
      */
-    bool repaint( const SGSkyColor &sc, const SGEphemeris& eph );
+    bool repaint( const SGSkyColor &sky_color,
+                  const SGEphemeris& eph );
 
     /**
-     * Reposition the sky at the specified origin and orientation
+     * Reposition the sky at the specified origin and orientation.
+     *
+     * @note See discussion in \ref SGSky-details "detailed class description".
      *
-     * lon specifies a rotation about the Z axis
-     * lat specifies a rotation about the new Y axis
-     * spin specifies a rotation about the new Z axis (this allows
-     * additional orientation for the sunrise/set effects and is used
-     * by the skydome and perhaps clouds.  See discussion in detailed
-     * class description.
-     * @param view_pos specify your view position in world Cartesian
-     *        coordinates
-     * @param zero_elev the zero elevation position in world Cartesian
-     *        coordinates
-     * @param view_up the up vector in world Cartesian coordinates
-     * @param lon current longitude
-     * @param lat current latitude
-     * @param alt current altitude
-     * @param spin an offset angle for orienting the sky effects with the
-     *        sun position so sunset and sunrise effects look correct.
-     * @param gst GMT side real time
-     * @param sun_ra the sun's current right ascension
-     * @param sun_dec the sun's current declination
-     * @param sun_dist the sun's distance from the current view point
-     *        (to keep it inside your view volume.)
-     * @param moon_ra the moon's current right ascension
-     * @param moon_dec the moon's current declination
-     * @param moon_dist the moon's distance from the current view point. 
      */
-    bool reposition( const SGSkyState &st, const SGEphemeris& eph, double dt = 0.0 );
+    bool reposition( const SGSkyState& sky_state,
+                     const SGEphemeris& eph,
+                     double dt = 0.0 );
 
     /**
      * Modify the given visibility based on cloud layers, thickness,
-     * transition range, and simulated "puffs".  See discussion in detailed
-     * class description.
+     * transition range, and simulated "puffs".
+     *
+     * @note See discussion in \ref SGSky-details "detailed class description".
+     *
      * @param alt current altitude
      * @param time_factor amount of time since modify_vis() last called so
      *        we can scale effect rates properly despite variable frame rates.
      */
     void modify_vis( float alt, float time_factor );
 
-    osg::Node* getPreRoot() { return pre_root.get(); }
-    osg::Node* getCloudRoot() { return cloud_root.get(); }
+    osg::Group* getPreRoot() { return pre_root.get(); }
+    osg::Group* getCloudRoot() { return cloud_root.get(); }
 
     /** 
      * Specify the texture path (optional, defaults to current directory)
-     * @param path base path to texture locations
+     *
+     * @param path Base path to texture locations
      */
-    void texture_path( const string& path );
-
-    /** Enable drawing of the sky. */
-    inline void enable() {
-        pre_selector->setValue(0, 1);
-    }
+    void texture_path( const std::string& path );
 
     /**
-     * Disable drawing of the sky in the scene graph.  The leaf node is still
-     * there, how ever it won't be traversed on by ssgCullandRender()
+     * Get the current sun color
      */
-    inline void disable() {
-        pre_selector->setValue(0, 0);
-    }
+    inline SGVec4f get_sun_color() { return oursun->get_color(); }
 
     /**
-     * Get the current sun color
+     * Get the current scene color
      */
-    inline SGVec4f get_sun_color() { return oursun->get_color(); }
+    inline SGVec4f get_scene_color() { return oursun->get_scene_color(); }
 
     /**
      * Add a cloud layer.
@@ -407,32 +379,73 @@ public:
 
 
     /** @return current effective visibility */
-    inline float get_visibility() const { return effective_visibility; }
+    float get_visibility() const { return effective_visibility; }
 
     /** Set desired clear air visibility.
      * @param v visibility in meters
      */
-    inline void set_visibility( float v ) {
-       effective_visibility = visibility = (v <= 25.0) ? 25.0 : v;
-    }
+    void set_visibility( float v );
 
     /** Get 3D cloud density */
-    virtual double get_3dCloudDensity() const;
+    double get_3dCloudDensity() const;
 
     /** Set 3D cloud density 
      * @param density 3D cloud density
      */
-    virtual void set_3dCloudDensity(double density);
+    void set_3dCloudDensity(double density);
 
     /** Get 3D cloud visibility range*/
-    virtual float get_3dCloudVisRange() const;
+    float get_3dCloudVisRange() const;
 
     /** Set 3D cloud visibility range
-     * @param density 3D cloud visibility range
+     *
+     * @param vis 3D cloud visibility range
      */
-    virtual void set_3dCloudVisRange(float vis);
+    void set_3dCloudVisRange(float vis);
 
-};
+    /** Get 3D cloud impostor distance*/
+    float get_3dCloudImpostorDistance() const;
+
+    /** Set 3D cloud impostor distance
+     *
+     * @param vis 3D cloud impostor distance
+     */
+    void set_3dCloudImpostorDistance(float vis);
 
+    /** Get 3D cloud LoD1 Range*/
+    float get_3dCloudLoD1Range() const;
+
+    /** Set 3D cloud LoD1 Range
+     * @param vis LoD1 Range
+     */
+    void set_3dCloudLoD1Range(float vis);
+
+    /** Get 3D cloud LoD2 Range*/
+    float get_3dCloudLoD2Range() const;
+
+    /** Set 3D cloud LoD2 Range
+     * @param vis LoD2 Range
+     */
+    void set_3dCloudLoD2Range(float vis);
 
+    /** Get 3D cloud impostor usage */
+    bool get_3dCloudUseImpostors() const;
+
+    /** Set 3D cloud impostor usage
+     *
+     * @param imp whether use impostors for 3D clouds
+     */
+    void set_3dCloudUseImpostors(bool imp);
+
+    /** Get 3D cloud wrapping */
+    bool get_3dCloudWrap() const;
+
+    /** Set 3D cloud wrapping
+     * @param wrap whether to wrap 3D clouds
+     */
+    void set_3dCloudWrap(bool wrap);
+
+    void set_clouds_enabled(bool enabled);
+
+};
 #endif // _SG_SKY_HXX