X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsky%2Fdome.cxx;h=98961fac99c0792cc457703e54674bd9c18223bd;hb=f1ab6e2533a1bf07439b3d5918430f496158d8f3;hp=6f2a2c59768afa4f465099d8e0161ae0503420d6;hpb=427f309aeab8afc80c3ced99ea03233033a1ea9e;p=simgear.git diff --git a/simgear/sky/dome.cxx b/simgear/sky/dome.cxx index 6f2a2c59..98961fac 100644 --- a/simgear/sky/dome.cxx +++ b/simgear/sky/dome.cxx @@ -5,19 +5,20 @@ // // Copyright (C) 1997-2000 Curtis L. Olson - curt@flightgear.org // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. +// Library General Public License for more details. // -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - Suite 330, +// Boston, MA 02111-1307, USA. // // $Id$ @@ -35,9 +36,9 @@ #include #include -#include +#include + #include -#include #include "dome.hxx" @@ -67,6 +68,13 @@ static int sgSkyDomePreDraw( ssgEntity *e ) { /* cout << endl << "Dome Pre Draw" << endl << "----------------" << endl << endl; */ + + ssgLeaf *f = (ssgLeaf *)e; + if ( f -> hasState () ) f->getState()->apply() ; + + glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_FOG_BIT ); + // cout << "push error = " << glGetError() << endl; + glDisable( GL_DEPTH_TEST ); glDisable( GL_FOG ); @@ -76,9 +84,10 @@ static int sgSkyDomePreDraw( ssgEntity *e ) { static int sgSkyDomePostDraw( ssgEntity *e ) { /* cout << endl << "Dome Post Draw" << endl << "----------------" << endl << endl; */ - glEnable( GL_DEPTH_TEST ); - glEnable( GL_FOG ); + glPopAttrib(); + // cout << "pop error = " << glGetError() << endl; + return true; } @@ -108,6 +117,8 @@ ssgBranch * SGSkyDome::build( ) { dome_state->disable( GL_TEXTURE_2D ); dome_state->enable( GL_COLOR_MATERIAL ); dome_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE ); + dome_state->setMaterial( GL_EMISSION, 0, 0, 0, 1 ); + dome_state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 ); dome_state->disable( GL_BLEND ); dome_state->disable( GL_ALPHA_TEST ); @@ -137,7 +148,7 @@ ssgBranch * SGSkyDome::build( ) { sgSetVec3( center_vertex, 0.0, 0.0, CENTER_ELEV ); for ( i = 0; i < 12; i++ ) { - theta = (i * 30.0) * DEG_TO_RAD; + theta = (i * 30.0) * SGD_DEGREES_TO_RADIANS; sgSetVec3( upper_vertex[i], cos(theta) * UPPER_RADIUS, @@ -215,7 +226,7 @@ ssgBranch * SGSkyDome::build( ) { // force a repaint of the sky colors with ugly defaults sgVec3 fog_color; sgSetVec3( fog_color, 1.0, 1.0, 1.0 ); - repaint( color, fog_color, 0.0 ); + repaint( color, fog_color, 0.0, 5000.0 ); // build the ssg scene graph sub tree for the sky and connected // into the provide scene graph branch @@ -268,7 +279,8 @@ ssgBranch * SGSkyDome::build( ) { // 0 degrees = high noon // 90 degrees = sun rise/set // 180 degrees = darkest midnight -bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) +bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle, + double vis ) { double diff; sgVec3 outer_param, outer_amt, outer_diff; @@ -309,11 +321,28 @@ bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) // First, recalulate the basic colors // + sgVec4 center_color; sgVec4 upper_color[12]; sgVec4 middle_color[12]; sgVec4 lower_color[12]; sgVec4 bottom_color[12]; + double vis_factor; + + 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; + } + + for ( j = 0; j < 3; j++ ) { + diff = sky_color[j] - fog_color[j]; + center_color[j] = sky_color[j] - diff * ( 1.0 - vis_factor ); + } + for ( i = 0; i < 6; i++ ) { for ( j = 0; j < 3; j++ ) { diff = sky_color[j] - fog_color[j]; @@ -321,16 +350,17 @@ bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) // 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 * 0.3; - middle_color[i][j] = sky_color[j] - diff * 0.9 + middle_amt[j]; + 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]; lower_color[i][j] = fog_color[j] + outer_amt[j]; if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; } - if ( upper_color[i][j] < 0.1 ) { upper_color[i][j] = 0.1; } + if ( upper_color[i][j] < 0.0 ) { upper_color[i][j] = 0.0; } if ( middle_color[i][j] > 1.0 ) { middle_color[i][j] = 1.0; } - if ( middle_color[i][j] < 0.1 ) { middle_color[i][j] = 0.1; } + if ( middle_color[i][j] < 0.0 ) { middle_color[i][j] = 0.0; } if ( lower_color[i][j] > 1.0 ) { lower_color[i][j] = 1.0; } - if ( lower_color[i][j] < 0.1 ) { lower_color[i][j] = 0.1; } + if ( lower_color[i][j] < 0.0 ) { lower_color[i][j] = 0.0; } } upper_color[i][3] = middle_color[i][3] = lower_color[i][3] = 1.0; @@ -361,16 +391,17 @@ bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) // printf("sky = %.2f fog = %.2f diff = %.2f\n", // sky_color[j], fog_color[j], diff); - upper_color[i][j] = sky_color[j] - diff * 0.3; - middle_color[i][j] = sky_color[j] - diff * 0.9 + middle_amt[j]; + 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]; lower_color[i][j] = fog_color[j] + outer_amt[j]; if ( upper_color[i][j] > 1.0 ) { upper_color[i][j] = 1.0; } - if ( upper_color[i][j] < 0.1 ) { upper_color[i][j] = 0.1; } + if ( upper_color[i][j] < 0.0 ) { upper_color[i][j] = 0.0; } if ( middle_color[i][j] > 1.0 ) { middle_color[i][j] = 1.0; } - if ( middle_color[i][j] < 0.1 ) { middle_color[i][j] = 0.1; } + if ( middle_color[i][j] < 0.0 ) { middle_color[i][j] = 0.0; } if ( lower_color[i][j] > 1.0 ) { lower_color[i][j] = 1.0; } - if ( lower_color[i][j] < 0.1 ) { lower_color[i][j] = 0.1; } + if ( lower_color[i][j] < 0.0 ) { lower_color[i][j] = 0.0; } } upper_color[i][3] = middle_color[i][3] = lower_color[i][3] = 1.0; @@ -388,8 +419,8 @@ bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) printf("lower_color[%d] = %.2f %.2f %.2f %.2f\n", i, lower_color[i][0], lower_color[i][1], lower_color[i][2], lower_color[i][3]); - */ - } + */ + } for ( i = 0; i < 12; i++ ) { sgCopyVec4( bottom_color[i], fog_color ); @@ -407,7 +438,7 @@ bool SGSkyDome::repaint( sgVec4 sky_color, sgVec4 fog_color, double sun_angle ) slot = center_disk_cl->get( counter++ ); // sgVec4 red; // sgSetVec4( red, 1.0, 0.0, 0.0, 1.0 ); - sgCopyVec4( slot, sky_color ); + sgCopyVec4( slot, center_color ); for ( i = 11; i >= 0; i-- ) { slot = center_disk_cl->get( counter++ ); sgCopyVec4( slot, upper_color[i] ); @@ -482,19 +513,21 @@ bool SGSkyDome::reposition( sgVec3 p, double lon, double lat, double spin ) { // zero_elev.x, zero_elev.y, zero_elev.z ); // Rotate to proper orientation - // printf(" lon = %.2f lat = %.2f\n", FG_Longitude * RAD_TO_DEG, - // FG_Latitude * RAD_TO_DEG); - // xglRotatef( f->get_Longitude() * RAD_TO_DEG, 0.0, 0.0, 1.0 ); + // printf(" lon = %.2f lat = %.2f\n", + // lon * SGD_RADIANS_TO_DEGREES, + // lat * SGD_RADIANS_TO_DEGREES); + // xglRotatef( lon * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0 ); sgSetVec3( axis, 0.0, 0.0, 1.0 ); - sgMakeRotMat4( LON, lon * RAD_TO_DEG, axis ); + sgMakeRotMat4( LON, lon * SGD_RADIANS_TO_DEGREES, axis ); - // xglRotatef( 90.0 - f->get_Latitude() * RAD_TO_DEG, 0.0, 1.0, 0.0 ); + // xglRotatef( 90.0 - f->get_Latitude() * SGD_RADIANS_TO_DEGREES, + // 0.0, 1.0, 0.0 ); sgSetVec3( axis, 0.0, 1.0, 0.0 ); - sgMakeRotMat4( LAT, 90.0 - lat * RAD_TO_DEG, axis ); + sgMakeRotMat4( LAT, 90.0 - lat * SGD_RADIANS_TO_DEGREES, axis ); - // xglRotatef( l->sun_rotation * RAD_TO_DEG, 0.0, 0.0, 1.0 ); + // xglRotatef( l->sun_rotation * SGD_RADIANS_TO_DEGREES, 0.0, 0.0, 1.0 ); sgSetVec3( axis, 0.0, 0.0, 1.0 ); - sgMakeRotMat4( SPIN, spin * RAD_TO_DEG, axis ); + sgMakeRotMat4( SPIN, spin * SGD_RADIANS_TO_DEGREES, axis ); sgMat4 TRANSFORM;