]> git.mxchange.org Git - simgear.git/commitdiff
Oops, a couple more sky tweaks.
authorcurt <curt>
Fri, 30 Jun 2000 21:51:12 +0000 (21:51 +0000)
committercurt <curt>
Fri, 30 Jun 2000 21:51:12 +0000 (21:51 +0000)
simgear/sky/sky.cxx
simgear/sky/sky.hxx
simgear/sky/stars.cxx

index 643a5689706c945ad9ce8513640146ebee256e85..38a5f181cacb136bfda7e9f2a78f1fcf847f69a8 100644 (file)
@@ -175,18 +175,36 @@ bool SGSky::reposition( sgVec3 view_pos, sgVec3 zero_elev, sgVec3 view_up,
 }
 
 
-// draw background portions of the sky
-void SGSky::draw_background() {
+// draw background portions of the sky ... do this before you draw the
+// rest of your scene.
+void SGSky::preDraw() {
     ssgCullAndDraw( pre_root );
 }
 
 
-// draw scenery elements of the sky
-void SGSky::draw_scene( float alt ) {
+// draw translucent clouds ... do this after you've drawn all the
+// oapaque elements of your scene.
+void SGSky::postDraw( float alt ) {
+    float slop = 4.0;          // if we are closer than this to a cloud layer,
+                               // don't draw clouds
 
-    if ( effective_visibility < 4000.0 ) {
-       // bail and don't draw clouds
-       return;
+    int in_cloud = -1;         // cloud we are in
+
+    // check where we are relative to the cloud layers
+    for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
+       float asl = cloud_layers[i]->get_asl();
+       float thickness = cloud_layers[i]->get_thickness();
+
+       if ( alt < asl - slop ) {
+           // below cloud layer
+       } else if ( alt < asl + thickness + slop ) {
+           // in cloud layer
+
+           // bail now and don't draw any clouds
+           in_cloud = i;
+       } else {
+           // above cloud layer
+       }
     }
 
     // determine rendering order
@@ -200,21 +218,29 @@ void SGSky::draw_scene( float alt ) {
     if ( pos == 0 ) {
        // we are below all the cloud layers, draw top to bottom
        for ( int i = cloud_layers.size() - 1; i >= 0; --i ) {
-           cloud_layers[i]->draw();
+           if ( i != in_cloud ) {
+               cloud_layers[i]->draw();
+           }
        }
     } else if ( pos >= (int)cloud_layers.size() ) {
        // we are above all the cloud layers, draw bottom to top
        for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
-           cloud_layers[i]->draw();
+           if ( i != in_cloud ) {
+               cloud_layers[i]->draw();
+           }
        }
     } else {
        // we are between cloud layers, draw lower layers bottom to
        // top and upper layers top to bottom
        for ( int i = 0; i < pos; ++i ) {
-           cloud_layers[i]->draw();
+           if ( i != in_cloud ) {
+               cloud_layers[i]->draw();
+           }
        }
        for ( int i = cloud_layers.size() - 1; i >= pos; --i ) {
-           cloud_layers[i]->draw();
+           if ( i != in_cloud ) {
+               cloud_layers[i]->draw();
+           }
        }
     }
 }
@@ -298,25 +324,28 @@ void SGSky::modify_vis( float alt, float time_factor ) {
                double chance = rnd * rnd * rnd;
                if ( chance > 0.95 /* * (diff - 25) / 50.0 */ ) {
                    in_puff = true;
-                   do {
-                       puff_length = fg_random() * 2.0; // up to 2 seconds
-                   } while ( puff_length <= 0.0 );
+                   puff_length = fg_random() * 2.0; // up to 2 seconds
                    puff_progression = 0.0;
                }
            }
 
            if ( in_puff ) {
                // modify actual_visibility based on puff envelope
-           
+
                if ( puff_progression <= ramp_up ) {
-                   double x = 2 * SGD_PI * puff_progression / ramp_up;
+                   double x = 0.5 * SGD_PI * puff_progression / ramp_up;
                    double factor = 1.0 - sin( x );
+                   // cout << "ramp up = " << puff_progression
+                   //      << "  factor = " << factor << endl;
                    effvis = effvis * factor;
                } else if ( puff_progression >= ramp_up + puff_length ) {
-                   double x = 2 * SGD_PI * 
+                   double x = 0.5 * SGD_PI * 
                        (puff_progression - (ramp_up + puff_length)) /
                        ramp_down;
                    double factor = sin( x );
+                   // cout << "ramp down = " 
+                   //      << puff_progression - (ramp_up + puff_length) 
+                   //      << "  factor = " << factor << endl;
                    effvis = effvis * factor;
                } else {
                    effvis = 0.0;
@@ -333,6 +362,7 @@ void SGSky::modify_vis( float alt, float time_factor ) {
                //                (double)current_options.get_model_hz();
 
                puff_progression += time_factor;
+               // cout << "time factor = " << time_factor << endl;
 
                /* cout << "gml = " << global_multi_loop 
                   << "  speed up = " << current_options.get_speed_up()
@@ -344,9 +374,9 @@ void SGSky::modify_vis( float alt, float time_factor ) {
                }
            }
 
-           // never let visibility drop below zero
-           if ( effvis <= 0 ) {
-               effvis = 0.1;
+           // never let visibility drop below 25 meters
+           if ( effvis <= 25.0 ) {
+               effvis = 25.0;
            }
        }
     } // for
index 1e5ba3473a2288a22e8b31e50016ad2bf5af5278..d07ea94bdb0e82fdb529f2a2a410ec907294faa8 100644 (file)
@@ -126,11 +126,13 @@ public:
     // transition range, and simulated "puffs".
     void modify_vis( float alt, float time_factor );
 
-    // draw background portions of the sky
-    void draw_background();
+    // draw background portions of the sky ... do this before you draw
+    // the rest of your scene.
+    void preDraw();
 
-    // draw scenery elements of the sky
-    void draw_scene( float alt );
+    // draw translucent clouds ... do this after you've drawn all the
+    // oapaque elements of your scene.
+    void postDraw( float alt );
 
     // specify the texture path (optional, defaults to current directory)
     inline void texture_path( const string& path ) {
index 598af42d3b2a5031f51c684f7a877f90e9a6b745..d1d999c7bc9b27512620b78b30ab8210fb7934d1 100644 (file)
@@ -147,26 +147,26 @@ bool SGStars::repaint( double sun_angle, int num, sgdVec3 *star_data ) {
     float *color;
 
     // determine which star structure to draw
-    if ( sun_angle > (2 * SGD_PI + 10.0 * SGD_DEGREES_TO_RADIANS ) ) {
+    if ( sun_angle > (0.5 * SGD_PI + 10.0 * SGD_DEGREES_TO_RADIANS ) ) {
        // deep night
        factor = 1.0;
        cutoff = 4.5;
-    } else if ( sun_angle > (2 * SGD_PI + 8.8 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 8.8 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 1.0;
        cutoff = 3.8;
-    } else if ( sun_angle > (2 * SGD_PI + 7.5 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 7.5 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 0.95;
        cutoff = 3.1;
-    } else if ( sun_angle > (2 * SGD_PI + 7.0 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 7.0 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 0.9;
        cutoff = 2.4;
-    } else if ( sun_angle > (2 * SGD_PI + 6.5 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 6.5 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 0.85;
        cutoff = 1.8;
-    } else if ( sun_angle > (2 * SGD_PI + 6.0 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 6.0 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 0.8;
        cutoff = 1.2;
-    } else if ( sun_angle > (2 * SGD_PI + 5.5 * SGD_DEGREES_TO_RADIANS ) ) {
+    } else if ( sun_angle > (0.5 * SGD_PI + 5.5 * SGD_DEGREES_TO_RADIANS ) ) {
        factor = 0.75;
        cutoff = 0.6;
     } else {