From 8e300eb62863228dfcecc25c62322fb78076fe7a Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 13 Mar 2025 03:55:06 -0700 Subject: [PATCH] Update list ids immediately during body detach. Fixes #2499. PiperOrigin-RevId: 736449320 Change-Id: Ieeae52bdbbbb896d886221ab088229c8287a32a3 --- src/user/user_model.cc | 4 ++ test/xml/xml_native_reader_test.cc | 66 +++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) 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) {