From b85714b4cf15f51e928d62e043014056e95e0629 Mon Sep 17 00:00:00 2001 From: Syoyo Fujita Date: Fri, 23 Feb 2018 20:25:13 +0900 Subject: [PATCH] Skip parsing incomplete or invalid face definition(e.g. `f` definition only contains 1 or 2 indices). --- models/invalid-face-definition.mtl | 24 ++++++++++++++++++++++++ models/invalid-face-definition.obj | 18 ++++++++++++++++++ tests/tester.cc | 18 ++++++++++++++++++ tiny_obj_loader.h | 5 +++++ 4 files changed, 65 insertions(+) create mode 100644 models/invalid-face-definition.mtl create mode 100644 models/invalid-face-definition.obj diff --git a/models/invalid-face-definition.mtl b/models/invalid-face-definition.mtl new file mode 100644 index 0000000..d3a1c7a --- /dev/null +++ b/models/invalid-face-definition.mtl @@ -0,0 +1,24 @@ +newmtl white +Ka 0 0 0 +Kd 1 1 1 +Ks 0 0 0 + +newmtl red +Ka 0 0 0 +Kd 1 0 0 +Ks 0 0 0 + +newmtl green +Ka 0 0 0 +Kd 0 1 0 +Ks 0 0 0 + +newmtl blue +Ka 0 0 0 +Kd 0 0 1 +Ks 0 0 0 + +newmtl light +Ka 20 20 20 +Kd 1 1 1 +Ks 0 0 0 diff --git a/models/invalid-face-definition.obj b/models/invalid-face-definition.obj new file mode 100644 index 0000000..73ca678 --- /dev/null +++ b/models/invalid-face-definition.obj @@ -0,0 +1,18 @@ +mtllib invalid-face-definition.mtl + +v 0.000000 2.000000 2.000000 +v 0.000000 0.000000 2.000000 +v 2.000000 0.000000 2.000000 +v 2.000000 2.000000 2.000000 +v 0.000000 2.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 2.000000 0.000000 0.000000 +v 2.000000 2.000000 0.000000 +# 8 vertices + +g front cube +usemtl white +f 1 +g back cube +# expects white material +f 8 7 diff --git a/tests/tester.cc b/tests/tester.cc index d5d83c6..e3bc006 100644 --- a/tests/tester.cc +++ b/tests/tester.cc @@ -751,6 +751,24 @@ TEST_CASE("smoothing-group", "[Issue162]") { } +TEST_CASE("invalid-face-definition", "[face]") { + tinyobj::attrib_t attrib; + std::vector shapes; + std::vector materials; + + std::string err; + bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, "../models/invalid-face-definition.obj", gMtlBasePath); + + + if (!err.empty()) { + std::cerr << "[face] " << err << std::endl; + } + + REQUIRE(true == ret); + REQUIRE(1 == shapes.size()); + REQUIRE(0 == shapes[0].mesh.indices.size()); +} + #if 0 int main( diff --git a/tiny_obj_loader.h b/tiny_obj_loader.h index ac1421e..a876842 100644 --- a/tiny_obj_loader.h +++ b/tiny_obj_loader.h @@ -1023,6 +1023,11 @@ static bool exportFaceGroupToShape(shape_t *shape, for (size_t i = 0; i < faceGroup.size(); i++) { const face_t &face = faceGroup[i]; + if (face.vertex_indices.size() < 3) { + // Face must have 3+ vertices. + continue; + } + vertex_index_t i0 = face.vertex_indices[0]; vertex_index_t i1(-1); vertex_index_t i2 = face.vertex_indices[1];