From 6f97f42458bcd56b70d111c357d3933c0d9dcd4a Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Tue, 30 Apr 2024 08:11:30 -0700 Subject: [PATCH] Geoms of type mesh with zero density don't trigger the check for valid mesh volume. PiperOrigin-RevId: 629416817 Change-Id: I23eaa0d61a703988a4eb96a3cad09e562384035e --- src/user/user_objects.cc | 15 ++++++++++++--- test/user/user_objects_test.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index a4bf8b61..35db7cbd 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -2344,6 +2344,7 @@ void mjCGeom::Compile(void) { // compute geom mass and inertia if (inferinertia) { + // mass is defined if (mjuu_defined(mass)) { if (mass==0) { mass_ = 0; @@ -2353,11 +2354,19 @@ void mjCGeom::Compile(void) { density = mass / GetVolume(); SetInertia(); } - } else { - mass_ = density * GetVolume(); - SetInertia(); } + // mass is not defined + else { + if (density == 0) { + mass_ = 0; + } else { + mass_ = density * GetVolume(); + SetInertia(); + } + } + + // check for negative values if (mass_<0 || inertia[0]<0 || inertia[1]<0 || inertia[2]<0 || density<0) throw mjCError(this, "mass, inertia or density are negative in geom"); diff --git a/test/user/user_objects_test.cc b/test/user/user_objects_test.cc index 4e1a7ea1..5441ea9f 100644 --- a/test/user/user_objects_test.cc +++ b/test/user/user_objects_test.cc @@ -755,6 +755,32 @@ TEST_F(MjCGeomTest, NanSize) { EXPECT_THAT(error.data(), HasSubstr("line 5")); } +TEST_F(MjCGeomTest, BadMeshZeroMassDensityDoesntError) { + static constexpr char xml[] = R"( + + + + + + + + + + + + + + )"; + std::array error; + mjModel* model = LoadModelFromString(xml, error.data(), error.size()); + ASSERT_THAT(model, NotNull()) << error.data(); + EXPECT_EQ(model->body_mass[1], 0); + EXPECT_EQ(model->body_mass[2], 0); + mj_deleteModel(model); +} + // ------------- test height fields -------------------------------------------- using MjCHFieldTest = MujocoTest;