]> git.mxchange.org Git - simgear.git/commitdiff
Updates for a better sunrise/sunset effect
authorehofman <ehofman>
Wed, 21 May 2003 17:17:47 +0000 (17:17 +0000)
committerehofman <ehofman>
Wed, 21 May 2003 17:17:47 +0000 (17:17 +0000)
simgear/scene/sky/dome.cxx
simgear/scene/sky/oursun.cxx
simgear/screen/colors.hxx

index 17fc03f4225ced7e6b508c7e519f8433d20baff3..0824a322ce40f4413cb8590cf04eae5997d8d102 100644 (file)
@@ -281,13 +281,19 @@ ssgBranch * SGSkyDome::build( double hscale, double vscale ) {
 bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle,
                         double vis )
 {
-    double diff;
+    double diff, prev_sun_angle = 999.0;
     sgVec3 outer_param, outer_amt, outer_diff;
     sgVec3 middle_param, middle_amt, middle_diff;
     int i, j;
 
+    if (prev_sun_angle == sun_angle)
+        return true;
+
+    prev_sun_angle = sun_angle;
+
     // Check for sunrise/sunset condition
-    if ( (sun_angle > 80.0) && (sun_angle < 100.0) ) {
+    if (sun_angle > 80.0) // && (sun_angle < 100.0) )
+    {
        // 0.0 - 0.4
        sgSetVec3( outer_param,
                   (10.0 - fabs(90.0 - sun_angle)) / 20.0,
index f94d0af4c7b5d5f0bfe2d62f69a33cf8c431efb5..ee7573866be40afccf8cfccebefa90479c5e2166 100644 (file)
@@ -44,6 +44,8 @@
 #  include <plib/ssgaLensFlare.h>
 #endif
 
+#include <simgear/screen/colors.hxx>
+
 #include "sphere.hxx"
 #include "oursun.hxx"
 
@@ -333,8 +335,14 @@ ssgBranch * SGSun::build( SGPath path, double sun_size ) {
 // 90 degrees = sun rise/set
 // 180 degrees = darkest midnight
 bool SGSun::repaint( double sun_angle ) {
-    if ( sun_angle * SGD_RADIANS_TO_DEGREES < 100 ) {
-       // else sun is well below horizon (so no point in repainting it)
+    static float prev_sun_angle = 9999.0;
+
+    // else sun is well below horizon (so no point in repainting it)
+#if 0
+    if ( (sun_angle * SGD_RADIANS_TO_DEGREES < 100 )
+          && (prev_sun_angle != sun_angle))
+    {
+        prev_sun_angle = sun_angle;
     
        // x_10 = sun_angle^10
        double x_10 = sun_angle * sun_angle * sun_angle * sun_angle * sun_angle
@@ -347,7 +355,7 @@ bool SGSun::repaint( double sun_angle ) {
        sgVec4 color;
        sgSetVec4( color,
                   (ambient * 6.0)  - 1.0, // minimum value = 0.8
-                  (ambient * 11.0) - 2.8, // minimum value = 0.5
+                  (ambient * 11.0) - 2.7, // minimum value = 0.6
                   (ambient * 12.0) - 3.6, // minimum value = 0.0
                   1.0 );
     
@@ -358,12 +366,34 @@ bool SGSun::repaint( double sun_angle ) {
        if (color[1] > 1.0) color[1] = 1.0;
        if (color[2] > 1.0) color[2] = 1.0;
 
-       // cout << "color = " << color[0] << " " << color[1] << " " 
-       //      << color[2] << endl;
+#else
+
+    if (prev_sun_angle != sun_angle)
+    {
+
+        prev_sun_angle = sun_angle;
+
+        float sun_factor = 4*cos(sun_angle);
+
+        if (sun_factor > 1) sun_factor = 1.0;
+        if (sun_factor < -1) sun_factor = -1.0;
+        sun_factor = sun_factor/2 + 0.5;
+
+        sgVec4 color;
+        color[0] = pow(sun_factor, 0.25);
+        color[1] = pow(sun_factor, 0.50);
+        color[2] = pow(sun_factor, 4.0);
+        color[3] = 1.0;
+
+#endif
+        gamma_correct_rgb( color );
+
+        // cout << "color = " << color[0] << " " << color[1] << " "
+        //      << color[2] << endl;
 
-       float *ptr;
-       ptr = cl->get( 0 );
-       sgCopyVec4( ptr, color );
+        float *ptr;
+        ptr = cl->get( 0 );
+        sgCopyVec4( ptr, color );
     }
 
     return true;
index 13c6ef3ff0e550d0a20e93d965c54b1d0e54d8ed..197597079de733b06f3e0d72decd28dcfcdd8a43 100644 (file)
@@ -38,7 +38,7 @@ const float system_gamma = 2.5;
 
 
 // simple architecture independant gamma correction function.
-inline void gamma_correct(float *color,
+inline void gamma_correct_rgb(float *color,
                           float reff = 2.5, float system = system_gamma)
 {
    color[0] = pow(color[0], reff/system);
@@ -46,5 +46,26 @@ inline void gamma_correct(float *color,
    color[2] = pow(color[2], reff/system);
 };
 
+inline void gamma_correct_c(float *color,
+                          float reff = 2.5, float system = system_gamma)
+{
+   *color = pow(*color, reff/system);
+};
+
+inline void gamma_restore_rgb(float *color,
+                          float reff = 2.5, float system = system_gamma)
+{
+   color[0] = pow(color[0], system/reff);
+   color[1] = pow(color[1], system/reff);
+   color[2] = pow(color[2], system/reff);
+};
+
+inline void gamma_restore_c(float *color,
+                          float reff = 2.5, float system = system_gamma)
+{
+   *color = pow(*color, system/reff);
+};
+
+
 #endif // _SG_COLORS_HXX