home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch3_5 / bspalloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-22  |  2.2 KB  |  90 lines

  1. /* bspAlloc.c: module to allocate, free and append vertices and faces.
  2.  * Copyright (c) Norman Chin 
  3.  */
  4. #include "bsp.h"
  5.  
  6. /* Allocates a vertex with position (xx,yy,zz) */
  7. VERTEX *allocVertex(float xx,float yy,float zz)
  8. {
  9.    VERTEX *newVertex;
  10.  
  11.    if ((newVertex= (VERTEX *) MYMALLOC(sizeof(VERTEX))) == NULL_VERTEX) {
  12.       fprintf(stderr,"?Unable to malloc vertex.\n");
  13.       exit(1);
  14.    }
  15.    newVertex->xx= xx; newVertex->yy= yy; newVertex->zz= zz;
  16.    newVertex->vnext= NULL_VERTEX;
  17.  
  18.    return(newVertex);
  19. } /* allocVertex() */
  20.  
  21. /* Allocates a face with color, a list of vertices, a plane equation.
  22.  */
  23. FACE *allocFace(const COLOR *color,VERTEX *vlist,const PLANE *plane)
  24. {
  25.    FACE *newFace;
  26.  
  27.    if ((newFace= (FACE *) MYMALLOC(sizeof(FACE))) == NULL_FACE) {
  28.       fprintf(stderr,"?Unable to alloc face.\n");
  29.       exit(1);
  30.    }
  31.    newFace->color= *color;
  32.    newFace->vhead= vlist;
  33.    newFace->plane= *plane;
  34.    newFace->fnext= NULL_FACE;
  35.  
  36.    return(newFace);
  37. } /* allocFace() */
  38.  
  39. /* Append a vertex to a list. */
  40. void appendVertex(VERTEX **vhead,VERTEX **vtail,VERTEX *vertex)
  41. {
  42.    assert( (*vhead == NULL_VERTEX) ? (*vtail == NULL_VERTEX) : 1 );
  43.    assert(vertex != NULL_VERTEX);
  44.  
  45.    if (*vhead == NULL_VERTEX)
  46.       *vhead= vertex;
  47.    else (*vtail)->vnext= vertex;
  48.  
  49.    *vtail= vertex;        /* update tail */
  50. } /* appendVertex() */
  51.  
  52. /* Append a face to a list. */
  53. void appendFace(FACE **fhead,FACE **ftail,FACE *face)
  54. {
  55.    assert( (*fhead == NULL_FACE) ? (*ftail == NULL_FACE) : 1 );
  56.    assert(face != NULL_FACE);
  57.  
  58.    if (*fhead == NULL_FACE)
  59.       *fhead= face;
  60.    else (*ftail)->fnext= face;
  61.  
  62.    *ftail= face;        /* update tail */
  63. } /* appendFace() */
  64.  
  65. /* Frees list of vertices. */
  66. void freeVertexList(VERTEX **vlist)
  67. {
  68.    VERTEX *vtrav= *vlist, *vdel;
  69.    while (vtrav != NULL_VERTEX) {
  70.       vdel= vtrav; vtrav= vtrav->vnext;
  71.  
  72.       MYFREE((char *) vdel);
  73.    }
  74.    *vlist= NULL_VERTEX;
  75. } /* freeVertexList() */
  76.  
  77. /* Frees list of faces. */
  78. void freeFaceList(FACE **flist) 
  79. {
  80.    FACE *ftrav= *flist, *fdel;
  81.    while (ftrav != NULL_FACE) {
  82.       fdel= ftrav; ftrav= ftrav->fnext; freeVertexList(&fdel->vhead); 
  83.  
  84.       MYFREE((char *)fdel);
  85.  
  86.    }
  87.    *flist= NULL_FACE;
  88. } /* freeFaceList() */
  89. /*** bspAlloc.c ***/
  90.