// $Id$
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <plib/sg.h>
#include <plib/ssg.h>
-#include <simgear/math/fg_random.h>
+#include <simgear/math/sg_random.h>
#include "sky.hxx"
// Destructor
-SGSky::~SGSky( void ) {
+SGSky::~SGSky( void )
+{
+ for (int i = 0; i < cloud_layers.size(); i++)
+ delete cloud_layers[i];
}
pre_root->addKid( pre_selector );
post_root->addKid( post_selector );
-
- // add the cloud ssgStates to the material lib
- FGPath cloud_path;
-
- cloud_path.set( tex_path.str() );
- cloud_path.append( "overcast.rgb" );
- cloud_mats[SG_CLOUD_OVERCAST] = SGCloudMakeState( cloud_path.str() );
-
- cloud_path.set( tex_path.str() );
- cloud_path.append( "mostlycloudy.rgba" );
- cloud_mats[SG_CLOUD_MOSTLY_CLOUDY] = SGCloudMakeState( cloud_path.str() );
-
- cloud_path.set( tex_path.str() );
- cloud_path.append( "mostlysunny.rgba" );
- cloud_mats[SG_CLOUD_MOSTLY_SUNNY] = SGCloudMakeState( cloud_path.str() );
-
- cloud_path.set( tex_path.str() );
- cloud_path.append( "cirrus.rgba" );
- cloud_mats[SG_CLOUD_CIRRUS] = SGCloudMakeState( cloud_path.str() );
}
int in_cloud = -1; // cloud we are in
+ int i;
+
// check where we are relative to the cloud layers
- for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
- float asl = cloud_layers[i]->get_asl();
- float thickness = cloud_layers[i]->get_thickness();
+ for ( i = 0; i < (int)cloud_layers.size(); ++i ) {
+ float asl = cloud_layers[i]->getElevation_m();
+ float thickness = cloud_layers[i]->getThickness_m();
if ( alt < asl - slop ) {
// below cloud layer
// determine rendering order
int pos = 0;
while ( pos < (int)cloud_layers.size() &&
- alt > cloud_layers[pos]->get_asl())
+ alt > cloud_layers[pos]->getElevation_m())
{
++pos;
}
if ( pos == 0 ) {
// we are below all the cloud layers, draw top to bottom
- for ( int i = cloud_layers.size() - 1; i >= 0; --i ) {
+ for ( i = cloud_layers.size() - 1; i >= 0; --i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();
}
}
} else if ( pos >= (int)cloud_layers.size() ) {
// we are above all the cloud layers, draw bottom to top
- for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
+ for ( i = 0; i < (int)cloud_layers.size(); ++i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();
}
} else {
// we are between cloud layers, draw lower layers bottom to
// top and upper layers top to bottom
- for ( int i = 0; i < pos; ++i ) {
+ for ( i = 0; i < pos; ++i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();
}
}
- for ( int i = cloud_layers.size() - 1; i >= pos; --i ) {
+ for ( i = cloud_layers.size() - 1; i >= pos; --i ) {
if ( i != in_cloud ) {
cloud_layers[i]->draw();
}
}
}
-
-void SGSky::add_cloud_layer( double asl, double thickness,
- double transition, double span,
- ssgSimpleState *state ) {
- SGCloudLayer *layer = new SGCloudLayer;
- layer->build( span, asl, thickness, transition, state );
-
- layer_list_iterator current = cloud_layers.begin();
- layer_list_iterator last = cloud_layers.end();
- while ( current != last && (*current)->get_asl() < asl ) {
- ++current;
- }
-
- if ( current != last ) {
- cloud_layers.insert( current, layer );
- } else {
- cloud_layers.push_back( layer );
- }
-
- for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
- cout << "layer " << i << " = " << cloud_layers[i]->get_asl() << endl;
- }
- cout << endl;
+void
+SGSky::add_cloud_layer( SGCloudLayer * layer )
+{
+ cloud_layers.push_back(layer);
}
-
-void SGSky::add_cloud_layer( double asl, double thickness,
- double transition, double span,
- const string &tex_path ) {
- ssgSimpleState *state = SGCloudMakeState( tex_path );
- add_cloud_layer( asl, thickness, transition, span, state );
+const SGCloudLayer *
+SGSky::get_cloud_layer (int i) const
+{
+ return cloud_layers[i];
}
-
-void SGSky::add_cloud_layer( double asl, double thickness,
- double transition, double span,
- SGCloudType type ) {
- if ( type > 0 && type < SG_MAX_CLOUD_TYPES ) {
- add_cloud_layer( asl, thickness, transition, span, cloud_mats[type] );
- }
+SGCloudLayer *
+SGSky::get_cloud_layer (int i)
+{
+ return cloud_layers[i];
}
+int
+SGSky::get_cloud_layer_count () const
+{
+ return cloud_layers.size();
+}
// modify the current visibility based on cloud layers, thickness,
// transition range, and simulated "puffs".
float effvis = visibility;
for ( int i = 0; i < (int)cloud_layers.size(); ++i ) {
- float asl = cloud_layers[i]->get_asl();
- float thickness = cloud_layers[i]->get_thickness();
- float transition = cloud_layers[i]->get_transition();
+ float asl = cloud_layers[i]->getElevation_m();
+ float thickness = cloud_layers[i]->getThickness_m();
+ float transition = cloud_layers[i]->getTransition_m();
double ratio = 1.0;
if ( ratio < 1.0 ) {
if ( ! in_puff ) {
// calc chance of entering cloud puff
- double rnd = fg_random();
+ double rnd = sg_random();
double chance = rnd * rnd * rnd;
if ( chance > 0.95 /* * (diff - 25) / 50.0 */ ) {
in_puff = true;
- puff_length = fg_random() * 2.0; // up to 2 seconds
+ puff_length = sg_random() * 2.0; // up to 2 seconds
puff_progression = 0.0;
}
}
effective_visibility = effvis;
}
-