1
0
Fork 0

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.
This commit is contained in:
Stuart Buchanan 2012-11-09 20:29:28 +00:00
parent 18e3fc0c82
commit b7e79c1231
2 changed files with 14 additions and 9 deletions

View file

@ -34,7 +34,6 @@
#include <simgear/scene/sky/cloudfield.hxx> #include <simgear/scene/sky/cloudfield.hxx>
#include <simgear/scene/sky/newcloud.hxx> #include <simgear/scene/sky/newcloud.hxx>
#include <simgear/structure/commands.hxx> #include <simgear/structure/commands.hxx>
#include <simgear/math/sg_random.h>
#include <simgear/props/props_io.hxx> #include <simgear/props/props_io.hxx>
#include <Main/globals.hxx> #include <Main/globals.hxx>
@ -56,6 +55,7 @@ FGClouds::FGClouds() :
index(0) index(0)
{ {
update_event = 0; update_event = 0;
mt_init_time_10(&seed);
} }
FGClouds::~FGClouds() FGClouds::~FGClouds()
@ -109,9 +109,9 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_
return 0.0; return 0.0;
} }
double x = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); double x = mt_rand(&seed) * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0);
double y = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0); double y = mt_rand(&seed) * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0);
double z = grid_z_rand * (sg_random() - 0.5); double z = grid_z_rand * (mt_rand(&seed) - 0.5);
float lon = fgGetNode("/position/longitude-deg", false)->getFloatValue(); float lon = fgGetNode("/position/longitude-deg", false)->getFloatValue();
float lat = fgGetNode("/position/latitude-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); int vdist = abox->getIntValue("vdist", 1);
double c = abox->getDoubleValue("count", 5); 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); 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++) for (int k = 0; k < hdist; k++)
{ {
x += (sg_random() / hdist); x += (mt_rand(&seed) / hdist);
y += (sg_random() / hdist); y += (mt_rand(&seed) / hdist);
} }
for (int k = 0; k < vdist; k++) 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 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; double cov = coverage * SGCloudField::fieldSize * SGCloudField::fieldSize;
while (cov > 0.0f) { while (cov > 0.0f) {
double choice = sg_random(); double choice = mt_rand(&seed);
for(int i = 0; i < CloudVarietyCount ; i ++) { for(int i = 0; i < CloudVarietyCount ; i ++) {
choice -= tCloudVariety[i].count * totalCount; choice -= tCloudVariety[i].count * totalCount;

View file

@ -27,6 +27,7 @@
#endif #endif
#include <simgear/compiler.h> #include <simgear/compiler.h>
#include <simgear/math/sg_random.h>
#include <simgear/sound/soundmgr_openal.hxx> #include <simgear/sound/soundmgr_openal.hxx>
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
@ -51,6 +52,10 @@ private:
bool clouds_3d_enabled; bool clouds_3d_enabled;
int index; int index;
// RNG seed to ensure cloud synchronization across multi-process
// deployments
mt seed;
public: public:
FGClouds(); FGClouds();
~FGClouds(); ~FGClouds();