diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 420546a0..f0e7e803 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -462,11 +462,8 @@ mjCModel& mjCModel::operator-=(const mjCBody& subtree) { ProcessLists(/*checkrepeat=*/false); } - // TODO: carry over pending keyframes - key_pending_.clear(); - StoreKeyframes(); - // all keyframes are now pending and they will be resized + StoreKeyframes(); DeleteAll(keys_); // remove body from tree diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc index 98898913..2679a926 100644 --- a/test/user/user_api_test.cc +++ b/test/user/user_api_test.cc @@ -1456,10 +1456,12 @@ TEST_F(MujocoTest, ReplicateKeyframe) { EXPECT_THAT(m->nbody, 2); // check that the keyframe is resized - EXPECT_THAT(m->nkey, 1); + EXPECT_THAT(m->nkey, 2); EXPECT_THAT(m->nq, 1); - EXPECT_THAT(m->key_qpos[0], 0); - EXPECT_STREQ(mj_id2name(m, mjOBJ_KEY, 0), "keyframe"); + EXPECT_THAT(m->key_qpos[0], 1); + EXPECT_THAT(m->key_qpos[1], 0); + EXPECT_STREQ(mj_id2name(m, mjOBJ_KEY, 0), "keyframe0"); + EXPECT_STREQ(mj_id2name(m, mjOBJ_KEY, 1), "keyframe"); mj_deleteModel(m); } diff --git a/test/xml/xml_native_reader_test.cc b/test/xml/xml_native_reader_test.cc index 505659f9..4d53d4e6 100644 --- a/test/xml/xml_native_reader_test.cc +++ b/test/xml/xml_native_reader_test.cc @@ -1304,9 +1304,14 @@ TEST_F(XMLReaderTest, ParseReplicate) { EXPECT_EQ(m->body_quat[4*n+2], 0); EXPECT_EQ(m->body_quat[4*n+3], 1); - // check that the pending keyframes are lost while detaching - EXPECT_THAT(m->nkey, 0); + // check that the keyframe is resized + EXPECT_THAT(m->nkey, 102); EXPECT_THAT(m->nq, 101); + for (int i = 0; i < m->nkey; i++) { + for (int j = 0; j < m->nq; j++) { + EXPECT_THAT(m->key_qpos[i*m->nq+j], i == j ? 1 : 0) << i << " " << j; + } + } mj_deleteModel(m); }