diff --git a/src/rendering/SceneManager.cc b/src/rendering/SceneManager.cc index 763f21b59f..06219d9387 100644 --- a/src/rendering/SceneManager.cc +++ b/src/rendering/SceneManager.cc @@ -1128,6 +1128,24 @@ rendering::ParticleEmitterPtr SceneManager::UpdateParticleEmitter(Entity _id, if (_emitter.has_pose()) emitter->SetLocalPose(msgs::Convert(_emitter.pose())); + // particle scatter ratio + if (_emitter.has_header()) + { + for (int i = 0; i < _emitter.header().data_size(); ++i) + { + const auto &data = _emitter.header().data(i); + const std::string key = "particle_scatter_ratio"; + if (data.key() == "particle_scatter_ratio" && data.value_size() > 0) + { + // \todo(anyone) switch to use the follow API when merging forward to + // edifice + // emitter->SetParticleScatterRatio(math::parseFloat(data.value(0))); + emitter->SetUserData(key, math::parseFloat(data.value(0))); + break; + } + } + } + return emitter; } diff --git a/src/systems/particle_emitter/ParticleEmitter.cc b/src/systems/particle_emitter/ParticleEmitter.cc index 6c2de2a435..db1aa6b924 100644 --- a/src/systems/particle_emitter/ParticleEmitter.cc +++ b/src/systems/particle_emitter/ParticleEmitter.cc @@ -258,6 +258,17 @@ void ParticleEmitter::Configure(const Entity &_entity, absolutePath); } + // particle scatter ratio + const std::string scatterRatioKey = "particle_scatter_ratio"; + if (_sdf->HasElement(scatterRatioKey)) + { + // todo(anyone) add particle_scatter_ratio field in next release of ign-msgs + auto data = this->dataPtr->emitter.mutable_header()->add_data(); + data->set_key(scatterRatioKey); + std::string *value = data->add_value(); + *value = _sdf->Get(scatterRatioKey); + } + igndbg << "Loading particle emitter:" << std::endl << this->dataPtr->emitter.DebugString() << std::endl; diff --git a/test/integration/particle_emitter.cc b/test/integration/particle_emitter.cc index c7ef738175..b5f4b091be 100644 --- a/test/integration/particle_emitter.cc +++ b/test/integration/particle_emitter.cc @@ -120,6 +120,24 @@ TEST_F(ParticleEmitterTest, SDFLoad) // and let rendering do the findFile instead EXPECT_EQ(std::string(), _emitter->Data().color_range_image().data()); + + // particle scatter ratio is temporarily stored in header + bool hasParticleScatterRatio = false; + for (int i = 0; i < _emitter->Data().header().data_size(); ++i) + { + for (int j = 0; + j < _emitter->Data().header().data(i).value_size(); ++j) + { + if (_emitter->Data().header().data(i).key() == + "particle_scatter_ratio") + { + EXPECT_DOUBLE_EQ(0.01, math::parseFloat( + _emitter->Data().header().data(i).value(0))); + hasParticleScatterRatio = true; + } + } + } + EXPECT_TRUE(hasParticleScatterRatio); } else { diff --git a/test/worlds/particle_emitter.sdf b/test/worlds/particle_emitter.sdf index 1da40a4919..12912e5f5b 100644 --- a/test/worlds/particle_emitter.sdf +++ b/test/worlds/particle_emitter.sdf @@ -121,6 +121,7 @@ 0 1 0 10 /path/to/dummy_image.png + 0.01