diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 2cb2b592..193b77ef 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -494,6 +494,10 @@ void mjCModel::RemoveFromList(std::vector& list, const mjCModel& other) { removed++; } } + if (removed > 0 && !list.empty()) { + // if any elements were removed, update ids using processlist + processlist(ids, list, list[0]->elemtype, /*checkrepeat=*/false); + } } diff --git a/test/xml/xml_native_reader_test.cc b/test/xml/xml_native_reader_test.cc index 9ce70cd4..06e7b30a 100644 --- a/test/xml/xml_native_reader_test.cc +++ b/test/xml/xml_native_reader_test.cc @@ -1441,7 +1441,7 @@ TEST_F(XMLReaderTest, ParseReplicateRepeatedName) { EXPECT_THAT(error.data(), HasSubstr("Element 'replicate'")); } -TEST_F(XMLReaderTest, ParseReplicateTendon) { +TEST_F(XMLReaderTest, ParseReplicateExcludeTendon) { static constexpr char xml[] = R"( @@ -1505,6 +1505,70 @@ TEST_F(XMLReaderTest, ParseReplicateTendon) { mj_deleteSpec(spec); } +TEST_F(XMLReaderTest, ParseReplicateWithTendon) { + static constexpr char xml[] = R"( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )"; + std::array error; + mjSpec* spec = mj_parseXMLString(xml, 0, error.data(), error.size()); + EXPECT_THAT(spec, NotNull()) << error.data(); + mjModel* m = mj_compile(spec, 0); + EXPECT_THAT(m, NotNull()) << mjs_getError(spec); + EXPECT_THAT(m->nbody, 25); + EXPECT_THAT(m->ngeom, 24); + EXPECT_THAT(m->nsite, 48); + EXPECT_THAT(m->nu, 16); + EXPECT_THAT(m->ntendon, 8); + mj_deleteModel(m); + mj_deleteSpec(spec); +} + // ---------------------- test spec assets parsing ----------------------------- TEST_F(XMLReaderTest, ParseSpecAssets) {