home *** CD-ROM | disk | FTP | other *** search
/ 3D Games (Spidla) / 3dhry1.iso / carterrain / src / geometry.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2003-03-17  |  3.9 KB  |  156 lines

  1. #include <allegro.h>
  2. #include <alleggl.h>
  3. #include <stdio.h>
  4. #include <GL/gl.h>
  5.  
  6. #include "geometry.h"
  7. #include "trig.h"
  8.  
  9. CGeometry::CGeometry(void)
  10. {
  11.     vertices = 0;
  12.     tvertices = 0;
  13.     triangles = 0;
  14.     vertex = new CVertex[vertices];
  15.     tvertex = new CTvertex[tvertices];
  16.     triangle = new CTriangle[triangles];
  17.     
  18.     calc_normals();
  19. }
  20.  
  21. CGeometry::CGeometry(unsigned int v, unsigned int tv, unsigned int t)
  22. {
  23.     vertices = v;
  24.     tvertices= tv;
  25.     triangles = t;
  26.     vertex = new CVertex[vertices];
  27.     tvertex = new CTvertex[tvertices];
  28.     triangle = new CTriangle[triangles];
  29.  
  30.     calc_normals();
  31. }
  32.  
  33. CGeometry::CGeometry(const char* f)
  34. {
  35.     FILE *file;
  36.     unsigned int i;
  37.     float data;
  38.         
  39.     file = fopen(f, "r");
  40.     fscanf(file, "%u", &vertices);
  41.     fscanf(file, "%u", &tvertices);
  42.     fscanf(file, "%u", &triangles);
  43.     
  44.     vertex = new CVertex[vertices];
  45.     tvertex = new CTvertex[tvertices];
  46.     triangle = new CTriangle[triangles];
  47.     
  48.     for(i=0; i<vertices; i++)
  49.     {
  50.         fscanf(file, "%f", &data);
  51.         vertex[i].x = data;
  52.         fscanf(file, "%f", &data);
  53.         vertex[i].y = data;
  54.         fscanf(file, "%f", &data);
  55.         vertex[i].z = data;
  56.     }
  57.     for(i=0; i<tvertices; i++)
  58.     {
  59.         fscanf(file, "%f", &data);
  60.         tvertex[i].u = data;
  61.         fscanf(file, "%f", &data);
  62.         tvertex[i].v = data;
  63.         //
  64.         //fscanf(file, "%f", &data);
  65.         //
  66.     }
  67.     for(i=0; i<triangles; i++)
  68.     {
  69.         fscanf(file, "%u", &triangle[i].v[0]);
  70.         fscanf(file, "%u", &triangle[i].v[1]);
  71.         fscanf(file, "%u", &triangle[i].v[2]);
  72.     }
  73.     if(tvertices>0)
  74.             for(i=0; i<triangles; i++)
  75.         {
  76.                 fscanf(file, "%u", &triangle[i].tv[0]);
  77.             fscanf(file, "%u", &triangle[i].tv[1]);
  78.             fscanf(file, "%u", &triangle[i].tv[2]);
  79.         }
  80.     calc_normals();
  81.     fclose(file);
  82. }
  83.  
  84. CGeometry::~CGeometry(void)
  85. {
  86.     delete [] vertex;
  87.     delete [] tvertex;
  88.     delete [] triangle;
  89. }
  90.  
  91. void CGeometry::draw(void)
  92. {
  93.     unsigned int i;
  94.     //glColor3f(1, 1, 1);
  95.     glBegin(GL_TRIANGLES);
  96.     for(i=0; i<triangles; i++)
  97.     {
  98. //glNormal3f(triangle[i].normal.x, triangle[i].normal.y, triangle[i].normal.z);
  99.         glNormal3f(vertex[triangle[i].v[0]].normal.x, vertex[triangle[i].v[0]].normal.y, vertex[triangle[i].v[0]].normal.z);
  100.         if(tvertices>0) glTexCoord2f(tvertex[triangle[i].tv[0]].u, tvertex[triangle[i].tv[0]].v);
  101.         glVertex3f(vertex[triangle[i].v[0]].x, vertex[triangle[i].v[0]].y, vertex[triangle[i].v[0]].z);
  102.         glNormal3f(vertex[triangle[i].v[1]].normal.x, vertex[triangle[i].v[1]].normal.y, vertex[triangle[i].v[1]].normal.z);
  103.         if(tvertices>0) glTexCoord2f(tvertex[triangle[i].tv[1]].u, tvertex[triangle[i].tv[1]].v);
  104.         glVertex3f(vertex[triangle[i].v[1]].x, vertex[triangle[i].v[1]].y, vertex[triangle[i].v[1]].z);
  105.         glNormal3f(vertex[triangle[i].v[2]].normal.x, vertex[triangle[i].v[2]].normal.y, vertex[triangle[i].v[2]].normal.z);
  106.         if(tvertices>0) glTexCoord2f(tvertex[triangle[i].tv[2]].u, tvertex[triangle[i].tv[2]].v);
  107.         glVertex3f(vertex[triangle[i].v[2]].x, vertex[triangle[i].v[2]].y, vertex[triangle[i].v[2]].z);
  108.     }
  109.     glEnd();
  110. /*    glDisable(GL_TEXTURE_2D);
  111.     glBegin(GL_LINES);
  112.     for(i=0; i<vertices; i++)
  113.     {
  114.         glColor3f(0, 1, 0);
  115.         glNormal3f(vertex[i].normal.x, vertex[i].normal.y, vertex[i].normal.z);
  116.         glVertex3f(vertex[i].x, vertex[i].y, vertex[i].z);
  117.         glVertex3f(vertex[i].x+vertex[i].normal.x, vertex[i].y+vertex[i].normal.y, vertex[i].z+vertex[i].normal.z);
  118.     }
  119.     glEnd();*/
  120. }
  121.  
  122. void CGeometry::calc_normals(void)
  123. {
  124.     unsigned int i, j;
  125.     CVector a, b;
  126.     for(i=0; i<triangles; i++)
  127.     {
  128.         a=vertex[triangle[i].v[2]]-vertex[triangle[i].v[1]];
  129.         b=vertex[triangle[i].v[0]]-vertex[triangle[i].v[1]];
  130.         triangle[i].normal=(a%b).unit();
  131.     }
  132.     for(i=0; i<vertices; i++)
  133.     {
  134.         a.x=0;
  135.         a.y=0;
  136.         a.z=0;
  137.         for(j=0; j<triangles; j++)
  138.         {
  139.             if(triangle[j].v[0]==i || triangle[j].v[1]==i || triangle[j].v[2]==i)
  140.                 a=a+triangle[j].normal;
  141.         }
  142.         vertex[i].normal=a.unit();        
  143.     }
  144. }
  145.  
  146. void CGeometry::scale(double s)
  147. {
  148.     int i;
  149.     for(i=0; i<vertices; i++)
  150.     {
  151.         vertex[i].x*=s;
  152.         vertex[i].y*=s;
  153.         vertex[i].z*=s;
  154.     }
  155. }
  156.