Prevent duplicated pairs in active_pugins vector.
Fixes #2150 PiperOrigin-RevId: 688164615 Change-Id: I9a5434a9dda28a399ffccfe0c4b31fa64400b85f
This commit is contained in:
committed by
Copybara-Service
parent
90bc4b555d
commit
a70aea918c
+21
-2
@@ -304,6 +304,8 @@ void mjCModel::SaveDofOffsets(bool computesize) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void mjCModel::CopyPlugin(std::vector<mjCPlugin*>& dest,
|
void mjCModel::CopyPlugin(std::vector<mjCPlugin*>& dest,
|
||||||
const std::vector<mjCPlugin*>& source,
|
const std::vector<mjCPlugin*>& source,
|
||||||
@@ -336,6 +338,21 @@ void mjCModel::CopyPlugin(std::vector<mjCPlugin*>& dest,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// return true if the plugin is already in the list of active plugins
|
||||||
|
static bool IsPluginActive(
|
||||||
|
const mjpPlugin* plugin,
|
||||||
|
const std::vector<std::pair<const mjpPlugin*, int>>& active_plugins) {
|
||||||
|
return std::find_if(
|
||||||
|
active_plugins.begin(), active_plugins.end(),
|
||||||
|
[&plugin](const std::pair<const mjpPlugin*, int>& element) {
|
||||||
|
return element.first == plugin;
|
||||||
|
}) != active_plugins.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mjCModel& mjCModel::operator+=(const mjCModel& other) {
|
mjCModel& mjCModel::operator+=(const mjCModel& other) {
|
||||||
// TODO: use compiler settings stored in specs_ during compilation
|
// TODO: use compiler settings stored in specs_ during compilation
|
||||||
std::string msg = "cannot attach mjSpecs with incompatible compiler/";
|
std::string msg = "cannot attach mjSpecs with incompatible compiler/";
|
||||||
@@ -387,8 +404,10 @@ mjCModel& mjCModel::operator+=(const mjCModel& other) {
|
|||||||
CopyPlugin(plugins_, other.plugins_, meshes_);
|
CopyPlugin(plugins_, other.plugins_, meshes_);
|
||||||
CopyPlugin(plugins_, other.plugins_, actuators_);
|
CopyPlugin(plugins_, other.plugins_, actuators_);
|
||||||
CopyPlugin(plugins_, other.plugins_, sensors_);
|
CopyPlugin(plugins_, other.plugins_, sensors_);
|
||||||
for (const auto& active_plugin : other.active_plugins_) {
|
for (const auto& [plugin, slot] : other.active_plugins_) {
|
||||||
active_plugins_.emplace_back(active_plugin);
|
if (!IsPluginActive(plugin, active_plugins_)) {
|
||||||
|
active_plugins_.emplace_back(std::make_pair(plugin, slot));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore to the original state
|
// restore to the original state
|
||||||
|
|||||||
@@ -293,6 +293,39 @@ TEST_F(PluginTest, AttachPlugin) {
|
|||||||
mj_deleteSpec(spec_2);
|
mj_deleteSpec(spec_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PluginTest, ReplicatePlugin) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<extension>
|
||||||
|
<plugin plugin="mujoco.sdf.torus">
|
||||||
|
<instance name="torus" />
|
||||||
|
</plugin>
|
||||||
|
</extension>
|
||||||
|
<asset>
|
||||||
|
<mesh name="torus">
|
||||||
|
<plugin instance="torus" />
|
||||||
|
</mesh>
|
||||||
|
</asset>
|
||||||
|
<worldbody>
|
||||||
|
<geom type="sdf" mesh="torus">
|
||||||
|
<plugin instance="torus" />
|
||||||
|
</geom>
|
||||||
|
<replicate count="100">
|
||||||
|
<body />
|
||||||
|
</replicate>
|
||||||
|
</worldbody>
|
||||||
|
</mujoco>)";
|
||||||
|
|
||||||
|
std::array<char, 1000> err;
|
||||||
|
mjSpec* spec = mj_parseXMLString(xml, 0, err.data(), err.size());
|
||||||
|
ASSERT_THAT(spec, NotNull()) << err.data();
|
||||||
|
mjModel* model = mj_compile(spec, nullptr);
|
||||||
|
EXPECT_THAT(model, NotNull());
|
||||||
|
EXPECT_THAT(model->nplugin, 1);
|
||||||
|
mj_deleteSpec(spec);
|
||||||
|
mj_deleteModel(model);
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(MujocoTest, RecompileFails) {
|
TEST_F(MujocoTest, RecompileFails) {
|
||||||
mjSpec* spec = mj_makeSpec();
|
mjSpec* spec = mj_makeSpec();
|
||||||
mjsBody* body = mjs_addBody(mjs_findBody(spec, "world"), 0);
|
mjsBody* body = mjs_addBody(mjs_findBody(spec, "world"), 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user