glm.h
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:8k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*    
  2.       glm.h
  3.       Nate Robins, 1997
  4.       ndr@pobox.com, http://www.pobox.com/~ndr/
  5.  
  6.       Wavefront OBJ model file format reader/writer/manipulator.
  7.       Includes routines for generating smooth normals with
  8.       preservation of edges, welding redundant vertices & texture
  9.       coordinate generation (spheremap and planar projections) + more.
  10.  */
  11. #include <GL/glut.h>
  12. #ifndef M_PI
  13. #define M_PI 3.14159265
  14. #endif
  15. #define GLM_NONE     (0) /* render with only vertices */
  16. #define GLM_FLAT     (1 << 0) /* render with facet normals */
  17. #define GLM_SMOOTH   (1 << 1) /* render with vertex normals */
  18. #define GLM_TEXTURE  (1 << 2) /* render with texture coords */
  19. #define GLM_COLOR    (1 << 3) /* render with colors */
  20. #define GLM_MATERIAL (1 << 4) /* render with materials */
  21. /* GLMmaterial: Structure that defines a material in a model. 
  22.  */
  23. typedef struct _GLMmaterial
  24. {
  25.   char* name; /* name of material */
  26.   GLfloat diffuse[4]; /* diffuse component */
  27.   GLfloat ambient[4]; /* ambient component */
  28.   GLfloat specular[4]; /* specular component */
  29.   GLfloat emmissive[4]; /* emmissive component */
  30.   GLfloat shininess; /* specular exponent */
  31. } GLMmaterial;
  32. /* GLMtriangle: Structure that defines a triangle in a model.
  33.  */
  34. typedef struct _GLMtriangle {
  35.   GLuint vindices[3]; /* array of triangle vertex indices */
  36.   GLuint nindices[3]; /* array of triangle normal indices */
  37.   GLuint tindices[3]; /* array of triangle texcoord indices*/
  38.   GLuint findex; /* index of triangle facet normal */
  39. } GLMtriangle;
  40. /* GLMgroup: Structure that defines a group in a model.
  41.  */
  42. typedef struct _GLMgroup {
  43.   char*             name; /* name of this group */
  44.   GLuint            numtriangles; /* number of triangles in this group */
  45.   GLuint*           triangles; /* array of triangle indices */
  46.   GLuint            material;           /* index to material for group */
  47.   struct _GLMgroup* next; /* pointer to next group in model */
  48. } GLMgroup;
  49. /* GLMmodel: Structure that defines a model.
  50.  */
  51. typedef struct _GLMmodel {
  52.   char*    pathname; /* path to this model */
  53.   char*    mtllibname; /* name of the material library */
  54.   GLuint   numvertices; /* number of vertices in model */
  55.   GLfloat* vertices; /* array of vertices  */
  56.   GLuint   numnormals; /* number of normals in model */
  57.   GLfloat* normals; /* array of normals */
  58.   GLuint   numtexcoords; /* number of texcoords in model */
  59.   GLfloat* texcoords; /* array of texture coordinates */
  60.   GLuint   numfacetnorms; /* number of facetnorms in model */
  61.   GLfloat* facetnorms; /* array of facetnorms */
  62.   GLuint       numtriangles; /* number of triangles in model */
  63.   GLMtriangle* triangles; /* array of triangles */
  64.   GLuint       nummaterials; /* number of materials in model */
  65.   GLMmaterial* materials; /* array of materials */
  66.   GLuint       numgroups; /* number of groups in model */
  67.   GLMgroup*    groups; /* linked list of groups */
  68.   GLfloat position[3]; /* position of the model */
  69. } GLMmodel;
  70. /* glmUnitize: "unitize" a model by translating it to the origin and
  71.  * scaling it to fit in a unit cube around the origin.  Returns the
  72.  * scalefactor used.
  73.  *
  74.  * model - properly initialized GLMmodel structure 
  75.  */
  76. GLfloat
  77. glmUnitize(GLMmodel* model);
  78. /* glmDimensions: Calculates the dimensions (width, height, depth) of
  79.  * a model.
  80.  *
  81.  * model      - initialized GLMmodel structure
  82.  * dimensions - array of 3 GLfloats (GLfloat dimensions[3])
  83.  */
  84. GLvoid
  85. glmDimensions(GLMmodel* model, GLfloat* dimensions);
  86. /* glmScale: Scales a model by a given amount.
  87.  * 
  88.  * model - properly initialized GLMmodel structure
  89.  * scale - scalefactor (0.5 = half as large, 2.0 = twice as large)
  90.  */
  91. GLvoid
  92. glmScale(GLMmodel* model, GLfloat scale);
  93. /* glmReverseWinding: Reverse the polygon winding for all polygons in
  94.  * this model.  Default winding is counter-clockwise.  Also changes
  95.  * the direction of the normals.
  96.  * 
  97.  * model - properly initialized GLMmodel structure 
  98.  */
  99. GLvoid
  100. glmReverseWinding(GLMmodel* model);
  101. /* glmFacetNormals: Generates facet normals for a model (by taking the
  102.  * cross product of the two vectors derived from the sides of each
  103.  * triangle).  Assumes a counter-clockwise winding.
  104.  *
  105.  * model - initialized GLMmodel structure
  106.  */
  107. GLvoid
  108. glmFacetNormals(GLMmodel* model);
  109. /* glmVertexNormals: Generates smooth vertex normals for a model.
  110.  * First builds a list of all the triangles each vertex is in.  Then
  111.  * loops through each vertex in the the list averaging all the facet
  112.  * normals of the triangles each vertex is in.  Finally, sets the
  113.  * normal index in the triangle for the vertex to the generated smooth
  114.  * normal.  If the dot product of a facet normal and the facet normal
  115.  * associated with the first triangle in the list of triangles the
  116.  * current vertex is in is greater than the cosine of the angle
  117.  * parameter to the function, that facet normal is not added into the
  118.  * average normal calculation and the corresponding vertex is given
  119.  * the facet normal.  This tends to preserve hard edges.  The angle to
  120.  * use depends on the model, but 90 degrees is usually a good start.
  121.  *
  122.  * model - initialized GLMmodel structure
  123.  * angle - maximum angle (in degrees) to smooth across
  124.  */
  125. GLvoid
  126. glmVertexNormals(GLMmodel* model, GLfloat angle);
  127. /* glmLinearTexture: Generates texture coordinates according to a
  128.  * linear projection of the texture map.  It generates these by
  129.  * linearly mapping the vertices onto a square.
  130.  *
  131.  * model - pointer to initialized GLMmodel structure
  132.  */
  133. GLvoid
  134. glmLinearTexture(GLMmodel* model);
  135. /* glmSpheremapTexture: Generates texture coordinates according to a
  136.  * spherical projection of the texture map.  Sometimes referred to as
  137.  * spheremap, or reflection map texture coordinates.  It generates
  138.  * these by using the normal to calculate where that vertex would map
  139.  * onto a sphere.  Since it is impossible to map something flat
  140.  * perfectly onto something spherical, there is distortion at the
  141.  * poles.  This particular implementation causes the poles along the X
  142.  * axis to be distorted.
  143.  *
  144.  * model - pointer to initialized GLMmodel structure
  145.  */
  146. GLvoid
  147. glmSpheremapTexture(GLMmodel* model);
  148. /* glmDelete: Deletes a GLMmodel structure.
  149.  *
  150.  * model - initialized GLMmodel structure
  151.  */
  152. GLvoid
  153. glmDelete(GLMmodel* model);
  154. /* glmReadOBJ: Reads a model description from a Wavefront .OBJ file.
  155.  * Returns a pointer to the created object which should be free'd with
  156.  * glmDelete().
  157.  *
  158.  * filename - name of the file containing the Wavefront .OBJ format data.  
  159.  */
  160. GLMmodel* 
  161. glmReadOBJ(char* filename);
  162. /* glmWriteOBJ: Writes a model description in Wavefront .OBJ format to
  163.  * a file.
  164.  *
  165.  * model    - initialized GLMmodel structure
  166.  * filename - name of the file to write the Wavefront .OBJ format data to
  167.  * mode     - a bitwise or of values describing what is written to the file
  168.  *            GLM_NONE    -  write only vertices
  169.  *            GLM_FLAT    -  write facet normals
  170.  *            GLM_SMOOTH  -  write vertex normals
  171.  *            GLM_TEXTURE -  write texture coords
  172.  *            GLM_FLAT and GLM_SMOOTH should not both be specified.
  173.  */
  174. GLvoid
  175. glmWriteOBJ(GLMmodel* model, char* filename, GLuint mode);
  176. /* glmDraw: Renders the model to the current OpenGL context using the
  177.  * mode specified.
  178.  *
  179.  * model    - initialized GLMmodel structure
  180.  * mode     - a bitwise OR of values describing what is to be rendered.
  181.  *            GLM_NONE    -  render with only vertices
  182.  *            GLM_FLAT    -  render with facet normals
  183.  *            GLM_SMOOTH  -  render with vertex normals
  184.  *            GLM_TEXTURE -  render with texture coords
  185.  *            GLM_FLAT and GLM_SMOOTH should not both be specified.
  186.  */
  187. GLvoid
  188. glmDraw(GLMmodel* model, GLuint mode);
  189. /* glmList: Generates and returns a display list for the model using
  190.  * the mode specified.
  191.  *
  192.  * model    - initialized GLMmodel structure
  193.  * mode     - a bitwise OR of values describing what is to be rendered.
  194.  *            GLM_NONE    -  render with only vertices
  195.  *            GLM_FLAT    -  render with facet normals
  196.  *            GLM_SMOOTH  -  render with vertex normals
  197.  *            GLM_TEXTURE -  render with texture coords
  198.  *            GLM_FLAT and GLM_SMOOTH should not both be specified.  
  199.  */
  200. GLuint
  201. glmList(GLMmodel* model, GLuint mode);
  202. /* glmWeld: eliminate (weld) vectors that are within an epsilon of
  203.  * each other.
  204.  *
  205.  * model      - initialized GLMmodel structure
  206.  * epsilon    - maximum difference between vertices
  207.  *              ( 0.00001 is a good start for a unitized model)
  208.  *
  209.  */
  210. GLuint
  211. glmWeld(GLMmodel* model, GLfloat epsilon);