#include <math.h>
-#include GLUT_H
+#include <GL/gl.h>
#include <plib/sg.h>
#endif
-// in meters of course
-static const float center_elev = 0.3125;
+// proportions of max dimensions fed to the build() routine
+static const float center_elev = 1.0;
-static const float upper_radius = 0.6250;
-static const float upper_elev = 0.2500;
+static const float upper_radius = 0.6;
+static const float upper_elev = 0.15;
-static const float middle_radius = 0.8750;
-static const float middle_elev = 0.1000;
+static const float middle_radius = 0.9;
+static const float middle_elev = 0.08;
-static const float lower_radius = 0.8750;
-static const float lower_elev = 0.0000;
+static const float lower_radius = 1.0;
+static const float lower_elev = 0.0;
-static const float bottom_radius = 0.6250;
-static const float bottom_elev = -0.0250;
+static const float bottom_radius = 0.8;
+static const float bottom_elev = -0.1;
// Set up dome rendering callbacks
ssgBranch * SGSkyDome::build( double hscale, double vscale ) {
sgVec4 color;
- float theta;
+ double theta;
int i;
// set up the state
cos(theta) * upper_radius * hscale,
sin(theta) * upper_radius * hscale,
upper_elev * vscale );
-
+
sgSetVec3( middle_vertex[i],
- cos((double)theta) * middle_radius * hscale,
- sin((double)theta) * middle_radius * hscale,
+ cos(theta) * middle_radius * hscale,
+ sin(theta) * middle_radius * hscale,
middle_elev * vscale );
sgSetVec3( lower_vertex[i],
- cos((double)theta) * lower_radius * hscale,
- sin((double)theta) * lower_radius * hscale,
+ cos(theta) * lower_radius * hscale,
+ sin(theta) * lower_radius * hscale,
lower_elev * vscale );
sgSetVec3( bottom_vertex[i],
- cos((double)theta) * bottom_radius * hscale,
- sin((double)theta) * bottom_radius * hscale,
+ cos(theta) * bottom_radius * hscale,
+ sin(theta) * bottom_radius * hscale,
bottom_elev * 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,
sgVec4 lower_color[12];
sgVec4 bottom_color[12];
- double vis_factor;
+ double vis_factor, cvf = vis;
- if ( vis < 3000.0 ) {
- vis_factor = (vis - 1000.0) / 2000.0;
- if ( vis_factor < 0.0 ) {
- vis_factor = 0.0;
- }
- } else {
- vis_factor = 1.0;
+ if (cvf > 45000)
+ cvf = 45000;
+
+ vis_factor = (vis - 1000.0) / 2000.0;
+ if ( vis_factor < 0.0 ) {
+ vis_factor = 0.0;
+ } else if ( vis_factor > 1.0) {
+ vis_factor = 1.0;
}
for ( j = 0; j < 3; j++ ) {
diff = sky_color[j] - fog_color[j];
- center_color[j] = sky_color[j] - diff * ( 1.0 - vis_factor );
+ center_color[j] = sky_color[j]; // - diff * ( 1.0 - vis_factor );
}
center_color[3] = 1.0;
for ( i = 0; i < 6; i++ ) {
for ( j = 0; j < 3; j++ ) {
- diff = sky_color[j] - fog_color[j];
+ double saif = sun_angle/SG_PI;
+ diff = (sky_color[j] - fog_color[j]) * (0.8 + j * 0.2) * (0.8 + saif - ((6-i)/10));
// printf("sky = %.2f fog = %.2f diff = %.2f\n",
// l->sky_color[j], l->fog_color[j], diff);
- upper_color[i][j] = sky_color[j] - diff * ( 1.0 - vis_factor * 0.7);
- middle_color[i][j] = sky_color[j] - diff * ( 1.0 - vis_factor * 0.1)
- + middle_amt[j];
+ upper_color[i][j] = sky_color[j] - diff *
+ ( 1.0 - vis_factor * (0.7 + 0.3 * cvf/45000) );
+ middle_color[i][j] = sky_color[j] - diff *
+ ( 1.0 - vis_factor * (0.1 + 0.85 * cvf/45000) )
+ + middle_amt[j];
lower_color[i][j] = fog_color[j] + outer_amt[j];
if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; }
for ( i = 6; i < 12; i++ ) {
for ( j = 0; j < 3; j++ ) {
- diff = sky_color[j] - fog_color[j];
+ double saif = sun_angle/SG_PI;
+ diff = (sky_color[j] - fog_color[j]) * (0.8 + j * 0.2) * (0.8 + saif - ((-i+12)/10));
// printf("sky = %.2f fog = %.2f diff = %.2f\n",
// sky_color[j], fog_color[j], diff);
- upper_color[i][j] = sky_color[j] - diff * ( 1.0 - vis_factor * 0.7);
- middle_color[i][j] = sky_color[j] - diff * ( 1.0 - vis_factor * 0.1)
- + middle_amt[j];
+ upper_color[i][j] = sky_color[j] - diff *
+ ( 1.0 - vis_factor * (0.7 + 0.3 * cvf/45000) );
+ middle_color[i][j] = sky_color[j] - diff *
+ ( 1.0 - vis_factor * (0.1 + 0.85 * cvf/45000) )
+ + middle_amt[j];
lower_color[i][j] = fog_color[j] + outer_amt[j];
if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; }