Browse Source

handle negative indices

Former-commit-id: 66e73a9cd380164afc50adf18f8addbffcb76130
Alec Jacobson 9 years ago
parent
commit
1eff383476
1 changed files with 25 additions and 13 deletions
  1. 25 13
      include/igl/readOBJ.cpp

+ 25 - 13
include/igl/readOBJ.cpp

@@ -122,6 +122,18 @@ IGL_INLINE bool igl::readOBJ(
         TC.push_back(tex);
         TC.push_back(tex);
       }else if(type == f)
       }else if(type == f)
       {
       {
+        const auto & shift = [&V](const int i)->int
+        {
+          return i<0 ? i+V.size() : i-1;
+        };
+        const auto & shift_t = [&TC](const int i)->int
+        {
+          return i<0 ? i+TC.size() : i-1;
+        };
+        const auto & shift_n = [&N](const int i)->int
+        {
+          return i<0 ? i+N.size() : i-1;
+        };
         std::vector<Index > f;
         std::vector<Index > f;
         std::vector<Index > ftc;
         std::vector<Index > ftc;
         std::vector<Index > fn;
         std::vector<Index > fn;
@@ -133,23 +145,23 @@ IGL_INLINE bool igl::readOBJ(
           // adjust offset
           // adjust offset
           l += offset;
           l += offset;
           // Process word
           // Process word
-          unsigned int i,it,in;
-          if(sscanf(word,"%u/%u/%u",&i,&it,&in) == 3)
+          long int i,it,in;
+          if(sscanf(word,"%ld/%ld/%ld",&i,&it,&in) == 3)
           {
           {
-            f.push_back(i-1);
-            ftc.push_back(it-1);
-            fn.push_back(in-1);
-          }else if(sscanf(word,"%u/%u",&i,&it) == 2)
+            f.push_back(shift(i));
+            ftc.push_back(shift_t(it));
+            fn.push_back(shift_n(in));
+          }else if(sscanf(word,"%ld/%ld",&i,&it) == 2)
           {
           {
-            f.push_back(i-1);
-            ftc.push_back(it-1);
-          }else if(sscanf(word,"%u//%u",&i,&in) == 2)
+            f.push_back(shift(i));
+            ftc.push_back(shift_t(it));
+          }else if(sscanf(word,"%ld//%ld",&i,&in) == 2)
           {
           {
-            f.push_back(i-1);
-            fn.push_back(in-1);
-          }else if(sscanf(word,"%u",&i) == 1)
+            f.push_back(shift(i));
+            fn.push_back(shift_n(in));
+          }else if(sscanf(word,"%ld",&i) == 1)
           {
           {
-            f.push_back(i-1);
+            f.push_back(shift(i));
           }else
           }else
           {
           {
             fprintf(stderr,
             fprintf(stderr,