home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / nurb_polyg / NurbUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-06  |  1.8 KB  |  91 lines

  1. /*
  2.  * NurbUtils.c - Code for Allocating, freeing, & copying NURB surfaces.
  3.  *
  4.  * John Peterson
  5.  */
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <math.h>
  10.  
  11. #include "nurbs.h"
  12.  
  13. /*
  14.  * Allocate memory for a NURB (assumes numU, numV, orderU
  15.  * and orderV have been set).  If ukv or vkv are not NIL, they
  16.  * are assumed to be pointers to valid knot vectors.
  17.  */
  18.  
  19. void
  20. AllocNurb( NurbSurface * n, double * ukv, double * vkv )
  21. {
  22.     long i;
  23.  
  24.     if (! ukv)
  25.     CHECK( n->kvU = (double *) malloc( (n->numU + n->orderU) * sizeof( double ) ) )
  26.     else
  27.     n->kvU = ukv;
  28.     if (! vkv)
  29.     CHECK( n->kvV = (double *) malloc( (n->numV + n->orderV) * sizeof( double ) ) )
  30.     else
  31.     n->kvV = vkv;
  32.  
  33.     CHECK( n->points = (Point4 **) malloc( (long) n->numV
  34.                        * (long) sizeof( Point4 * ) ) );
  35.     for (i = 0; i < n->numV; i++)
  36.     CHECK( n->points[i] = (Point4 *) malloc( (long) n->numU
  37.                          * (long) sizeof( Point4 )) );
  38. }
  39.  
  40. /*
  41.  * Release storage for a patch
  42.  */
  43.  
  44. void
  45. FreeNurb( NurbSurface * n )
  46. {
  47.     long i;
  48.  
  49.     if (n->kvU) free( n->kvU );
  50.     n->kvU = NULL;
  51.     if (n->kvV) free( n->kvV );
  52.     n->kvV = NULL;
  53.     for (i = 0; i < n->numV; i++)
  54.     free( n->points[i] );
  55.     free( n->points );
  56. }
  57.  
  58. /*
  59.  * Clone a nurb (deep copy)
  60.  */
  61.  
  62. void
  63. CloneNurb( NurbSurface * src, NurbSurface * dst )
  64. {
  65.     long i, j;
  66.     double * srcp, *dstp;
  67.  
  68.     *dst = *src;    /* Copy fields that don't change */
  69.     dst->kvU = NULL;
  70.     dst->kvV = NULL;    /* So they get allocated */
  71.     dst->points = NULL;
  72.  
  73.     AllocNurb( dst, NULL, NULL );
  74.  
  75.     /* Copy kv's */
  76.     srcp = src->kvU;
  77.     dstp = dst->kvU;
  78.     for (i = 0; i < src->numU + src->orderU; i++)
  79.     *dstp++ = *srcp++;
  80.  
  81.     srcp = src->kvV;
  82.     dstp = dst->kvV;
  83.     for (i = 0; i < src->numV + src->orderV; i++)
  84.     *dstp++ = *srcp++;
  85.  
  86.     /* Copy control points */
  87.     for (i = 0; i < src->numV; i++)
  88.     for (j = 0; j < src->numU; j++)
  89.         dst->points[i][j] = src->points[i][j];
  90. }
  91.