Copybara import of the project:

--
a5221e754c88580d103bfc7bfaf1ed32927ca499 by omar rayyan <olr7742@nyu.edu>:

Fix .mjz loading in simulate

COPYBARA_INTEGRATE_REVIEW=https://github.com/google-deepmind/mujoco/pull/3384 from omarrayyann:fix-mjz-simulate a5221e754c88580d103bfc7bfaf1ed32927ca499
PiperOrigin-RevId: 944573851
Change-Id: Ifba77ee9f9b97a7d8c0b0a47ac82d390a273672b
This commit is contained in:
Omar Rayyan
2026-07-08 10:30:15 -07:00
committed by Copybara-Service
parent 18147c50c8
commit 040872fd65
3 changed files with 22 additions and 6 deletions
+3
View File
@@ -17,6 +17,9 @@ General
- The :el:`attach` element now supports self-attachment (attaching elements of the current model to itself) by omitting
the :at:`model` attribute. It also supports attaching a frame via the new :at:`frame` attribute, which is mutually
exclusive with :at:`body`.
- Fixed loading of ``.mjz`` archives in :ref:`simulate<saSimulate>`: the archive was unmounted before model compilation,
so assets contained in it failed to load. Failures in the ``mjz`` decoder now emit a warning with the underlying
error instead of the generic "could not decode content" message.
.. admonition:: Breaking API changes
:class: attention
+11 -3
View File
@@ -241,13 +241,21 @@ mjModel* LoadModel(const char* file, mj::Simulate& sim) {
} else if (extension == ".xml") {
mnew = mj_loadXML(filename, nullptr, loadError, kErrorLength);
} else {
mjSpec* spec = mj_parse(filename, nullptr, nullptr, loadError, kErrorLength);
mjVFS vfs;
mj_defaultVFS(&vfs);
mjSpec* spec = mj_parse(filename, nullptr, &vfs, loadError, kErrorLength);
if (!spec) {
mju::strcpy_arr(loadError, "could not parse model");
if (!loadError[0]) {
mju::strcpy_arr(loadError, "could not parse model");
}
} else {
mnew = mj_compile(spec, nullptr);
mnew = mj_compile(spec, &vfs);
if (!mnew) {
mju::strcpy_arr(loadError, mjs_getError(spec));
}
mj_deleteSpec(spec);
}
mj_deleteVFS(&vfs);
}
// remove trailing newline character from loadError
+8 -3
View File
@@ -233,9 +233,14 @@ mjPLUGIN_LIB_INIT(mjz_decoder) {
if (size <= 0) {
return nullptr;
}
char error[1024];
return ParseZipBuffer(buffer, size, resource->name, const_cast<mjVFS*>(vfs),
error, sizeof(error));
char error[1024] = "";
mjSpec* spec = ParseZipBuffer(buffer, size, resource->name,
const_cast<mjVFS*>(vfs), error,
sizeof(error));
if (!spec && error[0]) {
mju_warning("%s", error);
}
return spec;
};
mjp_registerDecoder(&decoder);
}