Write mesh inertia to defaults when exporting to xml. Fixes #2478
PiperOrigin-RevId: 735338748 Change-Id: Id0b71d06c77baef417f7968ae8a14154243a1f83
This commit is contained in:
committed by
Copybara-Service
parent
adc3cc06fa
commit
e7a715497e
@@ -220,9 +220,6 @@ void mjXWriter::OneMesh(XMLElement* elem, const mjCMesh* mesh, mjCDef* def) {
|
|||||||
}
|
}
|
||||||
WriteAttrTxt(elem, "content_type", mesh->ContentType());
|
WriteAttrTxt(elem, "content_type", mesh->ContentType());
|
||||||
WriteAttrTxt(elem, "file", mesh->File());
|
WriteAttrTxt(elem, "file", mesh->File());
|
||||||
if (mesh->Inertia() != def->Mesh().Inertia()) {
|
|
||||||
WriteAttrTxt(elem, "inertia", FindValue(meshinertia_map, 4, mesh->Inertia()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// write vertex data
|
// write vertex data
|
||||||
if (!mesh->UserVert().empty()) {
|
if (!mesh->UserVert().empty()) {
|
||||||
@@ -250,6 +247,9 @@ void mjXWriter::OneMesh(XMLElement* elem, const mjCMesh* mesh, mjCDef* def) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// defaults and regular
|
// defaults and regular
|
||||||
|
if (mesh->Inertia() != def->Mesh().Inertia()) {
|
||||||
|
WriteAttrTxt(elem, "inertia", FindValue(meshinertia_map, 4, mesh->Inertia()));
|
||||||
|
}
|
||||||
WriteAttr(elem, "refpos", 3, mesh->Refpos(), def->Mesh().Refpos());
|
WriteAttr(elem, "refpos", 3, mesh->Refpos(), def->Mesh().Refpos());
|
||||||
WriteAttr(elem, "refquat", 4, mesh->Refquat(), def->Mesh().Refquat());
|
WriteAttr(elem, "refquat", 4, mesh->Refquat(), def->Mesh().Refquat());
|
||||||
WriteAttr(elem, "scale", 3, mesh->Scale(), def->Mesh().Scale());
|
WriteAttr(elem, "scale", 3, mesh->Scale(), def->Mesh().Scale());
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace {
|
|||||||
using ::testing::IsNull;
|
using ::testing::IsNull;
|
||||||
using ::testing::NotNull;
|
using ::testing::NotNull;
|
||||||
using ::testing::StartsWith;
|
using ::testing::StartsWith;
|
||||||
|
using ::testing::HasSubstr;
|
||||||
|
|
||||||
static constexpr char xml[] = R"(
|
static constexpr char xml[] = R"(
|
||||||
<mujoco>
|
<mujoco>
|
||||||
@@ -151,11 +152,46 @@ TEST_F(MujocoTest, SaveXml) {
|
|||||||
mjModel* saved_model = mj_compile(saved_spec, 0);
|
mjModel* saved_model = mj_compile(saved_spec, 0);
|
||||||
EXPECT_THAT(saved_model, NotNull()) << "Invalid model: " << error.data();
|
EXPECT_THAT(saved_model, NotNull()) << "Invalid model: " << error.data();
|
||||||
|
|
||||||
mjtNum tol = 0;
|
mj_deleteSpec(spec);
|
||||||
std::string field = "";
|
mj_deleteSpec(saved_spec);
|
||||||
EXPECT_LE(CompareModel(model, saved_model, field), tol)
|
mj_deleteModel(model);
|
||||||
<< "Expected and attached models are different!\n"
|
mj_deleteModel(saved_model);
|
||||||
<< "Different field: " << field << '\n';
|
}
|
||||||
|
|
||||||
|
TEST_F(MujocoTest, SaveXmlWithDefaultMesh) {
|
||||||
|
static constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<default>
|
||||||
|
<mesh inertia="shell"/>
|
||||||
|
</default>
|
||||||
|
<asset>
|
||||||
|
<mesh name="test_mesh" vertex="0 0 0 1 0 0 0 1 0 0 0 1"/>
|
||||||
|
</asset>
|
||||||
|
<worldbody>
|
||||||
|
<body>
|
||||||
|
<geom mesh="test_mesh" type="mesh"/>
|
||||||
|
</body>
|
||||||
|
</worldbody>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
|
||||||
|
std::array<char, 1024> error;
|
||||||
|
mjSpec* spec = mj_parseXMLString(xml, 0, error.data(), error.size());
|
||||||
|
EXPECT_THAT(spec, NotNull()) << "Failed to parse spec: " << error.data();
|
||||||
|
mjModel* model = mj_compile(spec, 0);
|
||||||
|
EXPECT_THAT(model, NotNull()) << "Failed to compile model: " << error.data();
|
||||||
|
|
||||||
|
std::array<char, 1024> out;
|
||||||
|
EXPECT_THAT(mj_saveXMLString(spec, out.data(), out.size(), error.data(),
|
||||||
|
error.size()), 0) << error.data();
|
||||||
|
|
||||||
|
mjSpec* saved_spec = mj_parseXMLString(xml, 0, error.data(), error.size());
|
||||||
|
EXPECT_THAT(saved_spec, NotNull()) << "Invalid saved spec: " << error.data();
|
||||||
|
mjModel* saved_model = mj_compile(saved_spec, 0);
|
||||||
|
EXPECT_THAT(saved_model, NotNull()) << "Invalid model: " << error.data();
|
||||||
|
|
||||||
|
// check that the mesh has inertia="shell"
|
||||||
|
EXPECT_THAT(out.data(), HasSubstr(R"(<mesh inertia="shell"/>)"));
|
||||||
|
|
||||||
mj_deleteSpec(spec);
|
mj_deleteSpec(spec);
|
||||||
mj_deleteSpec(saved_spec);
|
mj_deleteSpec(saved_spec);
|
||||||
|
|||||||
Reference in New Issue
Block a user