Advertisement
Guest User

Prosty loader OBJ

a guest
Dec 9th, 2012
2,100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include<vector>
  2.  
  3. struct SFace {
  4.     int v[3];
  5.     int n[3];
  6.     int t[3];
  7. };
  8.  
  9. GLuint LoadObj(char * file) {
  10.  
  11.     FILE * fp = fopen(file, "r");
  12.  
  13.     if (fp == NULL) {
  14.         printf("ERROR: Cannot read model file \"%s\".\n", file);
  15.         return -1;
  16.     }
  17.  
  18.     std::vector<vec3> * v = new std::vector<vec3>();
  19.     std::vector<vec3> * n = new std::vector<vec3>();
  20.     std::vector<vec3> * t = new std::vector<vec3>();
  21.     std::vector<SFace> * f = new std::vector<SFace>();
  22.  
  23.     char buf[128];
  24.  
  25.     while (fgets(buf, 128, fp) != NULL) {
  26.         if (buf[0] == 'v' && buf[1] == ' ') {
  27.             vec3 * vertex = new vec3();
  28.             sscanf(buf, "v %f %f %f", &vertex->x, &vertex->y, &vertex->z);
  29.             v->push_back(*vertex);
  30.         }
  31.         if (buf[0] == 'v' && buf[1] == 't') {
  32.             vec3 * vertex = new vec3();
  33.             sscanf(buf, "vt %f %f", &vertex->x, &vertex->y);
  34.             t->push_back(*vertex);
  35.         }
  36.         if (buf[0] == 'v' && buf[1] == 'n') {
  37.             vec3 * vertex = new vec3();
  38.             sscanf(buf, "vn %f %f %f", &vertex->x, &vertex->y, &vertex->z);
  39.             n->push_back(*vertex);
  40.         }
  41.         if (buf[0] == 'f' && buf[1] == ' ') {
  42.             SFace * face = new SFace();
  43.             sscanf(buf, "f %d/%d/%d %d/%d/%d %d/%d/%d",
  44.                 &face->v[0], &face->t[0], &face->n[0],
  45.                 &face->v[1], &face->t[1], &face->n[1],
  46.                 &face->v[2], &face->t[2], &face->n[2]
  47.             );
  48.             f->push_back(*face);
  49.         }
  50.     }
  51.  
  52.     fclose(fp);
  53.  
  54.     GLuint dlId;
  55.     dlId = glGenLists(1);
  56.     glNewList(dlId, GL_COMPILE);
  57.         glBegin(GL_TRIANGLES);
  58.         for (int i = 0; i < f->size(); ++i) {
  59.             for (int j = 0; j < 3; ++j) {
  60.                 vec3 * cv = &(*v)[((*f)[i].v[j] - 1)];
  61.                 vec3 * ct = &(*t)[((*f)[i].t[j] - 1)];
  62.                 vec3 * cn = &(*n)[((*f)[i].n[j] - 1)];
  63.                 glTexCoord2f(ct->x, ct->y);
  64.                 glNormal3f(cn->x, cn->y, cn->z);
  65.                 glVertex3f(cv->x, cv->y, cv->z);
  66.             }
  67.         }
  68.         glEnd();
  69.     glEndList();
  70.  
  71.     delete v;
  72.     delete n;
  73.     delete t;
  74.     delete f;
  75.  
  76.     return dlId;
  77.  
  78. }
  79.  
  80. // Wywołanie tak utworzonej display listy w celu jej narysowania:
  81. // glCallList(id_zwrocone_przez_LoadObj);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement