Skip to content

Commit 2baf2bc

Browse files
Make sure random seeds for generating the splotch positions match for master and slaves (#146)
1 parent 592e45f commit 2baf2bc

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

src/OpenCOVER/plugins/hlrs/GhostAvatar/texture/SplotchTerroirTexture.cpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@
33

44
#include <osg/Uniform>
55

6+
#include <cover/coVRMSController.h>
7+
68
#include "SplotchTerroirTexture.h"
79

810
SplotchTerroirTexture::SplotchTerroirTexture(float distanceThreshold)
911
: TerroirTexture("TerroirTextureSplotches", distanceThreshold)
1012
{
13+
/*
14+
Since in the CAVE multiple OpenCover instances are running (which would each
15+
generate their own seeds, resulting in mismatching splotches) we need the master
16+
to create a seed and send it to the slaves.
17+
*/
18+
masterGeneratesAndSharesSeed();
1119
}
1220

1321
void SplotchTerroirTexture::onEnoughDistanceCovered()
@@ -23,20 +31,30 @@ void SplotchTerroirTexture::updateShader()
2331
updateShaderUniforms();
2432
}
2533

26-
float generateRandomFloat(float start, float end)
34+
void SplotchTerroirTexture::masterGeneratesAndSharesSeed()
2735
{
28-
/*
29-
Since in the CAVE multiple OpenCovers seem to be running (which would each generate their own
30-
random numbers, resulting in mismatching splotches) we have to set a seed.
31-
*/
32-
static thread_local std::mt19937 engine { 3847u };
36+
if (opencover::coVRMSController::instance()->isMaster())
37+
{
38+
std::mt19937 engine { std::random_device { }() };
39+
m_seed = std::uniform_int_distribution<unsigned int> { 0, 1000 }(engine);
40+
opencover::coVRMSController::instance()->syncData(&m_seed, sizeof(m_seed));
41+
}
42+
else
43+
{
44+
opencover::coVRMSController::instance()->syncData(&m_seed, sizeof(m_seed));
45+
}
46+
}
47+
48+
float generateRandomFloat(unsigned int seed, float start, float end)
49+
{
50+
static std::mt19937 engine { seed };
3351
return std::uniform_real_distribution<float> { start, end }(engine);
3452
}
3553

3654
osg::Vec3 SplotchTerroirTexture::generateRandomSplotch(int textureSlot)
3755
{
38-
float texCoordX = generateRandomFloat(0.1f, 0.9f);
39-
float texCoordY = generateRandomFloat(0.1f, 0.9f);
56+
float texCoordX = generateRandomFloat(m_seed, 0.1f, 0.9f);
57+
float texCoordY = generateRandomFloat(m_seed, 0.1f, 0.9f);
4058

4159
return { texCoordX, texCoordY, 1.0f * textureSlot };
4260
}

src/OpenCOVER/plugins/hlrs/GhostAvatar/texture/SplotchTerroirTexture.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
#include "TerroirTexture.h"
99

10-
class SplotchTerroirTexture: public TerroirTexture
10+
class SplotchTerroirTexture : public TerroirTexture
1111
{
1212
public:
1313
SplotchTerroirTexture(float distanceThreshold);
@@ -18,11 +18,12 @@ class SplotchTerroirTexture: public TerroirTexture
1818
void onEnoughDistanceCovered() override;
1919
void updateShader() override;
2020

21+
unsigned int m_seed { };
22+
void masterGeneratesAndSharesSeed();
2123
osg::Vec3 generateRandomSplotch(int textureSlot);
2224

2325
void updateShaderUniforms();
2426
void updateSplotchPositions(const osg::Vec3 &splotch);
25-
2627
};
2728

2829
#endif // COVER_PLUGIN_GHOSTAVATAR_TEXTURE_SplotchTerroirTexture_H

0 commit comments

Comments
 (0)