]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sky/cloud.cxx
Be more conservative and reuse SSG objects.
[simgear.git] / simgear / sky / cloud.cxx
index 4c37a17a96994351852dfa6617e388390960f694..4f9b5a15d05a92802fb1b25c9b2eb33e5b16e0a1 100644 (file)
@@ -38,19 +38,23 @@ SGCloudLayer::layer_states[SGCloudLayer::SG_MAX_CLOUD_TYPES];
 
 // Constructor
 SGCloudLayer::SGCloudLayer( const string &tex_path )
-  : layer_root(0),
-    layer_transform(0),
+  : layer_root(new ssgRoot),
+    layer_transform(new ssgTransform),
+    layer(0),
     texture_path(tex_path),
     layer_asl(0),
     layer_thickness(0),
     layer_transition(0),
     layer_type(SG_CLOUD_CLEAR)
 {
-  rebuild();
+    layer_root->addKid(layer_transform);
+    rebuild();
 }
 
 // Destructor
-SGCloudLayer::~SGCloudLayer( void ) {
+SGCloudLayer::~SGCloudLayer()
+{
+    delete layer_root;         // deletes layer_transform and layer as well
 }
 
 float
@@ -62,7 +66,10 @@ SGCloudLayer::getSpan_m () const
 void
 SGCloudLayer::setSpan_m (float span_m)
 {
-    layer_span = span_m;
+    if (span_m != layer_span) {
+       layer_span = span_m;
+       rebuild();
+    }
 }
 
 float
@@ -110,8 +117,10 @@ SGCloudLayer::getType () const
 void
 SGCloudLayer::setType (Type type)
 {
-    layer_type = type;
-    rebuild();
+    if (type != layer_type) {
+       layer_type = type;
+       rebuild();
+    }
 }
 
 
@@ -143,8 +152,6 @@ SGCloudLayer::rebuild()
       layer_states[SG_CLOUD_CLEAR] = 0;
     }
 
-    delete layer_root;
-
     scale = 4000.0;
 
     last_lon = last_lat = -999.0f;
@@ -185,23 +192,17 @@ SGCloudLayer::rebuild()
     vl->add( vertex );
     tl->add( tc );
 
-    ssgLeaf *layer = 
-       new ssgVtxTable ( GL_TRIANGLE_STRIP, vl, NULL, tl, cl );
+    if (layer != 0)
+      layer_transform->removeKid(layer); // automatic delete
+    layer = new ssgVtxTable ( GL_TRIANGLE_STRIP, vl, NULL, tl, cl );
     if (layer_states[layer_type] != 0)
       layer->setState( layer_states[layer_type] );
 
     // force a repaint of the moon colors with arbitrary defaults
     repaint( color );
 
-    // build the ssg scene graph sub tree for the sky and connected
-    // into the provide scene graph branch
-    layer_transform = new ssgTransform;
-
     // moon_transform->addKid( halo );
     layer_transform->addKid( layer );
-
-    layer_root = new ssgRoot;
-    layer_root->addKid( layer_transform );
 }