www.pudn.com > RayTracing Code.rar > Colour.cpp, change:2004-04-11,size:3856b


/** 3DGPL *************************************************\ 
 * ()                                                     * 
 * Handling of colour and lighting.                       * 
 *                                                        * 
 * Ifdefs:                                                * 
 *  _CI_                     Colour/Intensity model;      * 
 *  _RGB_                    RGB model;                   * 
 *                                                        * 
 * Defines:                                               * 
 *  CL_init_colours          Initialization;              * 
 *  CL_colour                Composing a colour;          * 
 *  CL_light                 Lighting a colour.           * 
 *                                                        * 
 * (c) 1995-98 Sergei Savchenko, (savs@cs.mcgill.ca)      * 
\**********************************************************/ 
 
#include "Colour.h"               /* colour models. */ 
 
int CL_div[CL_COLOUR_LEVELS][CL_LIGHT_LEVELS]; 
HW_pixel *CL_intensities;                   /* intensity table */ 
 
#if defined(_CI_) 
struct CL_palette *CL_colours;              /* saved for hardware access */ 
#endif 
 
/**********************************************************\ 
 * Initializing internal lookup tables.                   * 
 *                                                        * 
 * SETS: CL_intensity (when _CI_) CL_div (when _RGB_)     * 
 * -----                                                  * 
\**********************************************************/ 
 
#if defined(_CI_) 
void CL_init_colour(struct CL_palette *palette) 
{ 
 CL_colours=palette; 
 CL_intensities=palette->cl_intensity_table;/* for palette based models */ 
} 
#endif 
 
//初始化内部查找表,具体不是特别清楚 
#if defined(_RGB_) 
void CL_init_colour(void) 
{ 
 int i,j;                                   /* for RGB modes */ 
 
 for(i=0;i<CL_COLOUR_LEVELS;i++) 
 { 
  for(j=0;j<CL_LIGHT_LEVELS;j++) 
  { 
	//CL_LIGHT_MASK is for clamping light???? 0xff??? 
   CL_div[i][j]=(i*j)/CL_LIGHT_MASK; 
  } 
 } 
} 
#endif 
 
/**********************************************************\ 
 * Composing a colour.                                    * 
 *                                                        * 
 * RETURNS: Packed colour, storable in a colourmap.       * 
 * --------                                               * 
\**********************************************************/ 
 
#if defined(_RGB_) 
HW_pixel CL_colour(int red_light, 
                   int green_light, 
                   int blue_light 
                  ) 
{ 
 return((CL_clamp_red(red_light)<<CL_RED_SHIFT) | 
        (CL_clamp_green(green_light)<<CL_GREEN_SHIFT) | 
        (CL_clamp_blue(blue_light)<<CL_BLUE_SHIFT) 
       ); 
} 
#endif 
 
/**********************************************************\ 
 * Lighting a single pixel.                               * 
 *                                                        * 
 * RETURNS: Packed colour, storable in a colourmap.       * 
 * --------                                               * 
\**********************************************************/ 
 
#if defined(_CI_) 
HW_pixel CL_light(HW_pixel colour,int light) 
{ 
 return(CL_intensities[colour+(CL_clamp_light(light)<<CL_LOG_COLOUR_LEVELS)]); 
} 
#endif 
#if defined(_RGB_) 
HW_pixel CL_light(HW_pixel colour,int red_light, 
                                  int green_light, 
                                  int blue_light 
                  ) 
{ 
 return((CL_div[CL_red(colour)][CL_clamp_light(red_light)]<<CL_RED_SHIFT)       | 
        (CL_div[CL_green(colour)][CL_clamp_light(green_light)]<<CL_GREEN_SHIFT) | 
        (CL_div[CL_blue(colour)][CL_clamp_light(blue_light)]<<CL_BLUE_SHIFT) 
       ); 
} 
#endif 
 
/**********************************************************/