Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8557 | maxcodehac | 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>>>>>>>>> |