# include "config.h"
#endif
+#include "fgclouds.hxx"
+
#include <cstring>
+#include <cstdio>
#include <Main/fg_props.hxx>
#include <simgear/constants.h>
#include <Main/globals.hxx>
#include <Main/util.hxx>
#include <Viewer/renderer.hxx>
-#include <Airports/simple.hxx>
-
-#include "fgclouds.hxx"
+#include <Airports/airport.hxx>
-static bool do_delete_3Dcloud (const SGPropertyNode *arg);
-static bool do_move_3Dcloud (const SGPropertyNode *arg);
-static bool do_add_3Dcloud (const SGPropertyNode *arg);
+// RNG seed to ensure cloud synchronization across multi-process
+// deployments
+static mt seed;
FGClouds::FGClouds() :
-#if 0
- snd_lightning(0),
-#endif
clouds_3d_enabled(false),
index(0)
{
update_event = 0;
- mt_init_time_10(&seed);
}
FGClouds::~FGClouds()
{
+ globals->get_commands()->removeCommand("add-cloud");
+ globals->get_commands()->removeCommand("del-cloud");
+ globals->get_commands()->removeCommand("move-cloud");
+
}
int FGClouds::get_update_event(void) const {
buildCloudLayers();
}
-void FGClouds::Init(void) {
-#if 0
- if( snd_lightning == NULL ) {
- snd_lightning = new SGSoundSample("Sounds/thunder.wav", SGPath());
- snd_lightning->set_max_dist(7000.0f);
- snd_lightning->set_reference_dist(3000.0f);
- SGSoundMgr *smgr = globals->get_soundmgr();
- SGSampleGroup *sgr = smgr->find("weather", true);
- sgr->add( snd_lightning, "thunder" );
- }
-#endif
+void FGClouds::Init(void)
+{
+ mt_init_time_10(&seed);
- globals->get_commands()->addCommand("add-cloud", do_add_3Dcloud);
- globals->get_commands()->addCommand("del-cloud", do_delete_3Dcloud);
- globals->get_commands()->addCommand("move-cloud", do_move_3Dcloud);
+ globals->get_commands()->addCommand("add-cloud", this, &FGClouds::add3DCloud);
+ globals->get_commands()->addCommand("del-cloud", this, &FGClouds::delete3DCloud);
+ globals->get_commands()->addCommand("move-cloud", this, &FGClouds::move3DCloud);
}
// Build an invidual cloud. Returns the extents of the cloud for coverage calculations
-double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_def_root, const string& name, double grid_z_rand, SGCloudField *layer) {
+double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_def_root,
+ const std::string& name, double grid_z_rand, SGCloudField *layer)
+{
SGPropertyNode *box_def=NULL;
SGPropertyNode *cld_def=NULL;
double extent = 0.0;
z = h * z + pos[2]; // Up/Down. pos[2] is the cloudbase
//SGVec3f newpos = SGVec3f(x, y, z);
- SGNewCloud cld(texture_root, cld_def);
+ SGNewCloud cld(texture_root, cld_def, &seed);
//layer->addCloud(newpos, cld.genCloud());
layer->addCloud(lon, lat, z, x, y, index++, cld.genCloud());
double count = acloud->getDoubleValue("count", 1.0);
tCloudVariety[CloudVarietyCount].count = count;
int variety = 0;
- cloud_name = cloud_name + "-%d";
char variety_name[50];
do {
variety++;
- snprintf(variety_name, sizeof(variety_name) - 1, cloud_name.c_str(), variety);
+ snprintf(variety_name, sizeof(variety_name) - 1, "%s-%d", cloud_name.c_str(), variety);
} while( box_def_root->getChild(variety_name, 0, false) );
totalCount += count;
* (Various) - cloud definition properties. See README.3DClouds
*
*/
- static bool
- do_add_3Dcloud (const SGPropertyNode *arg)
+ bool FGClouds::add3DCloud(const SGPropertyNode *arg)
{
int l = arg->getIntValue("layer", 0);
int index = arg->getIntValue("index", 0);
SGSky* thesky = globals->get_renderer()->getSky();
SGCloudField *layer = thesky->get_cloud_layer(l)->get_layer3D();
- SGNewCloud cld(texture_root, arg);
+ SGNewCloud cld(texture_root, arg, &seed);
bool success = layer->addCloud(lon, lat, alt, x, y, index, cld.genCloud());
// Adding a 3D cloud immediately makes this layer 3D.
* index - the cloud index
*
*/
- static bool
- do_delete_3Dcloud (const SGPropertyNode *arg)
+ bool FGClouds::delete3DCloud(const SGPropertyNode *arg)
{
int l = arg->getIntValue("layer", 0);
int i = arg->getIntValue("index", 0);
* lon/lat/alt - the position for the cloud
*
*/
- static bool
- do_move_3Dcloud (const SGPropertyNode *arg)
+bool FGClouds::move3DCloud(const SGPropertyNode *arg)
{
int l = arg->getIntValue("layer", 0);
int i = arg->getIntValue("index", 0);