home *** CD-ROM | disk | FTP | other *** search
/ Cutting-Edge 3D Game Programming with C++ / CE3DC++.ISO / BOOK / CHAP14 / PALSHADE.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-27  |  2.5 KB  |  93 lines

  1. //
  2. // File name: PalShade.CPP
  3. //
  4. // Description: The support file for a palette shading class
  5. //
  6. // Author: John De Goes
  7. //
  8. // Project: Cutting Edge 3D Game Programming
  9. //
  10.  
  11. #include <Math.H>
  12.  
  13. #include "PalShade.HPP"
  14.  
  15. void ShadeDat::GenTable ( double R2, double G2, double B2,
  16.                           RGBQUAD *Pal )
  17.    {
  18.    long Count, N;
  19.    double R, G, B, R1, G1, B1, DeltaR, DeltaG,
  20.           DeltaB, StepR, StepG, StepB;
  21.  
  22.    for ( Count = 0; Count < COLOR_COUNT; Count++ )
  23.        {
  24.        R1 = Pal [ Count ].rgbRed;
  25.        G1 = Pal [ Count ].rgbGreen;
  26.        B1 = Pal [ Count ].rgbBlue;
  27.        DeltaR = R2 - R1;
  28.        DeltaG = G2 - G1;
  29.        DeltaB = B2 - B1;
  30.        R = R1;
  31.        G = G1;
  32.        B = B1;
  33.        StepR = DeltaR / ( double ) SHADE_COUNT;
  34.        StepG = DeltaG / ( double ) SHADE_COUNT;
  35.        StepB = DeltaB / ( double ) SHADE_COUNT;
  36.        for ( N = 0; N < SHADE_COUNT; N++ )
  37.            {
  38.            Shade [ ( N * COLOR_COUNT ) + Count ] = ( BYTE )
  39.                                  GetColor ( ( long ) R,
  40.                                             ( long ) G,
  41.                                             ( long ) B, Pal );
  42.            R += StepR;
  43.            G += StepG;
  44.            B += StepB;
  45.            }
  46.        }
  47.    }
  48.  
  49. int ShadeDat::LoadTable ( char *FileName )
  50.   {
  51.   FILE *InFile;
  52.   if ( ( InFile = fopen ( FileName, "rb" ) ) == 0 )
  53.      return 0;
  54.   fread ( &Shade, sizeof Shade, 1, InFile );
  55.   fclose ( InFile );
  56.   return 1;
  57.   }
  58.  
  59. int ShadeDat::SaveTable ( char *FileName )
  60.   {
  61.   FILE *OutFile;
  62.   if ( ( OutFile = fopen ( FileName, "wb" ) ) == 0 )
  63.      return 0;
  64.   fwrite ( &Shade, sizeof Shade, 1, OutFile );
  65.   fclose ( OutFile );
  66.   return 1;
  67.   }
  68.  
  69. int GetColor ( int Red, int Green, int Blue, RGBQUAD *Pal )
  70.   {
  71.   double Dist [ COLOR_COUNT ], DRed, DGreen, DBlue, DistC;
  72.   int Count, CloseC;
  73.   for ( Count = 0; Count < COLOR_COUNT; Count++ )
  74.       {
  75.       DRed   = ( Red   - Pal [ Count ].rgbRed );
  76.       DGreen = ( Green - Pal [ Count ].rgbGreen );
  77.       DBlue  = ( Blue  - Pal [ Count ].rgbBlue );
  78.       Dist [ Count ] = sqrt ( DRed   * DRed +
  79.                               DGreen * DGreen +
  80.                               DBlue  * DBlue );
  81.       }
  82.   CloseC = 0;
  83.   DistC  = Dist [ 0 ];
  84.   for ( Count = 0; Count < COLOR_COUNT; Count++ )
  85.       {
  86.       if ( Dist [ Count ] < DistC )
  87.          {
  88.          DistC  = Dist [ Count ];
  89.          CloseC = Count;
  90.          }
  91.       }
  92.   return CloseC;
  93.   }