]> git.mxchange.org Git - simgear.git/commitdiff
Moving cloud functionality to sky section.
authorcurt <curt>
Tue, 20 Jun 2000 00:30:30 +0000 (00:30 +0000)
committercurt <curt>
Tue, 20 Jun 2000 00:30:30 +0000 (00:30 +0000)
simgear/sky/Makefile.am
simgear/sky/sky.cxx
simgear/sky/sky.hxx

index d71c6201cbe12dc15ab9217bb5b3f8ffcec5743f..1b809b9147a74549a5a98f2c2cedd378c717afb8 100644 (file)
@@ -1,6 +1,7 @@
 noinst_LIBRARIES = libSky.a
 
 libSky_a_SOURCES = \
+       cloud.cxx cloud.hxx \
        dome.cxx dome.hxx \
        moon.cxx moon.hxx \
        oursun.cxx oursun.hxx \
index eb86def9f5aa838d2b47cabd63eb35819102d326..beff38a8c608528cd737505a8a946febad95a97d 100644 (file)
@@ -43,35 +43,45 @@ SGSky::~SGSky( void ) {
 
 // initialize the sky and connect the components to the scene graph at
 // the provided branch
-ssgBranch * SGSky::build(  double sun_size, double moon_size,
-                          int nplanets, sgdVec3 *planet_data,
-                          double planet_dist,
-                          int nstars, sgdVec3 *star_data, double star_dist )
+void SGSky::build(  double sun_size, double moon_size,
+                   int nplanets, sgdVec3 *planet_data,
+                   double planet_dist,
+                   int nstars, sgdVec3 *star_data, double star_dist )
 {
-    sky_selector = new ssgSelector;
-    sky_transform = new ssgTransform;
+    pre_root = new ssgRoot;
+    post_root = new ssgRoot;
+
+    pre_selector = new ssgSelector;
+    post_selector = new ssgSelector;
+
+    pre_transform = new ssgTransform;
+    post_transform = new ssgTransform;
 
     dome = new SGSkyDome;
-    sky_transform -> addKid( dome->build() );
+    pre_transform -> addKid( dome->build() );
 
     planets = new SGStars;
-    sky_transform -> addKid( planets->build(nplanets, planet_data,
+    pre_transform -> addKid( planets->build(nplanets, planet_data,
                                            planet_dist)
                             );
 
     stars = new SGStars;
-    sky_transform -> addKid( stars->build(nstars, star_data, star_dist) );
+    pre_transform -> addKid( stars->build(nstars, star_data, star_dist) );
     
     moon = new SGMoon;
-    sky_transform -> addKid( moon->build(tex_path, moon_size) );
+    pre_transform -> addKid( moon->build(tex_path, moon_size) );
 
     oursun = new SGSun;
-    sky_transform -> addKid( oursun->build(tex_path, sun_size) );
+    pre_transform -> addKid( oursun->build(tex_path, sun_size) );
 
-    sky_selector->addKid( sky_transform );
-    sky_selector->clrTraversalMaskBits( SSGTRAV_HOT );
+    pre_selector->addKid( pre_transform );
+    pre_selector->clrTraversalMaskBits( SSGTRAV_HOT );
 
-    return sky_selector;
+    post_selector->addKid( post_transform );
+    post_selector->clrTraversalMaskBits( SSGTRAV_HOT );
+
+    pre_root->addKid( pre_selector );
+    post_root->addKid( post_selector );
 }
 
 
@@ -93,6 +103,10 @@ bool SGSky::repaint( sgVec4 sky_color, sgVec4 fog_color,
     planets->repaint( sun_angle, nplanets, planet_data );
     stars->repaint( sun_angle, nstars, star_data );
 
+    for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
+       cloud_layers[i]->repaint( fog_color );
+    }
+
     return true;
 }
 
@@ -104,7 +118,7 @@ bool SGSky::repaint( sgVec4 sky_color, sgVec4 fog_color,
 // 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.
-bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, 
+bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, sgVec3 view_up,
                        double lon, double lat, double spin,
                        double gst, 
                        double sun_ra, double sun_dec, double sun_dist,
@@ -117,5 +131,28 @@ bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev,
     planets->reposition( view_pos, angle );
     stars->reposition( view_pos, angle );
 
+    for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
+       cloud_layers[i]->reposition( zero_elev, view_up, lon, lat );
+    }
+
     return true;
 }
+
+
+// draw background portions of the sky
+void SGSky::draw_background() {
+    ssgCullAndDraw( pre_root );
+}
+
+
+// draw scenery elements of the sky
+void SGSky::draw_scene() {
+    ssgCullAndDraw( post_root );
+}
+
+void SGSky::add_cloud_layer( double asl ) {
+    SGCloudLayer *layer = new SGCloudLayer;
+    post_transform -> addKid( layer->build(tex_path, 20000.0f, asl) );
+    cloud_layers.push_back( layer );
+}
index 355fe14beb29b2be272fe72165b4dd9465f1d265..677ff6e46eb526a1d07e7be9097a0e730902114c 100644 (file)
 
 #include <plib/ssg.h>          // plib include
 
+#include <simgear/compiler.h>
 #include <simgear/misc/fgpath.hxx>
 
+#include <vector>
+
+#include "cloud.hxx"
 #include "dome.hxx"
 #include "moon.hxx"
 #include "oursun.hxx"
 #include "stars.hxx"
 
+FG_USING_STD(vector);
+
+
+typedef vector < SGCloudLayer* > layer_list_type;
+typedef layer_list_type::iterator layer_list_iterator;
+typedef layer_list_type::const_iterator layer_list_const_iterator;
+
 
 class SGSky {
 
+private:
+
     // components of the sky
     SGSkyDome *dome;
     SGSun *oursun;
     SGMoon *moon;
     SGStars *planets;
     SGStars *stars;
+    layer_list_type cloud_layers;
+
+    ssgRoot *pre_root, *post_root;
 
-    ssgSelector *sky_selector;
-    ssgTransform *sky_transform;
+    ssgSelector *pre_selector, *post_selector;
+    ssgTransform *pre_transform, *post_transform;
 
     FGPath tex_path;
 
@@ -65,9 +81,9 @@ public:
 
     // initialize the sky and connect the components to the scene
     // graph at the provided branch
-    ssgBranch *build( double sun_size, double moon_size,
-                     int nplanets, sgdVec3 *planet_data, double planet_dist,
-                     int nstars, sgdVec3 *star_data, double star_dist );
+    void build( double sun_size, double moon_size,
+               int nplanets, sgdVec3 *planet_data, double planet_dist,
+               int nstars, sgdVec3 *star_data, double star_dist );
 
     // repaint the sky components based on current value of sun_angle,
     // sky, and fog colors.
@@ -88,23 +104,43 @@ public:
     // 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.
-    bool reposition( sgVec3 view_pos, sgVec3 zero_elev, 
+    bool reposition( sgVec3 view_pos, sgVec3 zero_elev, sgVec3 view_up,
                     double lon, double lat, double spin,
                     double gst, 
                     double sun_ra, double sun_dec, double sun_dist,
                     double moon_ra, double moon_dec, double moon_dist );
 
+    // draw background portions of the sky
+    void draw_background();
+
+    // draw scenery elements of the sky
+    void draw_scene();
+
     // specify the texture path (optional, defaults to current directory)
     inline void texture_path( const string& path ) {
        tex_path = FGPath( path );
     }
 
-    // enable the sky in the scene graph (default)
-    inline void enable() { sky_selector->select( 1 ); }
+    // enable the sky
+    inline void enable() {
+       pre_selector->select( 1 );
+       post_selector->select( 1 );
+    }
 
     // disable the sky in the scene graph.  The leaf node is still
     // there, how ever it won't be traversed on by ssgCullandRender()
-    inline void disable() { sky_selector->select( 0 ); }
+    inline void disable() {
+       pre_selector->select( 0 );
+       post_selector->select( 0 );
+    }
+
+    // add a cloud layer (above see level in meters)
+    void add_cloud_layer( double asl );
+
+    inline int get_num_layers() const { return cloud_layers.size(); }
+    inline SGCloudLayer *get_cloud_layer( int i ) const {
+       return cloud_layers[i];
+    }
 };