]> git.mxchange.org Git - flightgear.git/blobdiff - src/Environment/precipitation_mgr.cxx
Precipitation updates from ThorstenR
[flightgear.git] / src / Environment / precipitation_mgr.cxx
index a3e91514dfaf41971a16a7ebf7851cf5794a8554..9e83ab8529aeff365f7ce50939b5f6dfd17f16ef 100644 (file)
@@ -39,7 +39,7 @@
 
 #include <Main/fg_props.hxx>
 #include <Main/globals.hxx>
-#include <Main/renderer.hxx>
+#include <Viewer/renderer.hxx>
 #include <Scenery/scenery.hxx>
 
 #include "precipitation_mgr.hxx"
@@ -59,6 +59,9 @@ FGPrecipitationMgr::FGPrecipitationMgr()
     // By default, no precipitation
     precipitation->setRainIntensity(0);
     precipitation->setSnowIntensity(0);
+
+    // set the clip distance from the config
+    precipitation->setClipDistance(fgGetFloat("/environment/precipitation-control/clip-distance",5.0));
     transform->addChild(precipitation->build());
     group->addChild(transform.get());
 }
@@ -124,15 +127,20 @@ osg::Group * FGPrecipitationMgr::getObject(void)
  * @returns Elevation max in meter
  *
  * This function permits you to know what is the altitude max where we can
- * find precipitation. The value is returned in meter.
+ * find precipitation. The value is returned in meters.
  */
 float FGPrecipitationMgr::getPrecipitationAtAltitudeMax(void)
 {
     int i;
     int max;
-       double elev;
     float result;
     SGPropertyNode *boundaryNode, *boundaryEntry;
+    
+    if (fgGetBool("/environment/params/use-external-precipitation-level", false)) {
+        // If we're not modeling the precipitation level based on the cloud
+        // layers, take it directly from the property tree.
+        return fgGetFloat("/environment/params/external-precipitation-level-m", 0.0);    
+    }
 
 
     // By default (not cloud layer)
@@ -180,7 +188,7 @@ float FGPrecipitationMgr::getPrecipitationAtAltitudeMax(void)
 
         // For each boundary layers
         while ( ( boundaryEntry = boundaryNode->getNode( "entry", i ) ) != NULL ) {
-            elev = boundaryEntry->getDoubleValue( "elevation-ft" );
+            double elev = boundaryEntry->getDoubleValue( "elevation-ft" );
 
             if (elev > result)
                 result = elev;
@@ -213,22 +221,38 @@ void FGPrecipitationMgr::update(double dt)
 
     float altitudeAircraft;
     float altitudeCloudLayer;
+    float rainDropletSize;
+    float snowFlakeSize;
+    float illumination;
 
     altitudeCloudLayer = this->getPrecipitationAtAltitudeMax() * SG_METER_TO_FEET;
     setPrecipitationLevel(altitudeCloudLayer);
 
-       // Does the user enable the precipitation ?
-       if (!precipitation->getEnabled() ) {
-               // Disable precipitations
-           precipitation->setRainIntensity(0);
-           precipitation->setSnowIntensity(0);
 
-           // Update the drawing...
-           precipitation->update();
 
-               // Exit
-               return;
-       }
+    // Does the user enable the precipitation ?
+    if (!precipitation->getEnabled() ) {
+        // Disable precipitations
+        precipitation->setRainIntensity(0);
+        precipitation->setSnowIntensity(0);
+
+        // Update the drawing...
+        precipitation->update();
+
+        // Exit
+        return;
+    }
+
+   // See if external droplet size and illumination are used
+   if (fgGetBool("/environment/precipitation-control/detailed-precipitation", false)) {
+       precipitation->setDropletExternal(true);
+       rainDropletSize = fgGetFloat("/environment/precipitation-control/rain-droplet-size", 0.015);
+       snowFlakeSize = fgGetFloat("/environment/precipitation-control/snow-flake-size", 0.03);
+       illumination = fgGetFloat("/environment/precipitation-control/illumination", 1.0);
+       precipitation->setRainDropletSize(rainDropletSize);
+       precipitation->setSnowFlakeSize(snowFlakeSize);
+       precipitation->setIllumination(illumination);
+   }
 
     // Get the elevation of aicraft and of the cloud layer
     altitudeAircraft = fgGetDouble("/position/altitude-ft", 0.0);