Mercurial > mm7
comparison PaletteManager.cpp @ 0:9c0607679772
init
author | Ritor1 |
---|---|
date | Sat, 12 Jan 2013 09:45:18 +0600 |
parents | |
children | 9824e2eeee30 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:9c0607679772 |
---|---|
1 #include "PaletteManager.h" | |
2 #include "Texture.h" | |
3 #include "Game.h" | |
4 #include "LOD.h" | |
5 | |
6 #include "mm7_data.h" | |
7 | |
8 | |
9 | |
10 | |
11 PaletteManager *pPaletteManager = new PaletteManager; | |
12 | |
13 | |
14 | |
15 | |
16 //----- (0048A643) -------------------------------------------------------- | |
17 bool __fastcall HSV2RGB(float *a1, float *a2, float *a3, float a4, float a5, float a6) | |
18 { | |
19 float *v6; // ebx@1 | |
20 float *v7; // edi@1 | |
21 float *v8; // esi@1 | |
22 double v9; // st7@5 | |
23 signed __int64 v10; // qax@5 | |
24 double v11; // st7@5 | |
25 double v12; // st5@5 | |
26 int v13; // eax@6 | |
27 int v14; // eax@7 | |
28 int v15; // eax@8 | |
29 int v16; // eax@9 | |
30 float v17; // eax@11 | |
31 float a3a; // [sp+1Ch] [bp+8h]@14 | |
32 float a4b; // [sp+20h] [bp+Ch]@5 | |
33 float a4c; // [sp+20h] [bp+Ch]@5 | |
34 float a4a; // [sp+20h] [bp+Ch]@5 | |
35 | |
36 v6 = a3; | |
37 v7 = a2; | |
38 v8 = a1; | |
39 if ( a5 == 0.0 ) | |
40 { | |
41 *a3 = a6; | |
42 *a2 = a6; | |
43 *a1 = a6; | |
44 goto LABEL_20; | |
45 } | |
46 if ( a4 == 360.0 ) | |
47 a4 = 0.0; | |
48 v9 = a4 * 0.01666666666666667; | |
49 a4b = v9; | |
50 floor(v9); | |
51 v10 = (signed __int64)v9; | |
52 a4c = a4b - (double)(signed int)(signed __int64)v9; | |
53 v11 = (1.0 - a5) * a6; | |
54 v12 = (1.0 - a4c * a5) * a6; | |
55 a4a = (1.0 - (1.0 - a4c) * a5) * a6; | |
56 if ( (int)v10 ) | |
57 { | |
58 v13 = v10 - 1; | |
59 if ( v13 ) | |
60 { | |
61 v14 = v13 - 1; | |
62 if ( v14 ) | |
63 { | |
64 v15 = v14 - 1; | |
65 if ( v15 ) | |
66 { | |
67 v16 = v15 - 1; | |
68 if ( v16 ) | |
69 { | |
70 if ( v16 != 1 ) | |
71 goto LABEL_20; | |
72 *v8 = a6; | |
73 v17 = v12; | |
74 *v7 = v11; | |
75 goto LABEL_12; | |
76 } | |
77 *(int *)v8 = LODWORD(a4a); | |
78 *v7 = v11; | |
79 } | |
80 else | |
81 { | |
82 *v8 = v11; | |
83 a3a = v12; | |
84 *(int *)v7 = LODWORD(a3a); | |
85 } | |
86 v17 = a6; | |
87 } | |
88 else | |
89 { | |
90 *v8 = v11; | |
91 *(int *)v7 = LODWORD(a6); | |
92 v17 = a4a; | |
93 } | |
94 LABEL_12: | |
95 *(int *)v6 = LODWORD(v17); | |
96 goto LABEL_20; | |
97 } | |
98 *v8 = v12; | |
99 *v7 = a6; | |
100 } | |
101 else | |
102 { | |
103 *v8 = a6; | |
104 *(int *)v7 = LODWORD(a4a); | |
105 } | |
106 *a3 = v11; | |
107 LABEL_20: | |
108 if ( *v8 > 1.0 ) | |
109 *v8 = 1.0; | |
110 if ( *v7 > 1.0 ) | |
111 *v7 = 1.0; | |
112 if ( *v6 > 1.0 ) | |
113 *v6 = 1.0; | |
114 if ( *v8 < 0.0 ) | |
115 *v8 = 0.0; | |
116 if ( *v7 < 0.0 ) | |
117 *v7 = 0.0; | |
118 if ( *v6 < 0.0 ) | |
119 *v6 = 0.0; | |
120 return 1; | |
121 } | |
122 | |
123 //----- (0048A7AA) -------------------------------------------------------- | |
124 void __fastcall RGB2HSV(float *a1, float *a2, float a3, float a4, float a5, float *a6) | |
125 { | |
126 double v6; // st7@2 | |
127 double v7; // st6@7 | |
128 double v8; // st5@12 | |
129 double v9; // st7@15 | |
130 double v10; // st7@17 | |
131 double v11; // st7@21 | |
132 __int16 v12; // fps@21 | |
133 unsigned __int8 v13; // c0@21 | |
134 unsigned __int8 v14; // c2@21 | |
135 float a6a; // [sp+14h] [bp+14h]@16 | |
136 | |
137 if ( a3 <= (double)a4 ) | |
138 v6 = a4; | |
139 else | |
140 v6 = a3; | |
141 if ( v6 < a5 ) | |
142 v6 = a5; | |
143 if ( a3 <= (double)a4 ) | |
144 v7 = a3; | |
145 else | |
146 v7 = a4; | |
147 if ( v7 > a5 ) | |
148 v7 = a5; | |
149 *a6 = v6; | |
150 if ( v6 == 0.0 ) | |
151 v8 = 0.0; | |
152 else | |
153 v8 = (v6 - v7) / v6; | |
154 *a2 = v8; | |
155 if ( v8 == 0.0 ) | |
156 { | |
157 v9 = 0.0; | |
158 LABEL_23: | |
159 *a1 = v9; | |
160 return; | |
161 } | |
162 a6a = v6 - v7; | |
163 if ( a3 == v6 ) | |
164 { | |
165 v10 = (a4 - a5) / a6a; | |
166 } | |
167 else | |
168 { | |
169 if ( a4 == v6 ) | |
170 v10 = (a5 - a3) / a6a + 2.0; | |
171 else | |
172 v10 = (a3 - a4) / a6a + 4.0; | |
173 } | |
174 //*a1 = v10; | |
175 //v11 = *a1 * 60.0; | |
176 //UNDEF(v12); | |
177 *a1 = v10 * 60.0; | |
178 if (*a1 < 0) | |
179 { | |
180 *a1 += 360.0; | |
181 } | |
182 } | |
183 | |
184 | |
185 | |
186 //----- (0048A8A3) -------------------------------------------------------- | |
187 int PaletteManager::LockAll() | |
188 { | |
189 int *v1; // edx@1 | |
190 signed int v2; // eax@1 | |
191 | |
192 v1 = &this->pPaletteIDs[1]; | |
193 v2 = 1; | |
194 do | |
195 { | |
196 if ( *v1 ) | |
197 this->_num_locked = v2 + 1; | |
198 ++v2; | |
199 ++v1; | |
200 } | |
201 while ( v2 < 50 ); | |
202 return this->_num_locked; | |
203 } | |
204 | |
205 //----- (0048A8CC) -------------------------------------------------------- | |
206 int PaletteManager::LockTestAll() | |
207 { | |
208 char *v1; // edx@1 | |
209 signed int v2; // eax@1 | |
210 | |
211 v1 = (char *)&this->pPaletteIDs[1]; | |
212 v2 = 1; | |
213 do | |
214 { | |
215 if ( *(int *)v1 ) | |
216 this->_pal_lock_test = v2 + 1; | |
217 ++v2; | |
218 v1 += 4; | |
219 } | |
220 while ( v2 < 50 ); | |
221 return this->_pal_lock_test; | |
222 } | |
223 | |
224 | |
225 //----- (0048A8F5) -------------------------------------------------------- | |
226 void PaletteManager::SetColorChannelInfo(int uNumRBits, int uNumGBits, int uNumBBits) | |
227 { | |
228 PaletteManager *v4; // esi@1 | |
229 int v5; // edi@1 | |
230 int v6; // eax@1 | |
231 int v7; // ebx@1 | |
232 | |
233 v4 = this; | |
234 this->uNumTargetRBits = uNumRBits; | |
235 this->uNumTargetGBits = uNumGBits; | |
236 v5 = this->uNumTargetGBits; | |
237 this->uNumTargetBBits = uNumBBits; | |
238 v6 = MakeColorMaskFromBitDepth(uNumRBits); | |
239 v7 = v4->uNumTargetBBits; | |
240 v4->uTargetRMask = v6 << (v5 + v4->uNumTargetBBits); | |
241 v4->uTargetGMask = MakeColorMaskFromBitDepth(v5) << v7; | |
242 v4->uTargetBMask = MakeColorMaskFromBitDepth(v7); | |
243 } | |
244 | |
245 | |
246 //----- (00489BE0) -------------------------------------------------------- | |
247 int PaletteManager::CalcPalettes_LUT(int a2) | |
248 { | |
249 PaletteManager *v2; // esi@1 | |
250 char *v3; // edi@1 | |
251 signed int v4; // ebx@4 | |
252 float v5; // ST08_4@5 | |
253 float v6; // ST04_4@5 | |
254 float v7; // ST00_4@5 | |
255 int v8; // eax@7 | |
256 float *v9; // edx@8 | |
257 float *v10; // ST0C_4@8 | |
258 float *v11; // ecx@8 | |
259 int v12; // ebx@8 | |
260 int v13; // eax@8 | |
261 float v14; // ebx@8 | |
262 float v15; // ST08_4@8 | |
263 float v16; // ST04_4@8 | |
264 float v17; // ST00_4@8 | |
265 unsigned __int8 v18; // sf@8 | |
266 unsigned __int8 v19; // of@8 | |
267 int v20; // eax@10 | |
268 double v21; // st5@11 | |
269 float v22; // ST0C_4@13 | |
270 unsigned int v23; // eax@13 | |
271 __int16 v24; // bx@16 | |
272 int v25; // eax@16 | |
273 double v26; // st7@20 | |
274 float v27; // ST0C_4@22 | |
275 unsigned int v28; // eax@22 | |
276 __int16 v29; // bx@25 | |
277 __int16 *v30; // eax@25 | |
278 int v31; // eax@27 | |
279 double v32; // st5@28 | |
280 float v33; // ST0C_4@30 | |
281 float v34; // ST08_4@30 | |
282 unsigned int v35; // ebx@30 | |
283 signed __int64 v36; // qax@33 | |
284 signed int v37; // edx@33 | |
285 char v38; // cl@33 | |
286 unsigned int v39; // ebx@33 | |
287 signed int v40; // edi@33 | |
288 unsigned int v41; // ecx@33 | |
289 unsigned int v42; // ecx@35 | |
290 int v43; // eax@39 | |
291 signed int v44; // edx@39 | |
292 unsigned __int8 v45; // al@40 | |
293 double v46; // st6@43 | |
294 signed int v47; // eax@43 | |
295 int v48; // eax@45 | |
296 double v49; // st6@47 | |
297 float v50; // ST08_4@49 | |
298 unsigned int v51; // ebx@49 | |
299 int v52; // edi@55 | |
300 int v53; // ebx@55 | |
301 signed __int64 v54; // qax@55 | |
302 double v55; // st7@56 | |
303 unsigned int v56; // ecx@57 | |
304 unsigned int v57; // ecx@59 | |
305 //int v58; // edx@61 | |
306 unsigned int v59; // ecx@61 | |
307 unsigned int v60; // eax@63 | |
308 char v61; // cl@63 | |
309 int result; // eax@63 | |
310 float v63[256]; // [sp+1Ch] [bp-C38h]@5 | |
311 float v64[256]; // [sp+41Ch] [bp-838h]@5 | |
312 int a6[256]; // [sp+81Ch] [bp-438h]@5 | |
313 int v66; // [sp+C1Ch] [bp-38h]@43 | |
314 float v67; // [sp+C20h] [bp-34h]@43 | |
315 float v68; // [sp+C24h] [bp-30h]@43 | |
316 PaletteManager *v69; // [sp+C28h] [bp-2Ch]@9 | |
317 float v70; // [sp+C2Ch] [bp-28h]@43 | |
318 double v71; // [sp+C30h] [bp-24h]@10 | |
319 int v72; // [sp+C38h] [bp-1Ch]@9 | |
320 int v73; // [sp+C3Ch] [bp-18h]@9 | |
321 int i; // [sp+C40h] [bp-14h]@7 | |
322 float v75; // [sp+C44h] [bp-10h]@5 | |
323 float a2a; // [sp+C48h] [bp-Ch]@13 | |
324 float a1; // [sp+C4Ch] [bp-8h]@13 | |
325 float a3; // [sp+C50h] [bp-4h]@13 | |
326 signed int v79; // [sp+C5Ch] [bp+8h]@33 | |
327 signed int v80; // [sp+C5Ch] [bp+8h]@43 | |
328 int v81; // [sp+C5Ch] [bp+8h]@57 | |
329 | |
330 v2 = this; | |
331 v3 = (char *)this + 768 * a2; | |
332 if (pPalette_tintColor[0] || pPalette_tintColor[1] || pPalette_tintColor[2]) | |
333 { | |
334 v8 = 0; | |
335 i = 0; | |
336 do | |
337 { | |
338 v9 = (float *)((char *)v63 + v8); | |
339 v10 = (float *)((char *)a6 + v8); | |
340 v11 = (float *)((char *)v64 + v8); | |
341 v12 = pPalette_tintColor[1]; | |
342 LODWORD(v75) = pPalette_tintColor[2] + (unsigned __int8)v3[2]; | |
343 v13 = v12 + (unsigned __int8)v3[1]; | |
344 LODWORD(v14) = (unsigned __int8)*v3; | |
345 v15 = (double)SLODWORD(v75) * 0.00196078431372549; | |
346 LODWORD(v75) = v13; | |
347 LODWORD(v75) = LODWORD(v14) + pPalette_tintColor[0]; | |
348 v16 = (double)v13 * 0.00196078431372549; | |
349 v17 = (double)SLODWORD(v75) * 0.00196078431372549; | |
350 RGB2HSV(v11, v9, v17, v16, v15, v10); | |
351 v3 += 3; | |
352 v8 = i + 4; | |
353 v19 = __OFSUB__(i + 4, 1024); | |
354 v18 = i - 1020 < 0; | |
355 i += 4; | |
356 } | |
357 while ( v18 ^ v19 ); | |
358 } | |
359 else | |
360 { | |
361 v4 = 0; | |
362 do | |
363 { | |
364 LODWORD(v75) = (unsigned __int8)v3[2]; | |
365 v5 = (double)SLODWORD(v75) * 0.00392156862745098; | |
366 LODWORD(v75) = (unsigned __int8)v3[1]; | |
367 v6 = (double)SLODWORD(v75) * 0.00392156862745098; | |
368 LODWORD(v75) = (unsigned __int8)*v3; | |
369 v7 = (double)SLODWORD(v75) * 0.00392156862745098; | |
370 RGB2HSV(&v64[v4], &v63[v4], v7, v6, v5, (float *)&a6[v4]); | |
371 ++v4; | |
372 v3 += 3; | |
373 } | |
374 while ( v4 < 256 ); | |
375 } | |
376 v69 = (PaletteManager *)((char *)v2 + 16384 * a2); | |
377 v72 = 0; | |
378 v73 = (int)v69->pPalette1; | |
379 do | |
380 { | |
381 v20 = 0; | |
382 i = 0; | |
383 v71 = 1.0 - (double)v72 * 0.03225806451612903; | |
384 do | |
385 { | |
386 v21 = *(float *)((char *)a6 + v20) * v71; | |
387 if ( v21 < 0.0 ) | |
388 v21 = 0.0; | |
389 v22 = v21; | |
390 HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v20), *(float *)((char *)v63 + v20), v22); | |
391 v23 = v2->uNumTargetGBits; | |
392 if ( v23 == 6 ) | |
393 { | |
394 a1 = a1 * 31.0; | |
395 a2a = a2a * 62.0; | |
396 a3 = a3 * 31.0; | |
397 } | |
398 else | |
399 { | |
400 a1 = a1 * 31.0; | |
401 a2a = a2a * 31.0; | |
402 a3 = a3 * 31.0; | |
403 } | |
404 v24 = (unsigned __int64)(signed __int64)a3 | ((unsigned __int16)(signed __int64)a2a << v2->uNumTargetBBits) | (unsigned __int16)((unsigned __int16)(signed __int64)a1 << (v2->uNumTargetBBits + v23)); | |
405 v25 = v73; | |
406 v73 += 2; | |
407 *(short *)v25 = v24; | |
408 v20 = i + 4; | |
409 v19 = __OFSUB__(i + 4, 1024); | |
410 v18 = i - 1020 < 0; | |
411 i += 4; | |
412 } | |
413 while ( v18 ^ v19 ); | |
414 ++v72; | |
415 } | |
416 while ( v72 < 32 ); | |
417 v72 = 0; | |
418 v73 = (int)v69->field_199600_palettes; | |
419 do | |
420 { | |
421 i = 0; | |
422 v71 = 1.0 - (double)v72 * 0.03225806451612903; | |
423 do | |
424 { | |
425 v26 = *(float *)&a6[i] * v71; | |
426 if ( v26 < 0.0 ) | |
427 v26 = 0.0; | |
428 v27 = v26; | |
429 HSV2RGB(&a1, &a2a, &a3, 1.0, 1.0, v27); | |
430 v28 = v2->uNumTargetGBits; | |
431 if ( v28 == 6 ) | |
432 { | |
433 a1 = a1 * 31.0; | |
434 a2a = a2a * 62.0; | |
435 a3 = a3 * 31.0; | |
436 } | |
437 else | |
438 { | |
439 a1 = a1 * 31.0; | |
440 a2a = a2a * 31.0; | |
441 a3 = a3 * 31.0; | |
442 } | |
443 v29 = (unsigned __int64)(signed __int64)a3 | ((unsigned __int16)(signed __int64)a2a << v2->uNumTargetBBits) | (unsigned __int16)((unsigned __int16)(signed __int64)a1 << (v2->uNumTargetBBits + v28)); | |
444 v30 = (__int16 *)v73; | |
445 ++i; | |
446 v73 += 2; | |
447 v19 = __OFSUB__(i, 256); | |
448 v18 = i - 256 < 0; | |
449 *v30 = v29; | |
450 } | |
451 while ( v18 ^ v19 ); | |
452 ++v72; | |
453 } | |
454 while ( v72 < 32 ); | |
455 v73 = (int)((char *)v2 + 512 * (a2 + 4875)); | |
456 v31 = 0; | |
457 i = 0; | |
458 do | |
459 { | |
460 v32 = (*(float *)((char *)a6 + v31) - 0.8) * 0.8387096774193549 + 0.8; | |
461 if ( v32 < 0.0 ) | |
462 v32 = 0.0; | |
463 v33 = v32; | |
464 v34 = *(float *)((char *)v63 + v31) * 0.7034339229968783; | |
465 HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v31), v34, v33); | |
466 v35 = v2->uNumTargetGBits; | |
467 if ( v35 == 6 ) | |
468 { | |
469 a1 = a1 * 31.0; | |
470 a2a = a2a * 62.0; | |
471 a3 = a3 * 31.0; | |
472 } | |
473 else | |
474 { | |
475 a1 = a1 * 31.0; | |
476 a2a = a2a * 31.0; | |
477 a3 = a3 * 31.0; | |
478 } | |
479 v36 = (signed __int64)((a1 + a2a + a3) * 0.3333333333333333 * 8.0); | |
480 v37 = (signed int)v36 >> (8 - v2->uNumTargetRBits); | |
481 v38 = 8 - v35; | |
482 v39 = v2->uNumTargetBBits; | |
483 v40 = (signed int)v36 >> v38; | |
484 v41 = v2->uNumTargetRBits; | |
485 v79 = (signed int)v36 >> (8 - v39); | |
486 if ( v37 > (1 << v41) - 1 ) | |
487 v37 = (1 << v41) - 1; | |
488 v42 = v2->uNumTargetGBits; | |
489 if ( v40 > (1 << v42) - 1 ) | |
490 v40 = (1 << v42) - 1; | |
491 if ( v79 > (1 << v39) - 1 ) | |
492 v79 = (1 << v39) - 1; | |
493 v43 = v73; | |
494 v44 = v37 << (v39 + v2->uNumTargetGBits); | |
495 v73 += 2; | |
496 *(short *)v43 = v79 | ((short)v40 << v39) | (unsigned __int16)v44; | |
497 v31 = i + 4; | |
498 v19 = __OFSUB__(i + 4, 1024); | |
499 v18 = i - 1020 < 0; | |
500 i += 4; | |
501 } | |
502 while ( v18 ^ v19 ); | |
503 v45 = pPalette_mistColor[0]; | |
504 if (v45 || pPalette_mistColor[1] || pPalette_mistColor[2]) | |
505 { | |
506 v46 = (double)v45; | |
507 v80 = pPalette_mistColor[1]; | |
508 v47 = pPalette_mistColor[2]; | |
509 v70 = v46 * 0.00392156862745098; | |
510 *((float *)&v71 + 1) = (double)v80 * 0.00392156862745098; | |
511 v75 = (double)v47 * 0.00392156862745098; | |
512 RGB2HSV(&v68, &v67, v70, *((float *)&v71 + 1), v75, (float *)&v66); | |
513 } | |
514 v72 = 0; | |
515 v73 = (int)v69->field_D1600; | |
516 | |
517 | |
518 do | |
519 { | |
520 v48 = 0; | |
521 for ( i = 0; ; v48 = i ) | |
522 { | |
523 v49 = *(float *)((char *)v63 + v48); | |
524 if ( v49 < 0.0 ) | |
525 v49 = 0.0; | |
526 v50 = v49; | |
527 HSV2RGB(&a1, &a2a, &a3, *(float *)((char *)v64 + v48), v50, *(float *)((char *)a6 + v48)); | |
528 v51 = v2->uNumTargetGBits; | |
529 if ( v51 == 6 ) | |
530 { | |
531 a1 = a1 * 31.0; | |
532 a2a = a2a * 62.0; | |
533 a3 = a3 * 31.0; | |
534 } | |
535 else | |
536 { | |
537 a1 = a1 * 31.0; | |
538 a2a = a2a * 31.0; | |
539 a3 = a3 * 31.0; | |
540 } | |
541 if (pPalette_mistColor[0] || pPalette_mistColor[1] || pPalette_mistColor[2]) | |
542 { | |
543 v55 = (double)v72 * 0.03225806451612903; | |
544 v52 = (signed __int64)((double)(1 << v2->uNumTargetRBits) * v70 * v55 + a1 * (1.0 - v55)); | |
545 v53 = (signed __int64)((double)(1 << v51) * *((float *)&v71 + 1) * v55 + a2a * (1.0 - v55)); | |
546 v54 = (signed __int64)((double)(1 << v2->uNumTargetBBits) * v75 * v55 + a3 * (1.0 - v55)); | |
547 } | |
548 else | |
549 { | |
550 v52 = (signed __int64)a1; | |
551 v53 = (signed __int64)a2a; | |
552 v54 = (signed __int64)a3; | |
553 } | |
554 v56 = v2->uNumTargetRBits; | |
555 v81 = v54; | |
556 if ( v52 > (1 << v56) - 1 ) | |
557 v52 = (1 << v56) - 1; | |
558 v57 = v2->uNumTargetGBits; | |
559 if ( v53 > (1 << v57) - 1 ) | |
560 v53 = (1 << v57) - 1; | |
561 HIDWORD(v54) = v2->uNumTargetBBits; | |
562 v59 = v2->uNumTargetBBits; | |
563 if ( (signed int)v54 > (1 << v59) - 1 ) | |
564 v81 = (1 << v59) - 1; | |
565 v60 = v2->uNumTargetGBits; | |
566 i += 4; | |
567 v61 = uNumTargetBBits + v60; | |
568 result = v73; | |
569 v73 += 2; | |
570 v19 = __OFSUB__(i, 1024); | |
571 v18 = i - 1024 < 0; | |
572 *(short *)result = v81 | ((short)v53 << uNumTargetBBits) | (v52 << v61); | |
573 if ( !(v18 ^ v19) ) | |
574 break; | |
575 } | |
576 ++v72; | |
577 } | |
578 while ( v72 < 32 ); | |
579 return result; | |
580 } | |
581 | |
582 | |
583 //----- (0048A300) -------------------------------------------------------- | |
584 PaletteManager::PaletteManager(): | |
585 uNumTargetRBits(0), uNumTargetGBits(0),uNumTargetBBits(0) | |
586 { | |
587 for (uint i = 0; i < 256; ++i) | |
588 { | |
589 pBaseColors[0][i][0] = i; | |
590 pBaseColors[0][i][1] = i; | |
591 pBaseColors[0][i][2] = i; | |
592 } | |
593 | |
594 CalcPalettes_LUT(0); | |
595 memset(pPaletteIDs, 0, sizeof(pPaletteIDs)); | |
596 } | |
597 | |
598 //----- (0048A336) -------------------------------------------------------- | |
599 // make grayscale palette at 0, clear all palettes ids that aren't locked | |
600 int PaletteManager::ResetNonLocked() | |
601 { | |
602 PaletteManager *v1; // esi@1 | |
603 signed int v2; // ecx@1 | |
604 int v3; // eax@1 | |
605 signed int result; // eax@3 | |
606 void *v5; // edi@4 | |
607 int v6; // ecx@4 | |
608 | |
609 v1 = this; | |
610 v2 = 0; | |
611 v3 = (int)&v1->pBaseColors[0][0][1]; | |
612 do | |
613 { | |
614 *(char *)(v3 + 1) = v2; | |
615 *(char *)v3 = v2; | |
616 *(char *)(v3 - 1) = v2++; | |
617 v3 += 3; | |
618 } | |
619 while ( v2 < 256 ); | |
620 CalcPalettes_LUT(0); | |
621 result = v1->_num_locked; | |
622 if ( result < 50 ) | |
623 { | |
624 v5 = &v1->pPaletteIDs[result]; | |
625 v6 = 50 - result; | |
626 result = 0; | |
627 memset(v5, 0, 4 * v6); | |
628 } | |
629 return result; | |
630 } | |
631 | |
632 //----- (0048A379) -------------------------------------------------------- | |
633 // make grayscale palette at 0, clear all palettes ids that aren't in "lock_test" | |
634 int PaletteManager::ResetNonTestLocked() | |
635 { | |
636 PaletteManager *v1; // esi@1 | |
637 signed int v2; // ecx@1 | |
638 int v3; // eax@1 | |
639 signed int result; // eax@3 | |
640 void *v5; // edi@4 | |
641 int v6; // ecx@4 | |
642 | |
643 v1 = this; | |
644 v2 = 0; | |
645 v3 = (int)&v1->pBaseColors[0][0][1]; | |
646 do | |
647 { | |
648 *(char *)(v3 + 1) = v2; | |
649 *(char *)v3 = v2; | |
650 *(char *)(v3 - 1) = v2++; | |
651 v3 += 3; | |
652 } | |
653 while ( v2 < 256 ); | |
654 CalcPalettes_LUT(0); | |
655 result = v1->_pal_lock_test; | |
656 if ( result < 50 ) | |
657 { | |
658 v5 = &v1->pPaletteIDs[result]; | |
659 v6 = 50 - result; | |
660 result = 0; | |
661 memset(v5, 0, 4 * v6); | |
662 } | |
663 return result; | |
664 } | |
665 | |
666 //----- (0048A3BC) -------------------------------------------------------- | |
667 int PaletteManager::LoadPalette(unsigned int uPaletteID) | |
668 { | |
669 unsigned int *v2; // ecx@1 | |
670 signed int result; // eax@1 | |
671 signed int v4; // esi@6 | |
672 double v5; // st7@7 | |
673 double v6; // st7@12 | |
674 double v7; // st6@17 | |
675 signed __int64 v8; // qax@17 | |
676 double v9; // st6@17 | |
677 char v10[768]; // [sp+18h] [bp-388h]@6 | |
678 //char v11; // [sp+19h] [bp-387h]@17 | |
679 //char v12[766]; // [sp+1Ah] [bp-386h]@17 | |
680 char Source[32]; // [sp+360h] [bp-40h]@4 | |
681 PaletteManager *v15; // [sp+380h] [bp-20h]@1 | |
682 float v16; // [sp+384h] [bp-1Ch]@7 | |
683 int v17; // [sp+388h] [bp-18h]@6 | |
684 float v18; // [sp+38Ch] [bp-14h]@7 | |
685 float a2a; // [sp+390h] [bp-10h]@7 | |
686 float a1; // [sp+394h] [bp-Ch]@7 | |
687 int a6; // [sp+398h] [bp-8h]@7 | |
688 int a3; // [sp+39Ch] [bp-4h]@7 | |
689 | |
690 v15 = this; | |
691 v2 = (unsigned int *)&this->pPaletteIDs[1]; | |
692 result = 1; | |
693 while ( *v2 != uPaletteID ) | |
694 { | |
695 ++result; | |
696 ++v2; | |
697 if ( result >= 50 ) | |
698 { | |
699 sprintf(Source, "pal%03i", uPaletteID); | |
700 | |
701 Texture tex; // [sp+318h] [bp-88h]@4 | |
702 //Texture::Texture(&tex); | |
703 | |
704 if ( pBitmaps_LOD->LoadTextureFromLOD(&tex, Source, TEXTURE_24BIT_PALETTE) == 1 ) | |
705 { | |
706 v4 = 0; | |
707 v17 = 1 - (int)&v10; | |
708 do | |
709 { | |
710 LODWORD(a1) = tex.pPalette24[v4]; | |
711 a1 = (double)SLODWORD(a1) * 0.0039215689; | |
712 LODWORD(a2a) = (unsigned __int8)*(&v10 + v4 + v17 + (unsigned int)tex.pPalette24); | |
713 a2a = (double)SLODWORD(a2a) * 0.0039215689; | |
714 a3 = tex.pPalette24[v4 + 2]; | |
715 *(float *)&a3 = (double)a3 * 0.0039215689; | |
716 RGB2HSV(&v16, &v18, a1, a2a, *(float *)&a3, (float *)&a6); | |
717 v5 = *(float *)&a6 * 1.1; | |
718 if ( v5 >= 0.0 && v5 >= 1.0 ) | |
719 { | |
720 v5 = 1.0; | |
721 } | |
722 else | |
723 { | |
724 if ( v5 < 0.0 ) | |
725 v5 = 0.0; | |
726 } | |
727 *(float *)&a6 = v5; | |
728 v6 = v18 * 0.64999998; | |
729 if ( v6 >= 0.0 && v6 >= 1.0 ) | |
730 { | |
731 v6 = 1.0; | |
732 } | |
733 else | |
734 { | |
735 if ( v6 < 0.0 ) | |
736 v6 = 0.0; | |
737 } | |
738 v18 = v6; | |
739 HSV2RGB(&a1, &a2a, (float *)&a3, v16, v18, *(float *)&a6); | |
740 v7 = a2a * 255.0; | |
741 v10[v4] = (signed __int64)(a1 * 255.0); | |
742 v8 = (signed __int64)v7; | |
743 v9 = *(float *)&a3 * 255.0; | |
744 v10[v4 + 1] = v8; | |
745 v10[v4 + 2] = (signed __int64)v9; | |
746 v4 += 3; | |
747 } | |
748 while ( v4 < 768 ); | |
749 tex.Release(); | |
750 result = v15->MakePaletteLUT(uPaletteID, v10); | |
751 } | |
752 else | |
753 { | |
754 result = 0; | |
755 } | |
756 return result; | |
757 } | |
758 } | |
759 return result; | |
760 } | |
761 // 48A3BC: using guessed type char var_386[766]; | |
762 | |
763 //----- (0048A5A4) -------------------------------------------------------- | |
764 int PaletteManager::MakePaletteLUT(int a2, char *entries) | |
765 { | |
766 PaletteManager *v3; // edi@1 | |
767 signed int result; // eax@1 | |
768 int *v5; // ecx@1 | |
769 int v6; // eax@4 | |
770 int v7; // esi@4 | |
771 int v8; // eax@9 | |
772 signed int v9; // ecx@9 | |
773 int v10; // edx@9 | |
774 | |
775 v3 = this; | |
776 result = 0; | |
777 v5 = this->pPaletteIDs; | |
778 while ( *v5 != a2 ) | |
779 { | |
780 ++result; | |
781 ++v5; | |
782 if ( result >= 50 ) | |
783 { | |
784 v6 = (int)&v3->pPaletteIDs[1]; | |
785 v7 = 1; | |
786 while ( *(int *)v6 ) | |
787 { | |
788 ++v7; | |
789 v6 += 4; | |
790 if ( v7 >= 50 ) | |
791 return 0; | |
792 } | |
793 v8 = (int)((char *)v3 + 768 * v7); | |
794 v9 = 768; | |
795 v10 = (int)(entries - v8); | |
796 do | |
797 { | |
798 *(char *)v8 = *(char *)(v10 + v8); | |
799 ++v8; | |
800 --v9; | |
801 } | |
802 while ( v9 ); | |
803 v3->pPaletteIDs[v7] = a2; | |
804 CalcPalettes_LUT(v7); | |
805 return v7; | |
806 } | |
807 } | |
808 return result; | |
809 } | |
810 | |
811 //----- (0048A614) -------------------------------------------------------- | |
812 void PaletteManager::RecalculateAll() | |
813 { | |
814 CalcPalettes_LUT(0); | |
815 | |
816 for (uint i = 1; i < 50; ++i) | |
817 if (pPaletteIDs[i]) | |
818 CalcPalettes_LUT(i); | |
819 } | |
820 | |
821 | |
822 //----- (0047BE67) -------------------------------------------------------- | |
823 unsigned __int16 *PaletteManager::Get(int a1) | |
824 { | |
825 return (unsigned __int16 *)pPaletteManager->field_199600_palettes[a1]; | |
826 } | |
827 | |
828 //----- (0047BE72) -------------------------------------------------------- | |
829 unsigned __int16 *PaletteManager::Get_Mist_or_Red_LUT(int a1, int a2, char a3) | |
830 { | |
831 int v3; // eax@4 | |
832 | |
833 if ( a3 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) | |
834 v3 = 32 * a1 + a2 + 3275; | |
835 else | |
836 v3 = 32 * a1 + a2 + 1675; | |
837 return (unsigned __int16 *)((char *)&pPaletteManager + 512 * v3); | |
838 } | |
839 // 4D864C: using guessed type char byte_4D864C; | |
840 | |
841 | |
842 //----- (0041F50D) -------------------------------------------------------- | |
843 unsigned __int16 *PaletteManager::Get_Dark_or_Red_LUT(int a1, int a2, char a3) | |
844 { | |
845 int v3; // eax@4 | |
846 | |
847 if ( a3 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) | |
848 v3 = 32 * a1 + a2 + 3275; | |
849 else | |
850 v3 = 32 * a1 + a2 + 75; | |
851 return (unsigned __int16 *)((char *)&pPaletteManager + 512 * v3); | |
852 } | |
853 // 4D864C: using guessed type char byte_4D864C; | |
854 | |
855 | |
856 //----- (0047C30E) -------------------------------------------------------- | |
857 unsigned __int16 *PaletteManager::_47C30E_get_palette(int a1, char a2) | |
858 { | |
859 char *result; // eax@4 | |
860 | |
861 if ( a2 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) | |
862 result = (char *)pPaletteManager->field_199600_palettes[a1]; | |
863 else | |
864 result = (char *)pPaletteManager->field_D1600[a1]; | |
865 return (unsigned __int16 *)result; | |
866 } | |
867 | |
868 | |
869 //----- (0047C33F) -------------------------------------------------------- | |
870 unsigned __int16 *PaletteManager::_47C33F_get_palette(int a1, char a2) | |
871 { | |
872 unsigned __int16 *result; // eax@4 | |
873 | |
874 if ( a2 & 2 || byte_4D864C && BYTE2(pGame->uFlags) & 4 ) | |
875 result = (unsigned __int16 *)pPaletteManager->field_199600_palettes[a1]; | |
876 else | |
877 result = (unsigned __int16 *)pPaletteManager->pPalette1[a1]; | |
878 return result; | |
879 } | |
880 // 4D864C: using guessed type char byte_4D864C; |