From b7e79c12313e54ce14d21c9d98c6daa2c736dd0a Mon Sep 17 00:00:00 2001 From: Stuart Buchanan Date: Fri, 9 Nov 2012 20:29:28 +0000 Subject: [PATCH] For clouds use a RNG seed that stays the same for 10 minutes. This allows multi-process systems to stay in sync and display the same clouds. --- src/Environment/fgclouds.cxx | 18 +++++++++--------- src/Environment/fgclouds.hxx | 5 +++++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Environment/fgclouds.cxx b/src/Environment/fgclouds.cxx index d5db1ed20..c77eb284b 100644 --- a/src/Environment/fgclouds.cxx +++ b/src/Environment/fgclouds.cxx @@ -34,7 +34,6 @@ #include #include #include -#include #include #include
@@ -56,6 +55,7 @@ FGClouds::FGClouds() : index(0) { update_event = 0; + mt_init_time_10(&seed); } FGClouds::~FGClouds() @@ -109,9 +109,9 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ return 0.0; } - double x = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); - double y = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); - double z = grid_z_rand * (sg_random() - 0.5); + double x = mt_rand(&seed) * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); + double y = mt_rand(&seed) * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); + double z = grid_z_rand * (mt_rand(&seed) - 0.5); float lon = fgGetNode("/position/longitude-deg", false)->getFloatValue(); float lat = fgGetNode("/position/latitude-deg", false)->getFloatValue(); @@ -132,7 +132,7 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ int vdist = abox->getIntValue("vdist", 1); double c = abox->getDoubleValue("count", 5); - int count = (int) (c + (sg_random() - 0.5) * c); + int count = (int) (c + (mt_rand(&seed) - 0.5) * c); extent = std::max(w*w, extent); @@ -147,13 +147,13 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_ for (int k = 0; k < hdist; k++) { - x += (sg_random() / hdist); - y += (sg_random() / hdist); + x += (mt_rand(&seed) / hdist); + y += (mt_rand(&seed) / hdist); } for (int k = 0; k < vdist; k++) { - z += (sg_random() / vdist); + z += (mt_rand(&seed) / vdist); } x = w * (x - 0.5) + pos[0]; // N/S @@ -241,7 +241,7 @@ void FGClouds::buildLayer(int iLayer, const string& name, double coverage) { double cov = coverage * SGCloudField::fieldSize * SGCloudField::fieldSize; while (cov > 0.0f) { - double choice = sg_random(); + double choice = mt_rand(&seed); for(int i = 0; i < CloudVarietyCount ; i ++) { choice -= tCloudVariety[i].count * totalCount; diff --git a/src/Environment/fgclouds.hxx b/src/Environment/fgclouds.hxx index 7eab7f128..d3dd88855 100644 --- a/src/Environment/fgclouds.hxx +++ b/src/Environment/fgclouds.hxx @@ -27,6 +27,7 @@ #endif #include +#include #include #include
@@ -50,6 +51,10 @@ private: #endif bool clouds_3d_enabled; int index; + + // RNG seed to ensure cloud synchronization across multi-process + // deployments + mt seed; public: FGClouds();