Fix a bug in cloud texture state loading which caused the cloud textures to

be loaded 5 times! for a lot of wasted texture RAM.  Thanks to Erik H. for
noticing the problem.
This commit is contained in:
curt 2003-06-02 15:23:45 +00:00
parent df677ff8aa
commit b6a683eb6e
2 changed files with 19 additions and 18 deletions

View File

@ -32,8 +32,9 @@
#include "cloud.hxx" #include "cloud.hxx"
ssgSimpleState *
SGCloudLayer::layer_states[SGCloudLayer::SG_MAX_CLOUD_COVERAGES]; static ssgSimpleState *layer_states[SGCloudLayer::SG_MAX_CLOUD_COVERAGES];
static bool state_initialized = false;
// Constructor // Constructor
@ -55,9 +56,6 @@ SGCloudLayer::SGCloudLayer( const string &tex_path ) :
tl[0] = tl[1] = tl[2] = tl[3] = NULL; tl[0] = tl[1] = tl[2] = tl[3] = NULL;
layer[0] = layer[1] = layer[2] = layer[3] = NULL; layer[0] = layer[1] = layer[2] = layer[3] = NULL;
for ( int i = 0; i < SG_MAX_CLOUD_COVERAGES; ++i ) {
layer_states[i] = NULL;
}
layer_root->addKid(layer_transform); layer_root->addKid(layer_transform);
rebuild(); rebuild();
} }
@ -139,33 +137,37 @@ SGCloudLayer::setCoverage (Coverage coverage)
void void
SGCloudLayer::rebuild() SGCloudLayer::rebuild()
{ {
// Initialize states and sizes if necessary. // Initialize states and sizes if necessary.
if ( layer_states[0] == NULL ) { if ( !state_initialized ) {
state_initialized = true;
cout << "initializing cloud layers" << endl;
SGPath cloud_path; SGPath cloud_path;
cloud_path.set(texture_path.str()); cloud_path.set(texture_path.str());
cloud_path.append("overcast.rgb"); cloud_path.append("overcast.rgb");
layer_states[SG_CLOUD_OVERCAST] = SGCloudMakeState(cloud_path.str()); layer_states[SG_CLOUD_OVERCAST] = sgCloudMakeState(cloud_path.str());
cloud_path.set(texture_path.str()); cloud_path.set(texture_path.str());
cloud_path.append("broken.rgba"); cloud_path.append("broken.rgba");
layer_states[SG_CLOUD_BROKEN] layer_states[SG_CLOUD_BROKEN]
= SGCloudMakeState(cloud_path.str()); = sgCloudMakeState(cloud_path.str());
cloud_path.set(texture_path.str()); cloud_path.set(texture_path.str());
cloud_path.append("scattered.rgba"); cloud_path.append("scattered.rgba");
layer_states[SG_CLOUD_SCATTERED] layer_states[SG_CLOUD_SCATTERED]
= SGCloudMakeState(cloud_path.str()); = sgCloudMakeState(cloud_path.str());
cloud_path.set(texture_path.str()); cloud_path.set(texture_path.str());
cloud_path.append("few.rgba"); cloud_path.append("few.rgba");
layer_states[SG_CLOUD_FEW] layer_states[SG_CLOUD_FEW]
= SGCloudMakeState(cloud_path.str()); = sgCloudMakeState(cloud_path.str());
cloud_path.set(texture_path.str()); cloud_path.set(texture_path.str());
cloud_path.append("cirrus.rgba"); cloud_path.append("cirrus.rgba");
layer_states[SG_CLOUD_CIRRUS] layer_states[SG_CLOUD_CIRRUS]
= SGCloudMakeState(cloud_path.str()); = sgCloudMakeState(cloud_path.str());
layer_states[SG_CLOUD_CLEAR] = 0; layer_states[SG_CLOUD_CLEAR] = 0;
} }
@ -424,9 +426,11 @@ void SGCloudLayer::draw() {
// make an ssgSimpleState for a cloud layer given the named texture // make an ssgSimpleState for a cloud layer given the named texture
ssgSimpleState *SGCloudMakeState( const string &path ) { ssgSimpleState *sgCloudMakeState( const string &path ) {
ssgSimpleState *state = new ssgSimpleState(); ssgSimpleState *state = new ssgSimpleState();
cout << " texture = " << path << endl;
state->setTexture( (char *)path.c_str() ); state->setTexture( (char *)path.c_str() );
state->setShadeModel( GL_SMOOTH ); state->setShadeModel( GL_SMOOTH );
state->disable( GL_LIGHTING ); state->disable( GL_LIGHTING );

View File

@ -93,12 +93,9 @@ public:
private: private:
static ssgSimpleState *layer_states[SG_MAX_CLOUD_COVERAGES];
static int layer_sizes[SG_MAX_CLOUD_COVERAGES];
ssgRoot *layer_root; ssgRoot *layer_root;
ssgTransform *layer_transform; ssgTransform *layer_transform;
ssgLeaf * layer[4]; ssgLeaf *layer[4];
ssgColourArray *cl[4]; ssgColourArray *cl[4];
ssgVertexArray *vl[4]; ssgVertexArray *vl[4];
@ -123,7 +120,7 @@ private:
// make an ssgSimpleState for a cloud layer given the named texture // make an ssgSimpleState for a cloud layer given the named texture
ssgSimpleState *SGCloudMakeState( const string &path ); ssgSimpleState *sgCloudMakeState( const string &path );
#endif // _SG_CLOUD_HXX_ #endif // _SG_CLOUD_HXX_