Frederic Bouvier:

Move the rendering stage for upper clouds from preDraw
 to drawUpperClouds. Rename postDraw to drawLowerClouds.
This commit is contained in:
ehofman
2004-04-02 14:39:42 +00:00
parent 4b04450fa6
commit 7aa4f0ccdb
2 changed files with 37 additions and 24 deletions

View File

@@ -168,15 +168,9 @@ bool SGSky::reposition( SGSkyState &st, double dt )
// draw background portions of the sky ... do this before you draw the
// rest of your scene.
void SGSky::preDraw( float alt, float fog_exp2_density ) {
void SGSky::preDraw( float alt ) {
ssgCullAndDraw( pre_root );
// FIXME: This should not be needed, but at this time (08/15/2003)
// certain NVidia drivers don't seem to implement
// glPushAttrib(FG_FOG_BIT) properly. The result is that
// there is not fog when looking at the sun.
glFogf ( GL_FOG_DENSITY, fog_exp2_density );
// if we are closer than this to a cloud layer, don't draw clouds
static const float slop = 5.0;
int i;
@@ -206,9 +200,17 @@ void SGSky::preDraw( float alt, float fog_exp2_density ) {
{
++cur_layer_pos;
}
}
void SGSky::drawUpperClouds( float fog_exp2_density ) {
// FIXME: This should not be needed, but at this time (08/15/2003)
// certain NVidia drivers don't seem to implement
// glPushAttrib(FG_FOG_BIT) properly. The result is that
// there is not fog when looking at the sun.
glFogf ( GL_FOG_DENSITY, fog_exp2_density );
// draw the cloud layers that are above us, top to bottom
for ( i = (int)cloud_layers.size() - 1; i >= cur_layer_pos; --i ) {
for ( int i = (int)cloud_layers.size() - 1; i >= cur_layer_pos; --i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();
}
@@ -218,10 +220,9 @@ void SGSky::preDraw( float alt, float fog_exp2_density ) {
// draw translucent clouds ... do this after you've drawn all the
// oapaque elements of your scene.
void SGSky::postDraw( float alt ) {
void SGSky::drawLowerClouds() {
// draw the cloud layers that are below us, bottom to top
for ( int i = 0; i < cur_layer_pos; ++i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();

View File

@@ -143,22 +143,27 @@ typedef struct {
* Rendering the Sky
* The sky is designed to be rendered in two stages. The first stage
* The sky is designed to be rendered in three stages. The first stage
* renders the parts that form your back drop - the sky dome, the
* stars and planets, the sun, and the moon. These should be rendered
* before the rest of your scene by calling the preDraw() method. The
* second stage renders the clouds which are likely to be translucent
* (depending on type) and should be drawn after your scene has been
* rendered. Use the postDraw() method to draw the second stage of
* the sky.
* second stage renders the clouds that are above the viewer. This stage
* is done before translucent objects in the main scene are drawn. It
* is seperated from the preDraw routine to enable to implement a
* multi passes technique and is located in the drawUpperClouds() method.
* The third stage renders the clouds that are below the viewer an which
* are likely to be translucent (depending on type) and should be drawn
* after your scene has been rendered. Use the drawLowerClouds() method
* to draw the second stage of the sky.
* A typical application might do the following:
* <li> thesky->preDraw();
* <li> thesky->preDraw( my_altitude );
* <li> thesky->drawUpperClouds();
* <li> ssgCullAndDraw ( myscene ) ;
* <li> thesky->postDraw( my_altitude );
* <li> thesky->drawLowerClouds();
* The current altitude in meters is passed to the postDraw() method
* The current altitude in meters is passed to the preDraw() method
* so the clouds layers can be rendered correction from most distant
* to closest.
@@ -329,15 +334,22 @@ public:
* class description.
* @param alt current altitude
*/
void preDraw( float alt, float fog_exp2_density );
void preDraw( float alt );
/**
* Draw translucent clouds ... do this after you've drawn all the
* oapaque elements of your scene. See discussion in detailed
* class description.
* @param alt current altitude
* Draw upper translucent clouds ... do this before you've drawn
* all the translucent elements of your scene. See discussion in
* detailed class description.
* @param fog_exp2_density fog density of the current cloud layer
*/
void postDraw( float alt );
void drawUpperClouds( float fog_exp2_density );
/**
* Draw lower translucent clouds ... do this after you've drawn
* all the opaque elements of your scene. See discussion in detailed
* class description.
*/
void drawLowerClouds();
/**
* Specify the texture path (optional, defaults to current directory)