]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/tgdb/pt_lights.cxx
pt_lights: softly fade in and out the blinking lights
[simgear.git] / simgear / scene / tgdb / pt_lights.cxx
index 925d3e20b85118dd5c8ec1fbb362158724a06a92..7e123a475da55583f31b65ba2dd59e28ae846fa8 100644 (file)
@@ -548,26 +548,27 @@ SGLightFactory::getHoldShort(const SGDirectionalLightBin& lights)
   if (lights.getNumLights() < 2)
     return 0;
 
-  float flashTime = 2;
+  sg_srandom(unsigned(lights.getLight(0).position[0]));
+  float flashTime = 2 + 0.1 * sg_random();
   osg::Sequence* sequence = new osg::Sequence;
-  sequence->setDefaultTime(flashTime);
-  Effect* effect = getLightEffect(6, osg::Vec3(1, 0.001, 0.000002),
-                                  0, 6, true);
-  // Lights on
-  EffectGeode* egeode = new EffectGeode;
-  for (int i = lights.getNumLights(); 0 <= i; --i) {
-    egeode->setEffect(effect);
-    egeode->addDrawable(getLightDrawable(lights.getLight(i)));
-  }
-  sequence->addChild(egeode, flashTime);
 
-  // Lights off
+  // start with lights off
   sequence->addChild(new osg::Group, flashTime);
+  // ...and increase the lights in steps
+  for (int i = 2; i < 7; i+=2) {
+      Effect* effect = getLightEffect(i, osg::Vec3(1, 0.001, 0.000002),
+                                      0, i, true);
+      EffectGeode* egeode = new EffectGeode;
+      for (unsigned int j = 0; j < lights.getNumLights(); ++j) {
+          egeode->addDrawable(getLightDrawable(lights.getLight(j)));
+          egeode->setEffect(effect);
+      }
+      sequence->addChild(egeode, (i==6) ? flashTime : 0.1);
+  }
 
-  sequence->setInterval(osg::Sequence::LOOP, 0, -1);
+  sequence->setInterval(osg::Sequence::SWING, 0, -1);
   sequence->setDuration(1.0f, -1);
   sequence->setMode(osg::Sequence::START);
-  sequence->setSync(true);
 
   return sequence;
 }