diff --git a/src/user/user_api.cc b/src/user/user_api.cc index ba5890fe..83b1ae5e 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -91,13 +91,16 @@ mjModel* mj_compile(mjSpec* s, const mjVFS* vfs) { // recompile spec into existing model and data while preserving the state void mj_recompile(mjSpec* s, const mjVFS* vfs, mjModel* m, mjData* d) { mjCModel* modelC = static_cast(s->element); + mjtNum time = 0; if (d) { + time = d->time; modelC->SaveState(d->qpos, d->qvel, d->act); } modelC->Compile(vfs, &m); if (d) { modelC->MakeData(m, &d); modelC->RestoreState(d->qpos, d->qvel, d->act); + d->time = time; } } diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc index 39f224f6..e51d0935 100644 --- a/test/user/user_api_test.cc +++ b/test/user/user_api_test.cc @@ -851,6 +851,7 @@ TEST_F(MujocoTest, PreserveState) { // step models mj_step(model, data); mj_step(m_expected, d_expected); + EXPECT_THAT(data->time, model->opt.timestep); // detach subtree mjsBody* body = mjs_findBody(spec, "detachable"); @@ -877,6 +878,7 @@ TEST_F(MujocoTest, PreserveState) { // compile new model mj_recompile(spec, 0, model, data); EXPECT_THAT(model, NotNull()); + EXPECT_THAT(data->time, model->opt.timestep); // compare qpos EXPECT_EQ(model->nq, m_expected->nq);