Updates for a better sunrise/sunset effect

This commit is contained in:
ehofman
2003-05-21 17:17:47 +00:00
parent 8be760b594
commit 94c22fec46
3 changed files with 68 additions and 11 deletions

View 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,

View 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
float *ptr;
ptr = cl->get( 0 );
sgCopyVec4( ptr, color );
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 );
}
return true;

View 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