nbonneel

Simple obj file reader

Feb 12th, 2019
706
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.47 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <algorithm>
  5. #include <vector>
  6.  
  7. class TriangleIndices {
  8. public:
  9.     TriangleIndices(int vtxi = -1, int vtxj = -1, int vtxk = -1, int ni = -1, int nj = -1, int nk = -1, int uvi = -1, int uvj = -1, int uvk = -1, int group = -1, bool added = false) : vtxi(vtxi), vtxj(vtxj), vtxk(vtxk), uvi(uvi), uvj(uvj), uvk(uvk), ni(ni), nj(nj), nk(nk), group(group) {
  10.     };
  11.     int vtxi, vtxj, vtxk; // indices within the vertex coordinates array
  12.     int uvi, uvj, uvk;  // indices within the uv coordinates array
  13.     int ni, nj, nk;  // indices within the normals array
  14.     int group;       // face group
  15. };
  16.  
  17.  
  18. class TriangleMesh {
  19. public:
  20.   ~TriangleMesh() {}
  21.     TriangleMesh() {};
  22.    
  23.     void readOBJ(const char* obj) {
  24.  
  25.         char matfile[255];
  26.         char grp[255];
  27.  
  28.         FILE* f;
  29.         f = fopen(obj, "r");
  30.         int curGroup = -1;
  31.         while (!feof(f)) {
  32.             char line[255];
  33.             if (!fgets(line, 255, f)) break;
  34.  
  35.             std::string linetrim(line);
  36.             linetrim.erase(linetrim.find_last_not_of(" \r\t") + 1);
  37.             strcpy(line, linetrim.c_str());
  38.  
  39.             if (line[0] == 'u' && line[1] == 's') {
  40.                 sscanf(line, "usemtl %[^\n]\n", grp);
  41.                 curGroup++;
  42.             }
  43.  
  44.             if (line[0] == 'v' && line[1] == ' ') {
  45.                 Vector vec;
  46.  
  47.                 Vector col;
  48.                 if (sscanf(line, "v %lf %lf %lf %lf %lf %lf\n", &vec[0], &vec[1], &vec[2], &col[0], &col[1], &col[2]) == 6) {
  49.                     col[0] = std::min(1., std::max(0., col[0]));
  50.                     col[1] = std::min(1., std::max(0., col[1]));
  51.                     col[2] = std::min(1., std::max(0., col[2]));
  52.  
  53.                     vertices.push_back(vec);
  54.                     vertexcolors.push_back(col);
  55.  
  56.                 } else {
  57.                     sscanf(line, "v %lf %lf %lf\n", &vec[0], &vec[1], &vec[2]);
  58.                     vertices.push_back(vec);
  59.                 }
  60.             }
  61.             if (line[0] == 'v' && line[1] == 'n') {
  62.                 Vector vec;
  63.                 sscanf(line, "vn %lf %lf %lf\n", &vec[0], &vec[1], &vec[2]);
  64.                 normals.push_back(vec);
  65.             }
  66.             if (line[0] == 'v' && line[1] == 't') {
  67.                 Vector vec;
  68.                 sscanf(line, "vt %lf %lf\n", &vec[0], &vec[1]);
  69.                 uvs.push_back(vec);
  70.             }
  71.             if (line[0] == 'f') {
  72.                 TriangleIndices t;
  73.                 int i0, i1, i2, i3;
  74.                 int j0, j1, j2, j3;
  75.                 int k0, k1, k2, k3;
  76.                 int nn;
  77.                 t.group = curGroup;
  78.  
  79.                 char* consumedline = line + 1;
  80.                 int offset;
  81.  
  82.                 nn = sscanf(consumedline, "%u/%u/%u %u/%u/%u %u/%u/%u%n", &i0, &j0, &k0, &i1, &j1, &k1, &i2, &j2, &k2, &offset);
  83.                 if (nn == 9) {
  84.                     if (i0 < 0) t.vtxi = vertices.size() + i0; else t.vtxi = i0 - 1;
  85.                     if (i1 < 0) t.vtxj = vertices.size() + i1; else t.vtxj = i1 - 1;
  86.                     if (i2 < 0) t.vtxk = vertices.size() + i2; else t.vtxk = i2 - 1;
  87.                     if (j0 < 0) t.uvi = uvs.size() + j0; else   t.uvi = j0 - 1;
  88.                     if (j1 < 0) t.uvj = uvs.size() + j1; else   t.uvj = j1 - 1;
  89.                     if (j2 < 0) t.uvk = uvs.size() + j2; else   t.uvk = j2 - 1;
  90.                     if (k0 < 0) t.ni = normals.size() + k0; else    t.ni = k0 - 1;
  91.                     if (k1 < 0) t.nj = normals.size() + k1; else    t.nj = k1 - 1;
  92.                     if (k2 < 0) t.nk = normals.size() + k2; else    t.nk = k2 - 1;
  93.                     indices.push_back(t);
  94.                 } else {
  95.                     nn = sscanf(consumedline, "%u/%u %u/%u %u/%u%n", &i0, &j0, &i1, &j1, &i2, &j2, &offset);
  96.                     if (nn == 6) {
  97.                         if (i0 < 0) t.vtxi = vertices.size() + i0; else t.vtxi = i0 - 1;
  98.                         if (i1 < 0) t.vtxj = vertices.size() + i1; else t.vtxj = i1 - 1;
  99.                         if (i2 < 0) t.vtxk = vertices.size() + i2; else t.vtxk = i2 - 1;
  100.                         if (j0 < 0) t.uvi = uvs.size() + j0; else   t.uvi = j0 - 1;
  101.                         if (j1 < 0) t.uvj = uvs.size() + j1; else   t.uvj = j1 - 1;
  102.                         if (j2 < 0) t.uvk = uvs.size() + j2; else   t.uvk = j2 - 1;
  103.                         indices.push_back(t);
  104.                     } else {
  105.                         nn = sscanf(consumedline, "%u %u %u%n", &i0, &i1, &i2, &offset);
  106.                         if (nn == 3) {
  107.                             if (i0 < 0) t.vtxi = vertices.size() + i0; else t.vtxi = i0 - 1;
  108.                             if (i1 < 0) t.vtxj = vertices.size() + i1; else t.vtxj = i1 - 1;
  109.                             if (i2 < 0) t.vtxk = vertices.size() + i2; else t.vtxk = i2 - 1;
  110.                             indices.push_back(t);
  111.                         } else {
  112.                             nn = sscanf(consumedline, "%u//%u %u//%u %u//%u%n", &i0, &k0, &i1, &k1, &i2, &k2, &offset);
  113.                             if (i0 < 0) t.vtxi = vertices.size() + i0; else t.vtxi = i0 - 1;
  114.                             if (i1 < 0) t.vtxj = vertices.size() + i1; else t.vtxj = i1 - 1;
  115.                             if (i2 < 0) t.vtxk = vertices.size() + i2; else t.vtxk = i2 - 1;
  116.                             if (k0 < 0) t.ni = normals.size() + k0; else    t.ni = k0 - 1;
  117.                             if (k1 < 0) t.nj = normals.size() + k1; else    t.nj = k1 - 1;
  118.                             if (k2 < 0) t.nk = normals.size() + k2; else    t.nk = k2 - 1;
  119.                             indices.push_back(t);
  120.                         }
  121.                     }
  122.                 }
  123.  
  124.                 consumedline = consumedline + offset;
  125.  
  126.                 while (true) {
  127.                     if (consumedline[0] == '\n') break;
  128.                     if (consumedline[0] == '\0') break;
  129.                     nn = sscanf(consumedline, "%u/%u/%u%n", &i3, &j3, &k3, &offset);
  130.                     TriangleIndices t2;
  131.                     t2.group = curGroup;
  132.                     if (nn == 3) {
  133.                         if (i0 < 0) t2.vtxi = vertices.size() + i0; else    t2.vtxi = i0 - 1;
  134.                         if (i2 < 0) t2.vtxj = vertices.size() + i2; else    t2.vtxj = i2 - 1;
  135.                         if (i3 < 0) t2.vtxk = vertices.size() + i3; else    t2.vtxk = i3 - 1;
  136.                         if (j0 < 0) t2.uvi = uvs.size() + j0; else  t2.uvi = j0 - 1;
  137.                         if (j2 < 0) t2.uvj = uvs.size() + j2; else  t2.uvj = j2 - 1;
  138.                         if (j3 < 0) t2.uvk = uvs.size() + j3; else  t2.uvk = j3 - 1;
  139.                         if (k0 < 0) t2.ni = normals.size() + k0; else   t2.ni = k0 - 1;
  140.                         if (k2 < 0) t2.nj = normals.size() + k2; else   t2.nj = k2 - 1;
  141.                         if (k3 < 0) t2.nk = normals.size() + k3; else   t2.nk = k3 - 1;
  142.                         indices.push_back(t2);
  143.                         consumedline = consumedline + offset;
  144.                         i2 = i3;
  145.                         j2 = j3;
  146.                         k2 = k3;
  147.                     } else {
  148.                         nn = sscanf(consumedline, "%u/%u%n", &i3, &j3, &offset);
  149.                         if (nn == 2) {
  150.                             if (i0 < 0) t2.vtxi = vertices.size() + i0; else    t2.vtxi = i0 - 1;
  151.                             if (i2 < 0) t2.vtxj = vertices.size() + i2; else    t2.vtxj = i2 - 1;
  152.                             if (i3 < 0) t2.vtxk = vertices.size() + i3; else    t2.vtxk = i3 - 1;
  153.                             if (j0 < 0) t2.uvi = uvs.size() + j0; else  t2.uvi = j0 - 1;
  154.                             if (j2 < 0) t2.uvj = uvs.size() + j2; else  t2.uvj = j2 - 1;
  155.                             if (j3 < 0) t2.uvk = uvs.size() + j3; else  t2.uvk = j3 - 1;
  156.                             consumedline = consumedline + offset;
  157.                             i2 = i3;
  158.                             j2 = j3;
  159.                             indices.push_back(t2);
  160.                         } else {
  161.                             nn = sscanf(consumedline, "%u//%u%n", &i3, &k3, &offset);
  162.                             if (nn == 2) {
  163.                                 if (i0 < 0) t2.vtxi = vertices.size() + i0; else    t2.vtxi = i0 - 1;
  164.                                 if (i2 < 0) t2.vtxj = vertices.size() + i2; else    t2.vtxj = i2 - 1;
  165.                                 if (i3 < 0) t2.vtxk = vertices.size() + i3; else    t2.vtxk = i3 - 1;
  166.                                 if (k0 < 0) t2.ni = normals.size() + k0; else   t2.ni = k0 - 1;
  167.                                 if (k2 < 0) t2.nj = normals.size() + k2; else   t2.nj = k2 - 1;
  168.                                 if (k3 < 0) t2.nk = normals.size() + k3; else   t2.nk = k3 - 1;                            
  169.                                 consumedline = consumedline + offset;
  170.                                 i2 = i3;
  171.                                 k2 = k3;
  172.                                 indices.push_back(t2);
  173.                             } else {
  174.                                 nn = sscanf(consumedline, "%u%n", &i3, &offset);
  175.                                 if (nn == 1) {
  176.                                     if (i0 < 0) t2.vtxi = vertices.size() + i0; else    t2.vtxi = i0 - 1;
  177.                                     if (i2 < 0) t2.vtxj = vertices.size() + i2; else    t2.vtxj = i2 - 1;
  178.                                     if (i3 < 0) t2.vtxk = vertices.size() + i3; else    t2.vtxk = i3 - 1;
  179.                                     consumedline = consumedline + offset;
  180.                                     i2 = i3;
  181.                                     indices.push_back(t2);
  182.                                 } else {
  183.                                     consumedline = consumedline + 1;
  184.                                 }
  185.                             }
  186.                         }
  187.                     }
  188.                 }
  189.  
  190.             }
  191.  
  192.         }
  193.         fclose(f);
  194.  
  195.     }
  196.  
  197.     std::vector<TriangleIndices> indices;
  198.     std::vector<Vector> vertices;
  199.     std::vector<Vector> normals;
  200.     std::vector<Vector> uvs;
  201.     std::vector<Vector> vertexcolors;
  202.    
  203. };
Add Comment
Please, Sign In to add comment