#include "sphere.hxx"
#include "oursun.hxx"
-
// Set up sun rendering call backs
static int sgSunOrbPreDraw( ssgEntity *e ) {
/* cout << endl << "Sun orb pre draw" << endl << "----------------"
// cout << "push error = " << glGetError() << endl;
glDisable( GL_DEPTH_TEST );
- glDisable( GL_FOG );
+ // glDisable( GL_FOG );
+ glFogf (GL_FOG_DENSITY, sun_exp2_punch_through);
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
return true;
// Constructor
SGSun::SGSun( void ) {
+ prev_sun_angle = -9999.0;
+ visibility = -9999.0;
}
sgSunOrbPreDraw, sgSunOrbPostDraw );
// force a repaint of the sun colors with arbitrary defaults
- repaint( 0.0 );
+ repaint( 0.0, 1.0 );
// build the halo
// sun_texbuf = new GLubyte[64*64*3];
// 0 degrees = high noon
// 90 degrees = sun rise/set
// 180 degrees = darkest midnight
-bool SGSun::repaint( double sun_angle ) {
- 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
- * sun_angle * sun_angle * sun_angle * sun_angle * sun_angle;
-
- float ambient = (float)(0.4 * pow (1.1, - x_10 / 30.0));
- if (ambient < 0.3) { ambient = 0.3; }
- if (ambient > 1.0) { ambient = 1.0; }
-
- sgVec4 color;
- sgSetVec4( color,
- (ambient * 6.0) - 1.0, // minimum value = 0.8
- (ambient * 11.0) - 2.7, // minimum value = 0.6
- (ambient * 12.0) - 3.6, // minimum value = 0.0
- 1.0 );
-
- // temp test, forces the color to always be white
- // sgSetVec4( color, 1.0, 1.0, 1.0, 1.0 );
-
- if (color[0] > 1.0) color[0] = 1.0;
- if (color[1] > 1.0) color[1] = 1.0;
- if (color[2] > 1.0) color[2] = 1.0;
+bool SGSun::repaint( double sun_angle, double new_visibility ) {
+ if ( visibility != new_visibility ) {
+ visibility = new_visibility;
-#else
-
- if (prev_sun_angle != sun_angle)
- {
+ static double sqrt_m_log01 = sqrt( -log( 0.01 ) );
+ sun_exp2_punch_through = sqrt_m_log01 / (visibility * 15);
+ }
+ if (prev_sun_angle != sun_angle) {
prev_sun_angle = sun_angle;
float sun_factor = 4*cos(sun_angle);
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[1] = sqrt(sun_factor);
+ color[0] = sqrt(color[1]);
+ color[2] = sun_factor * sun_factor;
+ color[2] *= color[2];
color[3] = 1.0;
-#endif
gamma_correct_rgb( color );
// cout << "color = " << color[0] << " " << color[1] << " "