X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fprecipitation_mgr.cxx;h=9e83ab8529aeff365f7ce50939b5f6dfd17f16ef;hb=06e8fe747fb1733528aa1e01bc6bd285a53ec127;hp=1f3140547432715c514ff94dc63afddd3492011c;hpb=e174561c67e0f707d4c69679c7236278a2f92f7f;p=flightgear.git diff --git a/src/Environment/precipitation_mgr.cxx b/src/Environment/precipitation_mgr.cxx index 1f3140547..9e83ab852 100644 --- a/src/Environment/precipitation_mgr.cxx +++ b/src/Environment/precipitation_mgr.cxx @@ -33,19 +33,17 @@ #include #include -#include #include #include +#include #include
#include
+#include #include #include "precipitation_mgr.hxx" -extern SGSky *thesky; - - /** * @brief FGPrecipitation Manager constructor * @@ -61,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()); } @@ -83,7 +84,7 @@ void FGPrecipitationMgr::init() SGGeod geod = SGGeod::fromDegM(fgGetDouble("/position/longitude-deg", 0.0), fgGetDouble("/position/latitude-deg", 0.0), 0.0); - osg::Matrix position(geod.makeZUpFrame()); + osg::Matrix position(makeZUpFrame(geod)); // Move the precipitation object to player position transform->setMatrix(position); // Add to scene graph @@ -126,21 +127,28 @@ 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) max = SGCloudLayer::SG_MAX_CLOUD_COVERAGES; result = 0; + SGSky* thesky = globals->get_renderer()->getSky(); + // To avoid messing up if (thesky == NULL) return result; @@ -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);