ColorUtils.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // ColorUtils.cc
  3. // Matt Ginzton / Kari Pulli
  4. // Mon Jun 22 13:39:49 PDT 1998
  5. // 
  6. // Utilities for dealing with colors
  7. //############################################################
  8. #include "ColorUtils.h"
  9. #include "plvDraw.h"
  10. #include "plvGlobals.h"
  11. ColorSet::ColorSet (void)
  12. {
  13.   currentColor = 0;
  14. }
  15. static float colorSet[][3] = {
  16.     {0.9, 0.15, 0.35},
  17.     {0.0, 0.9, 0.0},
  18.     {0.0, 0.9, 0.9},
  19.     {0.9, 0.0, 0.9},
  20.     {0.9, 0.9, 0.0},
  21. //  {0.0, 0.0, 0.9},  Lucas and Szymon don't like this one
  22.     {0.9, 0.5, 0.2},
  23.     {0.5, 0.9, 0.2},
  24.     {0.2, 0.5, 0.9},
  25.     {0.5, 0.2, 0.9},
  26.     {0.9, 0.2, 0.5},
  27.     {0.2, 0.9, 0.5},
  28.     {0.9, 0.7, 0.7},
  29.     {0.7, 0.9, 0.7},
  30.     {0.7, 0.7, 0.9},
  31.     {0.7, 0.9, 0.9},
  32.     {0.9, 0.7, 0.9},
  33.     {0.9, 0.9, 0.7},
  34.     {0.6, 0.6, 0.6},
  35.     {0.6, 0.3, 0.1},
  36.     {0.6, 0.1, 0.3},
  37.     {0.3, 0.1, 0.6},
  38.     {0.3, 0.6, 0.1},
  39.     {0.1, 0.3, 0.6},
  40.     {0.1, 0.6, 0.3},
  41.     {0.4, 0.9, 0.3},
  42.     {0.2, 0.9, 0.0},
  43. };
  44. #define NUM_COLOR_SET_COLORS (sizeof(colorSet) / sizeof(colorSet[0]))
  45. void
  46. ColorSet::chooseNewColor (uchar* color)
  47. {
  48.   currentColor = currentColor % NUM_COLOR_SET_COLORS;
  49.   
  50.   color[0] = uchar(colorSet[currentColor][0]*192);
  51.   color[1] = uchar(colorSet[currentColor][1]*192);
  52.   color[2] = uchar(colorSet[currentColor][2]*192);
  53.   
  54.   currentColor++;
  55. }
  56. void
  57. pushColor (vector<uchar>& colors, int colorsize, float value)
  58. {
  59.   pushColor (colors, colorsize, uchar(255 * value));
  60. }
  61. void
  62. pushColor (vector<uchar>& colors, int colorsize, float* values)
  63. {
  64.   uchar cvalues[3] = { values[0] * 255, values[1] * 255, values[2] * 255 };
  65.   pushColor (colors, colorsize, cvalues);
  66. }
  67. void
  68. pushColor (vector<uchar>& colors, int colorsize,
  69.    float value1, float value2, float value3)
  70. {
  71.   uchar cvalues[3] = { value1 * 255, value2 * 255, value3 * 255 };
  72.   pushColor (colors, colorsize, cvalues);
  73. }
  74. void
  75. pushColor (vector<uchar>& colors, int colorsize, uchar value)
  76. {
  77.   switch (colorsize) {
  78.   case 1:
  79.   case 2:
  80.     colors.push_back (value);
  81.     break;
  82.   case 3:
  83.   case 4:
  84.     colors.push_back (value);
  85.     colors.push_back (value);
  86.     colors.push_back (value);
  87.     break;
  88.   }
  89.  
  90.   if (colorsize == 2 || colorsize == 4) {
  91.     // TODO: hardcoded alpha for now
  92.     colors.push_back (255);
  93.   }
  94. }
  95. void
  96. pushColor (vector<uchar>& colors, int colorsize, uchar* values)
  97. {
  98.   switch (colorsize) {
  99.   case 1:
  100.   case 2:
  101.     colors.push_back (((int)values[0] + values[1] + values[2]) / 3);
  102.     break;
  103.   case 3:
  104.   case 4:
  105.     colors.push_back (values[0]);
  106.     colors.push_back (values[1]);
  107.     colors.push_back (values[2]);
  108.     break;
  109.   }
  110.  
  111.   if (colorsize == 2 || colorsize == 4) {
  112.     // TODO: hardcoded alpha for now
  113.     colors.push_back (255);
  114.   }
  115. }
  116. void
  117. pushColor (vector<uchar>& colors, int colorsize,
  118.    uchar* values1, uchar* values2, uchar* values3)
  119. {
  120.   uchar values[3] = {
  121.     ((int)values1[0] + values2[0] + values3[0]) / 3,
  122.     ((int)values1[1] + values2[1] + values3[1]) / 3,
  123.     ((int)values1[2] + values2[2] + values3[2]) / 3
  124.   };
  125.   pushColor (colors, colorsize, values);
  126. }
  127. void
  128. pushConf (vector<uchar>& colors, int colorsize, float conf)
  129. {
  130.   conf *= theRenderParams->confScale;
  131.   if (conf < 0.) conf = 0.;
  132.   else if (conf > 1.) conf = 1.;
  133.   pushConf (colors, colorsize, (uchar)(255 * conf));
  134. }
  135. void
  136. pushConf (vector<uchar>& colors, int colorsize, uchar conf)
  137. {
  138.   uchar visconf = conf * 0.7;
  139.   switch (colorsize) {
  140.   case 1:
  141.   case 2:
  142.     colors.push_back (visconf);
  143.     break;
  144.   case 3:
  145.   case 4:
  146.     colors.push_back (178);
  147.     colors.push_back (visconf);
  148.     colors.push_back (visconf);
  149.   }
  150.   if (colorsize == 2 || colorsize == 4)
  151.     colors.push_back (255);
  152. }
  153. uchar
  154. intensityFromRGB (uchar* rgb)
  155. {
  156.   // .257 red
  157.   // .504 green
  158.   // .098 blue
  159.   return (rgb[0]*.257 + rgb[1]*.504 + rgb[2]*.098) * 1.164;
  160. }