Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. #include "version.h"
  2.  
  3. #ifdef USE_SHADING
  4. #include "wl_def.h"
  5. #include "wl_shade.h"
  6.  
  7. typedef struct {
  8.     uint8_t destRed, destGreen, destBlue;   // values between 0 and 255
  9.     uint8_t fogStrength;
  10. } shadedef_t;
  11.  
  12. shadedef_t shadeDefs[] = {
  13.     {   0,   0,   0, LSHADE_NOSHADING },
  14.     {   0,   0,   0, LSHADE_NORMAL },
  15.     {   0,   0,   0, LSHADE_FOG },
  16.     {  40,  40,  40, LSHADE_NORMAL },
  17.     {  60,  60,  60, LSHADE_FOG }
  18. };
  19.  
  20. uint8_t shadetable[SHADE_COUNT][256];
  21. int LSHADE_flag;
  22.  
  23. #ifdef USE_FEATUREFLAGS
  24.  
  25. // The lower 8-bit of the upper left tile of every map determine
  26. // the used shading definition of shadeDefs.
  27. static inline int GetShadeDefID()
  28. {
  29.     int shadeID = ffDataTopLeft & 0x00ff;
  30.     assert(shadeID >= 0 && shadeID < lengthof(shadeDefs));
  31.     return shadeID;
  32. }
  33.  
  34. #else
  35.  
  36. static int GetShadeDefID()
  37. {
  38.     int shadeID;
  39.     switch(gamestate.episode * 10 + mapon)
  40.     {
  41.         case  0: shadeID = 4; break;
  42.         case  1:
  43.         case  2:
  44.         case  6: shadeID = 1; break;
  45.         case  3: shadeID = 0; break;
  46.         case  5: shadeID = 2; break;
  47.         default: shadeID = 3; break;
  48.     }
  49.     assert(shadeID >= 0 && shadeID < lengthof(shadeDefs));
  50.     return shadeID;
  51. }
  52.  
  53. #endif
  54.  
  55.  
  56. // Returns the palette index of the nearest matching color of the
  57. // given RGB color in given palette
  58. byte GetColor(byte red, byte green, byte blue, SDL_Color *palette)
  59. {
  60.     byte mincol = 0;
  61.     double mindist = 200000.F, curdist, DRed, DGreen, DBlue;
  62.  
  63.     SDL_Color *palPtr = palette;
  64.  
  65.     for(int col = 0; col < 256; col++, palPtr++)
  66.     {
  67.         DRed   = (double) (red   - palPtr->r);
  68.         DGreen = (double) (green - palPtr->g);
  69.         DBlue  = (double) (blue  - palPtr->b);
  70.         curdist = DRed * DRed + DGreen * DGreen + DBlue * DBlue;
  71.         if(curdist < mindist)
  72.         {
  73.             mindist = curdist;
  74.             mincol = (byte) col;
  75.         }
  76.     }
  77.     return mincol;
  78. }
  79.  
  80. // Fade all colors in 32 steps down to the destination-RGB
  81. // (use gray for fogging, black for standard shading)
  82. void GenerateShadeTable(byte destRed, byte destGreen, byte destBlue,
  83.                         SDL_Color *palette, int fog)
  84. {
  85.     double curRed, curGreen, curBlue, redStep, greenStep, blueStep;
  86.     SDL_Color *palPtr = palette;
  87.  
  88.     // Set the fog-flag
  89.     LSHADE_flag=fog;
  90.  
  91.     // Color loop
  92.     for(int i = 0; i < 256; i++, palPtr++)
  93.     {
  94.         // Get original palette color
  95.         curRed   = palPtr->r;
  96.         curGreen = palPtr->g;
  97.         curBlue  = palPtr->b;
  98.  
  99.         // Calculate increment per step
  100.         redStep   = ((double) destRed   - curRed)   / (SHADE_COUNT + 8);
  101.         greenStep = ((double) destGreen - curGreen) / (SHADE_COUNT + 8);
  102.         blueStep  = ((double) destBlue  - curBlue)  / (SHADE_COUNT + 8);
  103.  
  104.         // Calc color for each shade of the current color
  105.         for (int shade = 0; shade < SHADE_COUNT; shade++)
  106.         {
  107.             shadetable[shade][i] = GetColor((byte) curRed, (byte) curGreen, (byte) curBlue, palette);
  108.  
  109.             // Inc to next shade
  110.             curRed   += redStep;
  111.             curGreen += greenStep;
  112.             curBlue  += blueStep;
  113.         }
  114.     }
  115. }
  116.  
  117. void NoShading()
  118. {
  119.     for(int shade = 0; shade < SHADE_COUNT; shade++)
  120.         for(int i = 0; i < 256; i++)
  121.             shadetable[shade][i] = i;
  122. }
  123.  
  124. void InitLevelShadeTable()
  125. {
  126.     shadedef_t *shadeDef = &shadeDefs[GetShadeDefID()];
  127.     if(shadeDef->fogStrength == LSHADE_NOSHADING)
  128.         NoShading();
  129.     else
  130.         GenerateShadeTable(shadeDef->destRed, shadeDef->destGreen, shadeDef->destBlue, gamepal, shadeDef->fogStrength);
  131. }
  132.  
  133. int GetShade(int scale)
  134. {
  135.     int shade = (scale >> 1) / (((viewwidth * 3) >> 8) + 1 + LSHADE_flag);  // TODO: reconsider this...
  136.     if(shade > 32) shade = 32;
  137.     else if(shade < 1) shade = 1;
  138.     shade = 32 - shade;
  139.  
  140.     return shade;
  141. }
  142.  
  143. #endif
  144.