Facebook
From Funky Tortoise, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 253
  1.  
  2. typedef struct _vertex {
  3.     float x,y,z;
  4. } vertex;
  5.  
  6. typedef struct _vertex2 {
  7.     float nx,ny,nz;
  8. } vertex2;
  9.  
  10. typedef struct _object {
  11.     int n;
  12.     vertex * vertices;
  13.     vertex2 * normales;
  14.     unsigned int * indices;
  15. } object;
  16. object head,leftHand,leftHandTwo,leftWrist,
  17.         rightWrist,rightHand,rightHandTwo,
  18.         chest,
  19.         leftLegDown,leftLegUp,leftFoot,
  20.         rightFoot,rightLegDown,rightLegUp,
  21.         cube;
  22.  
  23. void loadobj(char *filename, object * o)
  24. {
  25.     int vc=0, fc=0, nc=0, tc=0, v=0, n=0, t=0, f=0, sc=0, s=0;
  26.     unsigned int v1,v2,v3,n1,n2,n3,t1,t2,t3,mid,mn=0,i,*faces;
  27.     float *vertices, *normals, *textures;
  28.     char line[64], mtllib[32];
  29.  
  30.     vertex *tmp;
  31.     vertex2 *tmp2;
  32.     FILE *file;
  33.     file = fopen(filename, "r");            // Open file
  34.     setvbuf(file, NULL, _IOFBF, 1024*256);  // Assume 256 KB buffer
  35.     while(!feof(file))
  36.     {
  37.         fgets(line, 64, file);
  38.         switch(line[0])
  39.         {
  40.             case 'v': switch(line[1])
  41.             {
  42.                 case 'n': ++nc; break;  // tu zliczamy
  43.                 case 't': ++tc; break;
  44.                 default: ++vc;
  45.             }
  46.             break;
  47.             case 'f': ++fc; break;
  48.         }
  49.     }
  50.     rewind(file);
  51.     o->n = fc;
  52.     vertices = (GLfloat*)calloc(3*vc, sizeof(GLfloat));
  53.     normals = (GLfloat*)calloc(3*nc, sizeof(GLfloat));
  54.     textures = (GLfloat*)calloc(2*tc, sizeof(GLfloat));
  55.     tmp = (vertex*)calloc(3*fc, sizeof(vertex));
  56.     tmp2 = (vertex2*)calloc(3*fc, sizeof(vertex2));
  57.     o->indices = (unsigned int*)calloc(3*fc, sizeof(unsigned int));
  58.     while(fgets(line, 64, file))
  59.     {
  60.  
  61.         switch(line[0])
  62.         {
  63.             case 'v': switch(line[1])
  64.             {
  65.                 case 'n': sscanf(line+2, "%f %f %f", &normals[n], &normals[n+1], &normals[n+2]); n+=3; break;
  66.                 case 't': sscanf(line+2, "%f %f %*f", &textures[t], &textures[t+1]); t+=2; break;
  67.                 default: sscanf(line+2, "%f %f %f", &vertices[v], &vertices[v+1], &vertices[v+2]); v+=3;
  68.             }
  69.             break;
  70.             case 'f':
  71.                 sscanf(line+2, "%u//%u %u//%u %u//%u", &v1,&n1, &v2,  &n2, &v3 , &n3);
  72.                 //sscanf(line+2, "%u/%u/%u %u/%u/%u %u/%u/%u", &v1,&t1,&n1, &v2,&t2,  &n2, &v3,&t3 , &n3);
  73.                 tmp[s].x = vertices[3*v1-3];
  74.                 tmp[s].y = vertices[3*v1-2];
  75.                 tmp[s].z = vertices[3*v1-1];  // sprawdzam debuggerem - zgadza się
  76.                 tmp2[s].nx = normals[3*n1-3];
  77.                 tmp2[s].ny = normals[3*n1-2];
  78.                 tmp2[s].nz = normals[3*n1-1];
  79.                 std::cout<< v1 << " " <<3*v1-3   << " " << vertices[3*v1-3] << " "
  80.                  << vertices[3*v1-2]<< " "
  81.                 << vertices[3*v1-1] << endl;
  82.                 s++;
  83.                 tmp[s].x = vertices[3*v2-3];
  84.                 tmp[s].y = vertices[3*v2-2];
  85.                 tmp[s].z = vertices[3*v2-1];
  86.                 tmp2[s].nx = normals[3*n2-3];
  87.                 tmp2[s].ny = normals[3*n2-2];
  88.                 tmp2[s].nz = normals[3*n2-1];
  89.  
  90.                 s++;
  91.                 tmp[s].x = vertices[3*v3-3];
  92.                 tmp[s].y = vertices[3*v3-2];
  93.                 tmp[s].z = vertices[3*v3-1];
  94.                 tmp2[s].nx = normals[3*n3-3];
  95.                 tmp2[s].ny = normals[3*n3-2];
  96.                 tmp2[s].nz = normals[3*n3-1];
  97.  
  98.                 s++;
  99.                 break;
  100.  
  101.         }
  102.     }
  103.     o->vertices = tmp;  // przypisanie wskaźnika też działa
  104.     fclose(file);
  105. }
  106.