From 8941f56e86c6977425791159fce096990d817c7e Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 3 Apr 2025 06:28:05 -0700 Subject: [PATCH] Copy UIDs during mj_copySpec. This will produce the same mjSpec signature after a deep copy. PiperOrigin-RevId: 743538018 Change-Id: Ic0f5b06a00e8883cb92dc98159db3bea02cb7a36 --- src/user/user_model.cc | 2 +- src/user/user_objects.cc | 6 +++--- test/user/user_api_test.cc | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 402f738b..e5650c17 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -297,7 +297,7 @@ void mjCModel::CopyList(std::vector& dest, // copy the element from the other model to this model if (deepcopy_) { source[i]->ForgetKeyframes(); - candidate->uid = GetUid(); + candidate->uid = source[i]->uid; } else { candidate->AddRef(); } diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index d46c51df..631bb2f8 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -840,7 +840,7 @@ mjCBody::mjCBody(mjCModel* _model) { mjCBody::mjCBody(const mjCBody& other, mjCModel* _model) { model = _model; - uid = model->GetUid(); + uid = other.uid; mjSpec* origin = model->FindSpec(other.compiler); compiler = origin ? &origin->compiler : &model->spec.compiler; *this = other; @@ -944,7 +944,7 @@ mjCBody& mjCBody::operator+=(const mjCFrame& other) { frames.back()->frame = other.frame; if (model->deepcopy_) { frames.back()->NameSpace(other_model); - frames.back()->uid = model->GetUid(); + frames.back()->uid = other.uid; } else { frames.back()->AddRef(); } @@ -1038,7 +1038,7 @@ void mjCBody::CopyList(std::vector& dst, const std::vector& src, if (!model->deepcopy_) { dst.back()->AddRef(); } else { - dst.back()->uid = model->GetUid(); + dst.back()->uid = src[i]->uid; } // set namespace diff --git a/test/user/user_api_test.cc b/test/user/user_api_test.cc index c9bc6bd1..ddde4679 100644 --- a/test/user/user_api_test.cc +++ b/test/user/user_api_test.cc @@ -538,6 +538,9 @@ TEST_F(PluginTest, RecompileCompare) { // copy spec mjSpec* s_copy = mj_copySpec(s); + // compare signature + EXPECT_EQ(s->element->signature, s_copy->element->signature) << xml; + // compile twice and compare mjModel* m_old = mj_compile(s, nullptr);