Print vertex IDs when inconsistent face is found.
PiperOrigin-RevId: 493311839 Change-Id: I0283d86bc6092fbe4f47b845fa8ec212bffdfa1a
This commit is contained in:
committed by
Copybara-Service
parent
e4f1d584ad
commit
7f459ab8ca
@@ -114,7 +114,8 @@ mjCMesh::mjCMesh(mjCModel* _model, mjCDef* _def) {
|
|||||||
face = NULL;
|
face = NULL;
|
||||||
graph = NULL;
|
graph = NULL;
|
||||||
needhull = false;
|
needhull = false;
|
||||||
validorientation = true;
|
invalidorientation.first = -1;
|
||||||
|
invalidorientation.second = -1;
|
||||||
validarea = true;
|
validarea = true;
|
||||||
validvolume = true;
|
validvolume = true;
|
||||||
valideigenvalue = true;
|
valideigenvalue = true;
|
||||||
@@ -275,7 +276,8 @@ void mjCMesh::Compile(const mjVFS* vfs) {
|
|||||||
std::sort(useredge.begin(), useredge.end());
|
std::sort(useredge.begin(), useredge.end());
|
||||||
auto iterator = std::adjacent_find(useredge.begin(), useredge.end());
|
auto iterator = std::adjacent_find(useredge.begin(), useredge.end());
|
||||||
if (iterator != useredge.end()) {
|
if (iterator != useredge.end()) {
|
||||||
validorientation = false;
|
invalidorientation.first = iterator->first+1;
|
||||||
|
invalidorientation.second = iterator->second+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1195,8 +1197,11 @@ void mjCMesh::CheckMesh() {
|
|||||||
if (!processed) {
|
if (!processed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!validorientation)
|
if (invalidorientation.first>=0 || invalidorientation.second>=0)
|
||||||
throw mjCError(this, "faces have inconsistent orientation: %s", name.c_str());
|
throw mjCError(this,
|
||||||
|
"faces of mesh '%s' have inconsistent orientation. Please check the "
|
||||||
|
"faces containing the vertices %d and %d.",
|
||||||
|
name.c_str(), invalidorientation.first, invalidorientation.second);
|
||||||
if (!validarea)
|
if (!validarea)
|
||||||
throw mjCError(this, "mesh surface area is too small: %s", name.c_str());
|
throw mjCError(this, "mesh surface area is too small: %s", name.c_str());
|
||||||
if (!validvolume)
|
if (!validvolume)
|
||||||
|
|||||||
@@ -494,12 +494,12 @@ class mjCMesh: public mjCBase {
|
|||||||
void CheckMesh(void); // check if the mesh is valid
|
void CheckMesh(void); // check if the mesh is valid
|
||||||
|
|
||||||
// mesh properties that indicate a well-formed mesh
|
// mesh properties that indicate a well-formed mesh
|
||||||
bool validorientation; // false if mesh have inconsistent faces
|
std::pair<int, int> invalidorientation; // indices of invalid edge; -1 if none
|
||||||
bool validarea; // false if the area is too small
|
bool validarea; // false if the area is too small
|
||||||
bool validvolume; // false if the volume is too small
|
bool validvolume; // false if the volume is too small
|
||||||
bool valideigenvalue; // false if inertia eigenvalue is too small
|
bool valideigenvalue; // false if inertia eigenvalue is too small
|
||||||
bool validinequality; // false if inertia inequality is not satisfied
|
bool validinequality; // false if inertia inequality is not satisfied
|
||||||
bool processed; // false if the mesh has not been processed yet
|
bool processed; // false if the mesh has not been processed yet
|
||||||
|
|
||||||
// mesh properties computed by Compile
|
// mesh properties computed by Compile
|
||||||
double pos_volume[3]; // CoM position
|
double pos_volume[3]; // CoM position
|
||||||
|
|||||||
@@ -222,7 +222,9 @@ TEST_F(MjCMeshTest, MalformedFaceFails) {
|
|||||||
std::array<char, 1024> error;
|
std::array<char, 1024> error;
|
||||||
mjModel* model = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
mjModel* model = mj_loadXML(xml_path.c_str(), 0, error.data(), error.size());
|
||||||
EXPECT_THAT(model, testing::IsNull());
|
EXPECT_THAT(model, testing::IsNull());
|
||||||
EXPECT_THAT(error.data(), HasSubstr("faces have inconsistent orientation"));
|
EXPECT_THAT(error.data(), HasSubstr(
|
||||||
|
"Error: faces of mesh 'malformed_face' have inconsistent orientation. "
|
||||||
|
"Please check the faces containing the vertices 1 and 2."));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(MjCMeshTest, FlippedFaceFails) {
|
TEST_F(MjCMeshTest, FlippedFaceFails) {
|
||||||
@@ -243,7 +245,9 @@ TEST_F(MjCMeshTest, FlippedFaceFails) {
|
|||||||
std::array<char, 1024> error;
|
std::array<char, 1024> error;
|
||||||
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
mjModel* model = LoadModelFromString(xml, error.data(), error.size());
|
||||||
EXPECT_THAT(model, testing::IsNull());
|
EXPECT_THAT(model, testing::IsNull());
|
||||||
EXPECT_THAT(error.data(), HasSubstr("faces have inconsistent orientation"));
|
EXPECT_THAT(error.data(), HasSubstr(
|
||||||
|
"Error: faces of mesh 'example_mesh' have inconsistent orientation. "
|
||||||
|
"Please check the faces containing the vertices 1 and 2."));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckTetrahedronWasRescaled(mjModel* model) {
|
void CheckTetrahedronWasRescaled(mjModel* model) {
|
||||||
|
|||||||
Reference in New Issue
Block a user