2 * Glide64 - Glide video plugin for Nintendo 64 emulators.
3 * Copyright (c) 2002 Dave2001
4 * Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 //****************************************************************
23 // Glide64 - Glide Plugin for Nintendo 64 emulators
24 // Project started on December 29th, 2001
27 // Dave2001, original author, founded the project in 2001, left it in 2002
28 // Gugaman, joined the project in 2002, left it in 2002
29 // Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
30 // Hiroshi 'KoolSmoky' Morii, joined the project in 2007
32 //****************************************************************
35 // * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
36 // * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
38 //****************************************************************
40 static void mod_tex_inter_color_using_factor (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)
42 float percent = factor / 255.0f;
43 float percent_i = 1 - percent;
48 cr = (color >> 12) & 0xF;
49 cg = (color >> 8) & 0xF;
50 cb = (color >> 4) & 0xF;
52 for (int i=0; i<size; i++)
56 r = (wxUint8)(percent_i * ((col >> 8) & 0xF) + percent * cr);
57 g = (wxUint8)(percent_i * ((col >> 4) & 0xF) + percent * cg);
58 b = (wxUint8)(percent_i * (col & 0xF) + percent * cb);
59 *(dst++) = a | (r << 8) | (g << 4) | b;
63 static void mod_tex_inter_col_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
69 float percent_r = ((color1 >> 12) & 0xF) / 15.0f;
70 float percent_g = ((color1 >> 8) & 0xF) / 15.0f;
71 float percent_b = ((color1 >> 4) & 0xF) / 15.0f;
72 float percent_r_i = 1.0f - percent_r;
73 float percent_g_i = 1.0f - percent_g;
74 float percent_b_i = 1.0f - percent_b;
76 cr = (color0 >> 12) & 0xF;
77 cg = (color0 >> 8) & 0xF;
78 cb = (color0 >> 4) & 0xF;
80 for (int i=0; i<size; i++)
84 r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * cr);
85 g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * cg);
86 b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * cb);
87 *(dst++) = a | (r << 8) | (g << 4) | b;
91 static void mod_full_color_sub_tex (wxUint16 *dst, int size, wxUint32 color)
93 wxUint32 cr, cg, cb, ca;
97 cr = (color >> 12) & 0xF;
98 cg = (color >> 8) & 0xF;
99 cb = (color >> 4) & 0xF;
102 for (int i=0; i<size; i++)
105 a = (wxUint8)(ca - ((col >> 12) & 0xF));
106 r = (wxUint8)(cr - ((col >> 8) & 0xF));
107 g = (wxUint8)(cg - ((col >> 4) & 0xF));
108 b = (wxUint8)(cb - (col & 0xF));
109 *(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
113 static void mod_col_inter_col1_using_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
115 wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;
119 float percent_r, percent_g, percent_b;
121 cr0 = (color0 >> 12) & 0xF;
122 cg0 = (color0 >> 8) & 0xF;
123 cb0 = (color0 >> 4) & 0xF;
124 cr1 = (color1 >> 12) & 0xF;
125 cg1 = (color1 >> 8) & 0xF;
126 cb1 = (color1 >> 4) & 0xF;
128 for (int i=0; i<size; i++)
132 percent_r = ((col >> 8) & 0xF) / 15.0f;
133 percent_g = ((col >> 4) & 0xF) / 15.0f;
134 percent_b = (col & 0xF) / 15.0f;
135 r = min(15, (wxUint8)((1.0f-percent_r) * cr0 + percent_r * cr1 + 0.0001f));
136 g = min(15, (wxUint8)((1.0f-percent_g) * cg0 + percent_g * cg1 + 0.0001f));
137 b = min(15, (wxUint8)((1.0f-percent_b) * cb0 + percent_b * cb1 + 0.0001f));
138 *(dst++) = a | (r << 8) | (g << 4) | b;
142 static void mod_col_inter_col1_using_texa (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
144 wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;
148 float percent, percent_i;
150 cr0 = (color0 >> 12) & 0xF;
151 cg0 = (color0 >> 8) & 0xF;
152 cb0 = (color0 >> 4) & 0xF;
153 cr1 = (color1 >> 12) & 0xF;
154 cg1 = (color1 >> 8) & 0xF;
155 cb1 = (color1 >> 4) & 0xF;
157 for (int i=0; i<size; i++)
161 percent = (a >> 12) / 15.0f;
162 percent_i = 1.0f - percent;
163 r = (wxUint8)(percent_i * cr0 + percent * cr1);
164 g = (wxUint8)(percent_i * cg0 + percent * cg1);
165 b = (wxUint8)(percent_i * cb0 + percent * cb1);
166 *(dst++) = a | (r << 8) | (g << 4) | b;
170 static void mod_col_inter_col1_using_texa__mul_tex (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
172 wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;
176 float percent, percent_i;
178 cr0 = (color0 >> 12) & 0xF;
179 cg0 = (color0 >> 8) & 0xF;
180 cb0 = (color0 >> 4) & 0xF;
181 cr1 = (color1 >> 12) & 0xF;
182 cg1 = (color1 >> 8) & 0xF;
183 cb1 = (color1 >> 4) & 0xF;
185 for (int i=0; i<size; i++)
189 percent = (a >> 12) / 15.0f;
190 percent_i = 1.0f - percent;
191 r = (wxUint8)(((percent_i * cr0 + percent * cr1) / 15.0f) * (((col & 0x0F00) >> 8) / 15.0f) * 15.0f);
192 g = (wxUint8)(((percent_i * cg0 + percent * cg1) / 15.0f) * (((col & 0x00F0) >> 4) / 15.0f) * 15.0f);
193 b = (wxUint8)(((percent_i * cb0 + percent * cb1) / 15.0f) * ((col & 0x000F) / 15.0f) * 15.0f);
194 *(dst++) = a | (r << 8) | (g << 4) | b;
198 static void mod_col_inter_tex_using_tex (wxUint16 *dst, int size, wxUint32 color)
204 float percent_r, percent_g, percent_b;
206 cr = (color >> 12) & 0xF;
207 cg = (color >> 8) & 0xF;
208 cb = (color >> 4) & 0xF;
210 for (int i=0; i<size; i++)
214 percent_r = ((col >> 8) & 0xF) / 15.0f;
215 percent_g = ((col >> 4) & 0xF) / 15.0f;
216 percent_b = (col & 0xF) / 15.0f;
217 r = (wxUint8)((1.0f-percent_r) * cr + percent_r * ((col & 0x0F00) >> 8));
218 g = (wxUint8)((1.0f-percent_g) * cg + percent_g * ((col & 0x00F0) >> 4));
219 b = (wxUint8)((1.0f-percent_b) * cb + percent_b * (col & 0x000F));
220 *(dst++) = a | (r << 8) | (g << 4) | b;
224 static void mod_col_inter_tex_using_texa (wxUint16 *dst, int size, wxUint32 color)
230 float percent, percent_i;
232 cr = (color >> 12) & 0xF;
233 cg = (color >> 8) & 0xF;
234 cb = (color >> 4) & 0xF;
236 for (int i=0; i<size; i++)
240 percent = (a >> 12) / 15.0f;
241 percent_i = 1.0f - percent;
242 r = (wxUint8)(percent_i * cr + percent * ((col & 0x0F00) >> 8));
243 g = (wxUint8)(percent_i * cg + percent * ((col & 0x00F0) >> 4));
244 b = (wxUint8)(percent_i * cb + percent * (col & 0x000F));
245 *(dst++) = a | (r << 8) | (g << 4) | b;
249 static void mod_col2_inter__col_inter_col1_using_tex__using_texa (wxUint16 *dst, int size,
250 wxUint32 color0, wxUint32 color1,
253 wxUint32 cr0, cg0, cb0, cr1, cg1, cb1, cr2, cg2, cb2;
257 float percent_r, percent_g, percent_b, percent_a;
259 cr0 = (color0 >> 12) & 0xF;
260 cg0 = (color0 >> 8) & 0xF;
261 cb0 = (color0 >> 4) & 0xF;
262 cr1 = (color1 >> 12) & 0xF;
263 cg1 = (color1 >> 8) & 0xF;
264 cb1 = (color1 >> 4) & 0xF;
265 cr2 = (color2 >> 12) & 0xF;
266 cg2 = (color2 >> 8) & 0xF;
267 cb2 = (color2 >> 4) & 0xF;
269 for (int i=0; i<size; i++)
273 percent_a = (a >> 12) / 15.0f;
274 percent_r = ((col >> 8) & 0xF) / 15.0f;
275 percent_g = ((col >> 4) & 0xF) / 15.0f;
276 percent_b = (col & 0xF) / 15.0f;
277 r = (wxUint8)(((1.0f-percent_r) * cr0 + percent_r * cr1) * percent_a + cr2 * (1.0f-percent_a));
278 g = (wxUint8)(((1.0f-percent_g) * cg0 + percent_g * cg1) * percent_a + cg2 * (1.0f-percent_a));
279 b = (wxUint8)(((1.0f-percent_b) * cb0 + percent_b * cb1) * percent_a + cb2 * (1.0f-percent_a));
280 *(dst++) = a | (r << 8) | (g << 4) | b;
284 static void mod_tex_scale_fac_add_fac (wxUint16 *dst, int size, wxUint32 factor)
286 float percent = factor / 255.0f;
289 float base_a = (1.0f - percent) * 15.0f;
291 for (int i=0; i<size; i++)
294 a = (wxUint8)(base_a + percent * (col>>12));
295 *(dst++) = (a<<12) | (col & 0x0FFF);
299 static void mod_tex_sub_col_mul_fac_add_tex (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)
301 float percent = factor / 255.0f;
306 cr = (color >> 12) & 0xF;
307 cg = (color >> 8) & 0xF;
308 cb = (color >> 4) & 0xF;
310 for (int i=0; i<size; i++)
314 r = (float)((col >> 8) & 0xF);
315 r = /*max(*/(r - cr) * percent/*, 0.0f)*/ + r;
316 if (r > 15.0f) r = 15.0f;
317 if (r < 0.0f) r = 0.0f;
318 g = (float)((col >> 4) & 0xF);
319 g = /*max(*/(g - cg) * percent/*, 0.0f)*/ + g;
320 if (g > 15.0f) g = 15.0f;
321 if (g < 0.0f) g = 0.0f;
322 b = (float)(col & 0xF);
323 b = /*max(*/(b - cb) * percent/*, 0.0f)*/ + b;
324 if (b > 15.0f) b = 15.0f;
325 if (b < 0.0f) b = 0.0f;
327 *(dst++) = a | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b;
331 static void mod_tex_scale_col_add_col (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
333 wxUint32 cr0, cg0, cb0, cr1, cg1, cb1;
337 float percent_r, percent_g, percent_b;
339 cr0 = (color0 >> 12) & 0xF;
340 cg0 = (color0 >> 8) & 0xF;
341 cb0 = (color0 >> 4) & 0xF;
342 cr1 = (color1 >> 12) & 0xF;
343 cg1 = (color1 >> 8) & 0xF;
344 cb1 = (color1 >> 4) & 0xF;
346 for (int i=0; i<size; i++)
350 percent_r = ((col >> 8) & 0xF) / 15.0f;
351 percent_g = ((col >> 4) & 0xF) / 15.0f;
352 percent_b = (col & 0xF) / 15.0f;
353 r = min(15, (wxUint8)(percent_r * cr0 + cr1 + 0.0001f));
354 g = min(15, (wxUint8)(percent_g * cg0 + cg1 + 0.0001f));
355 b = min(15, (wxUint8)(percent_b * cb0 + cb1 + 0.0001f));
356 *(dst++) = a | (r << 8) | (g << 4) | b;
360 static void mod_tex_add_col (wxUint16 *dst, int size, wxUint32 color)
366 cr = (color >> 12) & 0xF;
367 cg = (color >> 8) & 0xF;
368 cb = (color >> 4) & 0xF;
370 for (int i=0; i<size; i++)
373 a = (wxUint8)((col >> 12) & 0xF);
375 r = (wxUint8)(cr + ((col >> 8) & 0xF))&0xF;
376 g = (wxUint8)(cg + ((col >> 4) & 0xF))&0xF;
377 b = (wxUint8)(cb + (col & 0xF))&0xF;
378 *(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
382 static void mod_col_mul_texa_add_tex (wxUint16 *dst, int size, wxUint32 color)
390 cr = (color >> 12) & 0xF;
391 cg = (color >> 8) & 0xF;
392 cb = (color >> 4) & 0xF;
394 for (int i=0; i<size; i++)
398 factor = (a >> 12) / 15.0f;
399 r = (wxUint8)(cr*factor + ((col >> 8) & 0xF))&0xF;
400 g = (wxUint8)(cg*factor + ((col >> 4) & 0xF))&0xF;
401 b = (wxUint8)(cb*factor + (col & 0xF))&0xF;
402 *(dst++) = a | (r << 8) | (g << 4) | b;
406 static void mod_tex_sub_col (wxUint16 *dst, int size, wxUint32 color)
412 cr = (color >> 12) & 0xF;
413 cg = (color >> 8) & 0xF;
414 cb = (color >> 4) & 0xF;
416 for (int i=0; i<size; i++)
419 a = (wxUint8)(col & 0xF000);
420 r = (wxUint8)max((((col >> 8) & 0xF) - cr), 0);
421 g = (wxUint8)max((((col >> 4) & 0xF) - cg), 0);
422 b = (wxUint8)max(((col & 0xF) - cb), 0);
423 *(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
427 static void mod_tex_sub_col_mul_fac (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)
429 float percent = factor / 255.0f;
434 cr = (color >> 12) & 0xF;
435 cg = (color >> 8) & 0xF;
436 cb = (color >> 4) & 0xF;
438 for (int i=0; i<size; i++)
441 a = (wxUint8)((col >> 12) & 0xF);
442 r = (float)((col >> 8) & 0xF);
443 r = (r - cr) * percent;
444 if (r > 15.0f) r = 15.0f;
445 if (r < 0.0f) r = 0.0f;
446 g = (float)((col >> 4) & 0xF);
447 g = (g - cg) * percent;
448 if (g > 15.0f) g = 15.0f;
449 if (g < 0.0f) g = 0.0f;
450 b = (float)(col & 0xF);
451 b = (b - cb) * percent;
452 if (b > 15.0f) b = 15.0f;
453 if (b < 0.0f) b = 0.0f;
455 *(dst++) = (a << 12) | ((wxUint16)r << 8) | ((wxUint16)g << 4) | (wxUint16)b;
459 static void mod_col_inter_tex_using_col1 (wxUint16 *dst, int size, wxUint32 color0, wxUint32 color1)
465 float percent_r = ((color1 >> 12) & 0xF) / 15.0f;
466 float percent_g = ((color1 >> 8) & 0xF) / 15.0f;
467 float percent_b = ((color1 >> 4) & 0xF) / 15.0f;
468 float percent_r_i = 1.0f - percent_r;
469 float percent_g_i = 1.0f - percent_g;
470 float percent_b_i = 1.0f - percent_b;
472 cr = (color0 >> 12) & 0xF;
473 cg = (color0 >> 8) & 0xF;
474 cb = (color0 >> 4) & 0xF;
476 for (int i=0; i<size; i++)
479 a = (wxUint8)((col >> 12) & 0xF);
480 r = (wxUint8)(percent_r * ((col >> 8) & 0xF) + percent_r_i * cr);
481 g = (wxUint8)(percent_g * ((col >> 4) & 0xF) + percent_g_i * cg);
482 b = (wxUint8)(percent_b * (col & 0xF) + percent_b_i * cb);
483 *(dst++) = (a << 12) | (r << 8) | (g << 4) | b;
487 static void mod_tex_inter_noise_using_col (wxUint16 *dst, int size, wxUint32 color)
490 wxUint8 r, g, b, noise;
492 float percent_r = ((color >> 12) & 0xF) / 15.0f;
493 float percent_g = ((color >> 8) & 0xF) / 15.0f;
494 float percent_b = ((color >> 4) & 0xF) / 15.0f;
495 float percent_r_i = 1.0f - percent_r;
496 float percent_g_i = 1.0f - percent_g;
497 float percent_b_i = 1.0f - percent_b;
499 for (int i=0; i<size; i++)
504 r = (wxUint8)(percent_r_i * ((col >> 8) & 0xF) + percent_r * noise);
505 g = (wxUint8)(percent_g_i * ((col >> 4) & 0xF) + percent_g * noise);
506 b = (wxUint8)(percent_b_i * (col & 0xF) + percent_b * noise);
507 *(dst++) = a | (r << 8) | (g << 4) | b;
511 static void mod_tex_inter_col_using_texa (wxUint16 *dst, int size, wxUint32 color)
517 float percent, percent_i;
519 cr = (color >> 12) & 0xF;
520 cg = (color >> 8) & 0xF;
521 cb = (color >> 4) & 0xF;
523 for (int i=0; i<size; i++)
527 percent = (a >> 12) / 15.0f;
528 percent_i = 1.0f - percent;
529 r = (wxUint8)(percent * cr + percent_i * ((col & 0x0F00) >> 8));
530 g = (wxUint8)(percent * cg + percent_i * ((col & 0x00F0) >> 4));
531 b = (wxUint8)(percent * cb + percent_i * (col & 0x000F));
532 *(dst++) = a | (r << 8) | (g << 4) | b;
536 static void mod_tex_mul_col (wxUint16 *dst, int size, wxUint32 color)
543 cr = (float)((color >> 12) & 0xF)/16.0f;
544 cg = (float)((color >> 8) & 0xF)/16.0f;
545 cb = (float)((color >> 4) & 0xF)/16.0f;
547 for (int i=0; i<size; i++)
551 r = (wxUint8)(cr * ((col & 0x0F00) >> 8));
552 g = (wxUint8)(cg * ((col & 0x00F0) >> 4));
553 b = (wxUint8)(cb * (col & 0x000F));
554 *(dst++) = a | (r << 8) | (g << 4) | b;
558 static void mod_tex_scale_fac_add_col (wxUint16 *dst, int size, wxUint32 color, wxUint32 factor)
560 float percent = factor / 255.0f;
565 cr = (color >> 12) & 0xF;
566 cg = (color >> 8) & 0xF;
567 cb = (color >> 4) & 0xF;
569 for (int i=0; i<size; i++)
572 r = cr + percent * (float)((col>>8)&0xF);
573 g = cg + percent * (float)((col>>4)&0xF);
574 b = cb + percent * (float)(col&0xF);
575 *(dst++) = (col&0xF000) | ((wxUint8)r << 8) | ((wxUint8)g << 4) | (wxUint8)b;