Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glitch64/combiner.cpp
2 views
1
/*
2
* Glide64 - Glide video plugin for Nintendo 64 emulators.
3
* Copyright (c) 2002 Dave2001
4
* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
5
*
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
9
* any later version.
10
*
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.
15
*
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
19
*/
20
21
#ifdef _WIN32
22
#include <windows.h>
23
#else // _WIN32
24
#include <string.h>
25
#include <stdlib.h>
26
#endif // _WIN32
27
#include <math.h>
28
#include <stdio.h>
29
#include "glide.h"
30
#include "main.h"
31
32
static int fct[4], source0[4], operand0[4], source1[4], operand1[4], source2[4], operand2[4];
33
static int fcta[4],sourcea0[4],operanda0[4],sourcea1[4],operanda1[4],sourcea2[4],operanda2[4];
34
static int alpha_ref, alpha_func;
35
36
float texture_env_color[4];
37
float ccolor0[4];
38
float ccolor1[4];
39
static float chroma_color[4];
40
int fog_enabled;
41
static int chroma_enabled;
42
static int chroma_other_color;
43
static int chroma_other_alpha;
44
static int dither_enabled;
45
int blackandwhite0;
46
int blackandwhite1;
47
#ifdef _WIN32
48
static float farF;
49
static float nearF;
50
#endif // _WIN32
51
52
int need_lambda[2];
53
float lambda_color[2][4];
54
55
// shaders variables
56
int need_to_compile;
57
58
static GLhandleARB fragment_shader_object;
59
static GLhandleARB fragment_depth_shader_object;
60
static GLhandleARB vertex_shader_object;
61
static GLhandleARB program_object_default;
62
static GLhandleARB program_object_depth;
63
static GLhandleARB program_object;
64
static int constant_color_location;
65
static int ccolor0_location;
66
static int ccolor1_location;
67
static int first_color = 1;
68
static int first_alpha = 1;
69
static int first_texture0 = 1;
70
static int first_texture1 = 1;
71
static int tex0_combiner_ext = 0;
72
static int tex1_combiner_ext = 0;
73
static int c_combiner_ext = 0;
74
static int a_combiner_ext = 0;
75
76
static const char* fragment_shader_header =
77
"uniform sampler2D texture0; \n"
78
"uniform sampler2D texture1; \n"
79
"uniform sampler2D ditherTex; \n"
80
"uniform vec4 constant_color; \n"
81
"uniform vec4 ccolor0; \n"
82
"uniform vec4 ccolor1; \n"
83
"uniform vec4 chroma_color; \n"
84
"uniform float lambda; \n"
85
"varying vec4 fogValue; \n"
86
" \n"
87
"void test_chroma(vec4 ctexture1); \n"
88
" \n"
89
" \n"
90
"void main() \n"
91
"{ \n"
92
;
93
94
// using gl_FragCoord is terribly slow on ATI and varying variables don't work for some unknown
95
// reason, so we use the unused components of the texture2 coordinates
96
static const char* fragment_shader_dither =
97
" float dithx = (gl_TexCoord[2].b + 1.0)*0.5*1000.0; \n"
98
" float dithy = (gl_TexCoord[2].a + 1.0)*0.5*1000.0; \n"
99
" if(texture2D(ditherTex, vec2((dithx-32.0*floor(dithx/32.0))/32.0, \n"
100
" (dithy-32.0*floor(dithy/32.0))/32.0)).a > 0.5) discard; \n"
101
;
102
103
static const char* fragment_shader_default =
104
" gl_FragColor = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
105
;
106
107
static const char* fragment_shader_readtex0color =
108
" vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
109
;
110
111
static const char* fragment_shader_readtex0bw =
112
" vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"
113
" readtex0 = vec4(vec3(readtex0.b), \n"
114
" readtex0.r + readtex0.g * 8.0 / 256.0); \n"
115
;
116
static const char* fragment_shader_readtex0bw_2 =
117
" vec4 readtex0 = vec4(dot(texture2D(texture0, vec2(gl_TexCoord[0])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"
118
;
119
120
static const char* fragment_shader_readtex1color =
121
" vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"
122
;
123
124
static const char* fragment_shader_readtex1bw =
125
" vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"
126
" readtex1 = vec4(vec3(readtex1.b), \n"
127
" readtex1.r + readtex1.g * 8.0 / 256.0); \n"
128
;
129
static const char* fragment_shader_readtex1bw_2 =
130
" vec4 readtex1 = vec4(dot(texture2D(texture1, vec2(gl_TexCoord[1])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"
131
;
132
133
static const char* fragment_shader_fog =
134
" float fog; \n"
135
" fog = gl_TexCoord[0].b; \n"
136
" gl_FragColor = vec4(mix(gl_Fog.color.rgb, gl_FragColor.rgb, fog), gl_FragColor.a); \n"
137
;
138
139
static const char* fragment_shader_end =
140
"} \n"
141
;
142
143
static const char* vertex_shader =
144
"varying vec4 fogValue; \n"
145
" \n"
146
"void main() \n"
147
"{ \n"
148
" gl_Position = ftransform(); \n"
149
" gl_FrontColor = gl_Color; \n"
150
" gl_TexCoord[0] = gl_MultiTexCoord0; \n"
151
" gl_TexCoord[1] = gl_MultiTexCoord1; \n"
152
" float f = (gl_Fog.end - gl_SecondaryColor.r) * gl_Fog.scale; \n" // fog value passed through secondary color (workaround ATI bug)
153
" f = clamp(f, 0.0, 1.0); \n"
154
" gl_TexCoord[0].b = f; \n" // various data passed through
155
" gl_TexCoord[2].b = gl_Vertex.x; \n" // texture coordinates
156
" gl_TexCoord[2].a = gl_Vertex.y; \n" // again it is the only way
157
"} \n" // i've found to get it working fast with ATI drivers
158
;
159
160
static char fragment_shader_color_combiner[1024];
161
static char fragment_shader_alpha_combiner[1024];
162
static char fragment_shader_texture1[1024];
163
static char fragment_shader_texture0[1024];
164
static char fragment_shader_chroma[1024];
165
static char shader_log[2048];
166
167
void updateCombiner(int i)
168
{
169
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
170
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, fct[i]);
171
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, source0[i]);
172
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, operand0[i]);
173
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, source1[i]);
174
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, operand1[i]);
175
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, source2[i]);
176
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, operand2[i]);
177
}
178
179
void updateCombinera(int i)
180
{
181
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
182
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, fcta[i]);
183
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, sourcea0[i]);
184
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, operanda0[i]);
185
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, sourcea1[i]);
186
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, operanda1[i]);
187
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, sourcea2[i]);
188
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, operanda2[i]);
189
}
190
191
void init_combiner()
192
{
193
int texture[4] = {0, 0, 0, 0};
194
195
glActiveTextureARB(GL_TEXTURE0_ARB);
196
glEnable(GL_TEXTURE_2D);
197
198
// creating a fake texture
199
glBindTexture(GL_TEXTURE_2D, default_texture);
200
glTexImage2D(GL_TEXTURE_2D, 0, 3, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
201
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
202
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
203
204
glActiveTextureARB(GL_TEXTURE1_ARB);
205
glBindTexture(GL_TEXTURE_2D, default_texture);
206
glEnable(GL_TEXTURE_2D);
207
208
int texture0_location;
209
int texture1_location;
210
char *fragment_shader;
211
int log_length;
212
213
// depth shader
214
fragment_depth_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
215
216
char s[128];
217
// ZIGGY convert a 565 texture into depth component
218
sprintf(s, "gl_FragDepth = dot(texture2D(texture0, vec2(gl_TexCoord[0])), vec4(31*64*32, 63*32, 31, 0))*%g + %g; \n", zscale/2/65535.0, 1-zscale/2);
219
fragment_shader = (char*)malloc(strlen(fragment_shader_header)+
220
strlen(s)+
221
strlen(fragment_shader_end)+1);
222
strcpy(fragment_shader, fragment_shader_header);
223
strcat(fragment_shader, s);
224
strcat(fragment_shader, fragment_shader_end);
225
glShaderSourceARB(fragment_depth_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);
226
free(fragment_shader);
227
228
glCompileShaderARB(fragment_depth_shader_object);
229
230
// default shader
231
fragment_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
232
233
fragment_shader = (char*)malloc(strlen(fragment_shader_header)+
234
strlen(fragment_shader_default)+
235
strlen(fragment_shader_end)+1);
236
strcpy(fragment_shader, fragment_shader_header);
237
strcat(fragment_shader, fragment_shader_default);
238
strcat(fragment_shader, fragment_shader_end);
239
glShaderSourceARB(fragment_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);
240
free(fragment_shader);
241
242
glCompileShaderARB(fragment_shader_object);
243
244
vertex_shader_object = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
245
glShaderSourceARB(vertex_shader_object, 1, &vertex_shader, NULL);
246
glCompileShaderARB(vertex_shader_object);
247
248
// depth program
249
program_object = glCreateProgramObjectARB();
250
program_object_depth = program_object;
251
glAttachObjectARB(program_object, fragment_depth_shader_object);
252
glAttachObjectARB(program_object, vertex_shader_object);
253
glLinkProgramARB(program_object);
254
glUseProgramObjectARB(program_object);
255
256
glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);
257
if(!log_length)
258
{
259
glGetInfoLogARB(fragment_shader_object, 2048, &log_length, shader_log);
260
if(log_length) display_warning(shader_log);
261
glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);
262
if(log_length) display_warning(shader_log);
263
glGetInfoLogARB(program_object, 2048, &log_length, shader_log);
264
if(log_length) display_warning(shader_log);
265
}
266
267
texture0_location = glGetUniformLocationARB(program_object, "texture0");
268
texture1_location = glGetUniformLocationARB(program_object, "texture1");
269
glUniform1iARB(texture0_location, 0);
270
glUniform1iARB(texture1_location, 1);
271
272
// default program
273
program_object = glCreateProgramObjectARB();
274
program_object_default = program_object;
275
glAttachObjectARB(program_object, fragment_shader_object);
276
glAttachObjectARB(program_object, vertex_shader_object);
277
glLinkProgramARB(program_object);
278
glUseProgramObjectARB(program_object);
279
280
glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);
281
if(!log_length)
282
{
283
glGetInfoLogARB(fragment_shader_object, 2048, &log_length, shader_log);
284
if(log_length) display_warning(shader_log);
285
glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);
286
if(log_length) display_warning(shader_log);
287
glGetInfoLogARB(program_object, 2048, &log_length, shader_log);
288
if(log_length) display_warning(shader_log);
289
}
290
291
texture0_location = glGetUniformLocationARB(program_object, "texture0");
292
texture1_location = glGetUniformLocationARB(program_object, "texture1");
293
glUniform1iARB(texture0_location, 0);
294
glUniform1iARB(texture1_location, 1);
295
296
strcpy(fragment_shader_color_combiner, "");
297
strcpy(fragment_shader_alpha_combiner, "");
298
strcpy(fragment_shader_texture1, "vec4 ctexture1 = texture2D(texture0, vec2(gl_TexCoord[0])); \n");
299
strcpy(fragment_shader_texture0, "");
300
301
first_color = 1;
302
first_alpha = 1;
303
first_texture0 = 1;
304
first_texture1 = 1;
305
need_to_compile = 0;
306
fog_enabled = 0;
307
chroma_enabled = 0;
308
dither_enabled = 0;
309
blackandwhite0 = 0;
310
blackandwhite1 = 0;
311
}
312
313
void compile_chroma_shader()
314
{
315
strcpy(fragment_shader_chroma, "\nvoid test_chroma(vec4 ctexture1)\n{\n");
316
317
switch(chroma_other_alpha)
318
{
319
case GR_COMBINE_OTHER_ITERATED:
320
strcat(fragment_shader_chroma, "float alpha = gl_Color.a; \n");
321
break;
322
case GR_COMBINE_OTHER_TEXTURE:
323
strcat(fragment_shader_chroma, "float alpha = ctexture1.a; \n");
324
break;
325
case GR_COMBINE_OTHER_CONSTANT:
326
strcat(fragment_shader_chroma, "float alpha = constant_color.a; \n");
327
break;
328
default:
329
display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_alpha);
330
}
331
332
switch(chroma_other_color)
333
{
334
case GR_COMBINE_OTHER_ITERATED:
335
strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(gl_Color),alpha); \n");
336
break;
337
case GR_COMBINE_OTHER_TEXTURE:
338
strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(ctexture1),alpha); \n");
339
break;
340
case GR_COMBINE_OTHER_CONSTANT:
341
strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(constant_color),alpha); \n");
342
break;
343
default:
344
display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_color);
345
}
346
347
strcat(fragment_shader_chroma, "if (color.rgb == chroma_color.rgb) discard; \n");
348
strcat(fragment_shader_chroma, "}");
349
}
350
351
typedef struct _shader_program_key
352
{
353
int color_combiner;
354
int alpha_combiner;
355
int texture0_combiner;
356
int texture1_combiner;
357
int texture0_combinera;
358
int texture1_combinera;
359
int fog_enabled;
360
int chroma_enabled;
361
int dither_enabled;
362
int blackandwhite0;
363
int blackandwhite1;
364
GLhandleARB fragment_shader_object;
365
GLhandleARB program_object;
366
} shader_program_key;
367
368
static shader_program_key* shader_programs = NULL;
369
static int number_of_programs = 0;
370
static int color_combiner_key;
371
static int alpha_combiner_key;
372
static int texture0_combiner_key;
373
static int texture1_combiner_key;
374
static int texture0_combinera_key;
375
static int texture1_combinera_key;
376
377
void compile_shader()
378
{
379
int texture0_location;
380
int texture1_location;
381
int ditherTex_location;
382
char *fragment_shader;
383
int i;
384
int chroma_color_location;
385
int log_length;
386
387
need_to_compile = 0;
388
389
for(i=0; i<number_of_programs; i++)
390
{
391
if(shader_programs[i].color_combiner == color_combiner_key &&
392
shader_programs[i].alpha_combiner == alpha_combiner_key &&
393
shader_programs[i].texture0_combiner == texture0_combiner_key &&
394
shader_programs[i].texture1_combiner == texture1_combiner_key &&
395
shader_programs[i].texture0_combinera == texture0_combinera_key &&
396
shader_programs[i].texture1_combinera == texture1_combinera_key &&
397
shader_programs[i].fog_enabled == fog_enabled &&
398
shader_programs[i].chroma_enabled == chroma_enabled &&
399
shader_programs[i].dither_enabled == dither_enabled &&
400
shader_programs[i].blackandwhite0 == blackandwhite0 &&
401
shader_programs[i].blackandwhite1 == blackandwhite1)
402
{
403
program_object = shader_programs[i].program_object;
404
glUseProgramObjectARB(program_object);
405
406
texture0_location = glGetUniformLocationARB(program_object, "texture0");
407
texture1_location = glGetUniformLocationARB(program_object, "texture1");
408
glUniform1iARB(texture0_location, 0);
409
glUniform1iARB(texture1_location, 1);
410
411
constant_color_location = glGetUniformLocationARB(program_object, "constant_color");
412
glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],
413
texture_env_color[2], texture_env_color[3]);
414
415
ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");
416
glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);
417
418
ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");
419
glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);
420
421
chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");
422
glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],
423
chroma_color[2], chroma_color[3]);
424
425
if(dither_enabled)
426
{
427
ditherTex_location = glGetUniformLocationARB(program_object, "ditherTex");
428
glUniform1iARB(ditherTex_location, 2);
429
}
430
431
set_lambda();
432
return;
433
}
434
}
435
436
if(shader_programs != NULL)
437
shader_programs = (shader_program_key*)realloc(shader_programs, (number_of_programs+1)*sizeof(shader_program_key));
438
else
439
shader_programs = (shader_program_key*)malloc(sizeof(shader_program_key));
440
//printf("number of shaders %d\n", number_of_programs);
441
442
shader_programs[number_of_programs].color_combiner = color_combiner_key;
443
shader_programs[number_of_programs].alpha_combiner = alpha_combiner_key;
444
shader_programs[number_of_programs].texture0_combiner = texture0_combiner_key;
445
shader_programs[number_of_programs].texture1_combiner = texture1_combiner_key;
446
shader_programs[number_of_programs].texture0_combinera = texture0_combinera_key;
447
shader_programs[number_of_programs].texture1_combinera = texture1_combinera_key;
448
shader_programs[number_of_programs].fog_enabled = fog_enabled;
449
shader_programs[number_of_programs].chroma_enabled = chroma_enabled;
450
shader_programs[number_of_programs].dither_enabled = dither_enabled;
451
shader_programs[number_of_programs].blackandwhite0 = blackandwhite0;
452
shader_programs[number_of_programs].blackandwhite1 = blackandwhite1;
453
454
if(chroma_enabled)
455
{
456
strcat(fragment_shader_texture1, "test_chroma(ctexture1); \n");
457
compile_chroma_shader();
458
}
459
460
fragment_shader = (char*)malloc(4096);
461
462
strcpy(fragment_shader, fragment_shader_header);
463
if(dither_enabled) strcat(fragment_shader, fragment_shader_dither);
464
switch (blackandwhite0) {
465
case 1: strcat(fragment_shader, fragment_shader_readtex0bw); break;
466
case 2: strcat(fragment_shader, fragment_shader_readtex0bw_2); break;
467
default: strcat(fragment_shader, fragment_shader_readtex0color);
468
}
469
switch (blackandwhite1) {
470
case 1: strcat(fragment_shader, fragment_shader_readtex1bw); break;
471
case 2: strcat(fragment_shader, fragment_shader_readtex1bw_2); break;
472
default: strcat(fragment_shader, fragment_shader_readtex1color);
473
}
474
strcat(fragment_shader, fragment_shader_texture0);
475
strcat(fragment_shader, fragment_shader_texture1);
476
strcat(fragment_shader, fragment_shader_color_combiner);
477
strcat(fragment_shader, fragment_shader_alpha_combiner);
478
if(fog_enabled) strcat(fragment_shader, fragment_shader_fog);
479
strcat(fragment_shader, fragment_shader_end);
480
if(chroma_enabled) strcat(fragment_shader, fragment_shader_chroma);
481
482
shader_programs[number_of_programs].fragment_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
483
glShaderSourceARB(shader_programs[number_of_programs].fragment_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);
484
free(fragment_shader);
485
486
glCompileShaderARB(shader_programs[number_of_programs].fragment_shader_object);
487
488
program_object = glCreateProgramObjectARB();
489
shader_programs[number_of_programs].program_object = program_object;
490
glAttachObjectARB(program_object, shader_programs[number_of_programs].fragment_shader_object);
491
glAttachObjectARB(program_object, vertex_shader_object);
492
glLinkProgramARB(program_object);
493
glUseProgramObjectARB(program_object);
494
495
glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);
496
if(!log_length)
497
{
498
glGetInfoLogARB(shader_programs[number_of_programs].fragment_shader_object,
499
2048, &log_length, shader_log);
500
if(log_length) display_warning(shader_log);
501
glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);
502
if(log_length) display_warning(shader_log);
503
glGetInfoLogARB(program_object,
504
2048, &log_length, shader_log);
505
if(log_length) display_warning(shader_log);
506
}
507
508
texture0_location = glGetUniformLocationARB(program_object, "texture0");
509
texture1_location = glGetUniformLocationARB(program_object, "texture1");
510
glUniform1iARB(texture0_location, 0);
511
glUniform1iARB(texture1_location, 1);
512
513
constant_color_location = glGetUniformLocationARB(program_object, "constant_color");
514
glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],
515
texture_env_color[2], texture_env_color[3]);
516
517
ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");
518
glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);
519
520
ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");
521
glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);
522
523
chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");
524
glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],
525
chroma_color[2], chroma_color[3]);
526
527
if(dither_enabled)
528
{
529
ditherTex_location = glGetUniformLocationARB(program_object, "ditherTex");
530
glUniform1iARB(ditherTex_location, 2);
531
}
532
533
set_lambda();
534
number_of_programs++;
535
}
536
537
void free_combiners()
538
{
539
free(shader_programs);
540
shader_programs = NULL;
541
number_of_programs = 0;
542
}
543
544
void set_copy_shader()
545
{
546
int texture0_location;
547
548
glUseProgramObjectARB(program_object_default);
549
texture0_location = glGetUniformLocationARB(program_object, "texture0");
550
glUniform1iARB(texture0_location, 0);
551
}
552
553
void set_depth_shader()
554
{
555
int texture0_location;
556
557
glUseProgramObjectARB(program_object_depth);
558
texture0_location = glGetUniformLocationARB(program_object, "texture0");
559
glUniform1iARB(texture0_location, 0);
560
}
561
562
void set_lambda()
563
{
564
int lambda_location = glGetUniformLocationARB(program_object, "lambda");
565
glUniform1fARB(lambda_location, lambda);
566
}
567
568
FX_ENTRY void FX_CALL
569
grConstantColorValue( GrColor_t value )
570
{
571
LOG("grConstantColorValue(%d)\r\n", value);
572
switch(lfb_color_fmt)
573
{
574
case GR_COLORFORMAT_ARGB:
575
texture_env_color[3] = ((value >> 24) & 0xFF) / 255.0f;
576
texture_env_color[0] = ((value >> 16) & 0xFF) / 255.0f;
577
texture_env_color[1] = ((value >> 8) & 0xFF) / 255.0f;
578
texture_env_color[2] = (value & 0xFF) / 255.0f;
579
break;
580
case GR_COLORFORMAT_RGBA:
581
texture_env_color[0] = ((value >> 24) & 0xFF) / 255.0f;
582
texture_env_color[1] = ((value >> 16) & 0xFF) / 255.0f;
583
texture_env_color[2] = ((value >> 8) & 0xFF) / 255.0f;
584
texture_env_color[3] = (value & 0xFF) / 255.0f;
585
break;
586
default:
587
display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);
588
}
589
590
constant_color_location = glGetUniformLocationARB(program_object, "constant_color");
591
glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],
592
texture_env_color[2], texture_env_color[3]);
593
}
594
595
int setOtherColorSource(int other)
596
{
597
switch(other)
598
{
599
case GR_COMBINE_OTHER_ITERATED:
600
return GL_PRIMARY_COLOR_ARB;
601
break;
602
case GR_COMBINE_OTHER_TEXTURE:
603
return GL_PREVIOUS_ARB;
604
break;
605
case GR_COMBINE_OTHER_CONSTANT:
606
return GL_CONSTANT_ARB;
607
break;
608
default:
609
display_warning("unknwown other color source : %x", other);
610
}
611
return 0;
612
}
613
614
int setLocalColorSource(int local)
615
{
616
switch(local)
617
{
618
case GR_COMBINE_LOCAL_ITERATED:
619
return GL_PRIMARY_COLOR_ARB;
620
break;
621
case GR_COMBINE_LOCAL_CONSTANT:
622
return GL_CONSTANT_ARB;
623
break;
624
default:
625
display_warning("unknwown local color source : %x", local);
626
}
627
return 0;
628
}
629
630
void writeGLSLColorOther(int other)
631
{
632
switch(other)
633
{
634
case GR_COMBINE_OTHER_ITERATED:
635
strcat(fragment_shader_color_combiner, "vec4 color_other = gl_Color; \n");
636
break;
637
case GR_COMBINE_OTHER_TEXTURE:
638
strcat(fragment_shader_color_combiner, "vec4 color_other = ctexture1; \n");
639
break;
640
case GR_COMBINE_OTHER_CONSTANT:
641
strcat(fragment_shader_color_combiner, "vec4 color_other = constant_color; \n");
642
break;
643
default:
644
display_warning("unknown writeGLSLColorOther : %x", other);
645
}
646
}
647
648
void writeGLSLColorLocal(int local)
649
{
650
switch(local)
651
{
652
case GR_COMBINE_LOCAL_ITERATED:
653
strcat(fragment_shader_color_combiner, "vec4 color_local = gl_Color; \n");
654
break;
655
case GR_COMBINE_LOCAL_CONSTANT:
656
strcat(fragment_shader_color_combiner, "vec4 color_local = constant_color; \n");
657
break;
658
default:
659
display_warning("unknown writeGLSLColorLocal : %x", local);
660
}
661
}
662
663
void writeGLSLColorFactor(int factor, int local, int need_local, int other, int need_other)
664
{
665
switch(factor)
666
{
667
case GR_COMBINE_FACTOR_ZERO:
668
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(0.0); \n");
669
break;
670
case GR_COMBINE_FACTOR_LOCAL:
671
if(need_local) writeGLSLColorLocal(local);
672
strcat(fragment_shader_color_combiner, "vec4 color_factor = color_local; \n");
673
break;
674
case GR_COMBINE_FACTOR_OTHER_ALPHA:
675
if(need_other) writeGLSLColorOther(other);
676
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_other.a); \n");
677
break;
678
case GR_COMBINE_FACTOR_LOCAL_ALPHA:
679
if(need_local) writeGLSLColorLocal(local);
680
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_local.a); \n");
681
break;
682
case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
683
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(ctexture1.a); \n");
684
break;
685
case GR_COMBINE_FACTOR_TEXTURE_RGB:
686
strcat(fragment_shader_color_combiner, "vec4 color_factor = ctexture1; \n");
687
break;
688
case GR_COMBINE_FACTOR_ONE:
689
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0); \n");
690
break;
691
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
692
if(need_local) writeGLSLColorLocal(local);
693
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - color_local; \n");
694
break;
695
case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
696
if(need_other) writeGLSLColorOther(other);
697
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_other.a); \n");
698
break;
699
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
700
if(need_local) writeGLSLColorLocal(local);
701
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_local.a); \n");
702
break;
703
case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
704
strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(ctexture1.a); \n");
705
break;
706
default:
707
display_warning("unknown writeGLSLColorFactor : %x", factor);
708
}
709
}
710
711
FX_ENTRY void FX_CALL
712
grColorCombine(
713
GrCombineFunction_t function, GrCombineFactor_t factor,
714
GrCombineLocal_t local, GrCombineOther_t other,
715
FxBool invert )
716
{
717
LOG("grColorCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);
718
static int last_function = 0;
719
static int last_factor = 0;
720
static int last_local = 0;
721
static int last_other = 0;
722
723
if(last_function == function && last_factor == factor &&
724
last_local == local && last_other == other && first_color == 0 && !c_combiner_ext) return;
725
first_color = 0;
726
c_combiner_ext = 0;
727
728
last_function = function;
729
last_factor = factor;
730
last_local = local;
731
last_other = other;
732
733
if (invert) display_warning("grColorCombine : inverted result");
734
735
color_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);
736
chroma_other_color = other;
737
738
strcpy(fragment_shader_color_combiner, "");
739
switch(function)
740
{
741
case GR_COMBINE_FUNCTION_ZERO:
742
strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(0.0); \n");
743
break;
744
case GR_COMBINE_FUNCTION_LOCAL:
745
writeGLSLColorLocal(local);
746
strcat(fragment_shader_color_combiner, "gl_FragColor = color_local; \n");
747
break;
748
case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
749
writeGLSLColorLocal(local);
750
strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(color_local.a); \n");
751
break;
752
case GR_COMBINE_FUNCTION_SCALE_OTHER:
753
writeGLSLColorOther(other);
754
writeGLSLColorFactor(factor,local,1,other,0);
755
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other; \n");
756
break;
757
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
758
writeGLSLColorLocal(local);
759
writeGLSLColorOther(other);
760
writeGLSLColorFactor(factor,local,0,other,0);
761
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + color_local; \n");
762
break;
763
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
764
writeGLSLColorLocal(local);
765
writeGLSLColorOther(other);
766
writeGLSLColorFactor(factor,local,0,other,0);
767
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + vec4(color_local.a); \n");
768
break;
769
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
770
writeGLSLColorLocal(local);
771
writeGLSLColorOther(other);
772
writeGLSLColorFactor(factor,local,0,other,0);
773
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local); \n");
774
break;
775
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
776
writeGLSLColorLocal(local);
777
writeGLSLColorOther(other);
778
writeGLSLColorFactor(factor,local,0,other,0);
779
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + color_local; \n");
780
break;
781
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
782
writeGLSLColorLocal(local);
783
writeGLSLColorOther(other);
784
writeGLSLColorFactor(factor,local,0,other,0);
785
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + vec4(color_local.a); \n");
786
break;
787
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
788
writeGLSLColorLocal(local);
789
writeGLSLColorFactor(factor,local,0,other,1);
790
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + color_local; \n");
791
break;
792
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
793
writeGLSLColorLocal(local);
794
writeGLSLColorFactor(factor,local,0,other,1);
795
strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + vec4(color_local.a); \n");
796
break;
797
default:
798
strcpy(fragment_shader_color_combiner, fragment_shader_default);
799
display_warning("grColorCombine : unknown function : %x", function);
800
}
801
//compile_shader();
802
need_to_compile = 1;
803
}
804
805
int setOtherAlphaSource(int other)
806
{
807
switch(other)
808
{
809
case GR_COMBINE_OTHER_ITERATED:
810
return GL_PRIMARY_COLOR_ARB;
811
break;
812
case GR_COMBINE_OTHER_TEXTURE:
813
return GL_PREVIOUS_ARB;
814
break;
815
case GR_COMBINE_OTHER_CONSTANT:
816
return GL_CONSTANT_ARB;
817
break;
818
default:
819
display_warning("unknwown other alpha source : %x", other);
820
}
821
return 0;
822
}
823
824
int setLocalAlphaSource(int local)
825
{
826
switch(local)
827
{
828
case GR_COMBINE_LOCAL_ITERATED:
829
return GL_PRIMARY_COLOR_ARB;
830
break;
831
case GR_COMBINE_LOCAL_CONSTANT:
832
return GL_CONSTANT_ARB;
833
break;
834
default:
835
display_warning("unknwown local alpha source : %x", local);
836
}
837
return 0;
838
}
839
840
void writeGLSLAlphaOther(int other)
841
{
842
switch(other)
843
{
844
case GR_COMBINE_OTHER_ITERATED:
845
strcat(fragment_shader_alpha_combiner, "float alpha_other = gl_Color.a; \n");
846
break;
847
case GR_COMBINE_OTHER_TEXTURE:
848
strcat(fragment_shader_alpha_combiner, "float alpha_other = ctexture1.a; \n");
849
break;
850
case GR_COMBINE_OTHER_CONSTANT:
851
strcat(fragment_shader_alpha_combiner, "float alpha_other = constant_color.a; \n");
852
break;
853
default:
854
display_warning("unknown writeGLSLAlphaOther : %x", other);
855
}
856
}
857
858
void writeGLSLAlphaLocal(int local)
859
{
860
switch(local)
861
{
862
case GR_COMBINE_LOCAL_ITERATED:
863
strcat(fragment_shader_alpha_combiner, "float alpha_local = gl_Color.a; \n");
864
break;
865
case GR_COMBINE_LOCAL_CONSTANT:
866
strcat(fragment_shader_alpha_combiner, "float alpha_local = constant_color.a; \n");
867
break;
868
default:
869
display_warning("unknown writeGLSLAlphaLocal : %x", local);
870
}
871
}
872
873
void writeGLSLAlphaFactor(int factor, int local, int need_local, int other, int need_other)
874
{
875
switch(factor)
876
{
877
case GR_COMBINE_FACTOR_ZERO:
878
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 0.0; \n");
879
break;
880
case GR_COMBINE_FACTOR_LOCAL:
881
if(need_local) writeGLSLAlphaLocal(local);
882
strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");
883
break;
884
case GR_COMBINE_FACTOR_OTHER_ALPHA:
885
if(need_other) writeGLSLAlphaOther(other);
886
strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_other; \n");
887
break;
888
case GR_COMBINE_FACTOR_LOCAL_ALPHA:
889
if(need_local) writeGLSLAlphaLocal(local);
890
strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");
891
break;
892
case GR_COMBINE_FACTOR_TEXTURE_ALPHA:
893
strcat(fragment_shader_alpha_combiner, "float alpha_factor = ctexture1.a; \n");
894
break;
895
case GR_COMBINE_FACTOR_ONE:
896
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0; \n");
897
break;
898
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
899
if(need_local) writeGLSLAlphaLocal(local);
900
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");
901
break;
902
case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
903
if(need_other) writeGLSLAlphaOther(other);
904
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_other; \n");
905
break;
906
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
907
if(need_local) writeGLSLAlphaLocal(local);
908
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");
909
break;
910
case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:
911
strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - ctexture1.a; \n");
912
break;
913
default:
914
display_warning("unknown writeGLSLAlphaFactor : %x", factor);
915
}
916
}
917
918
FX_ENTRY void FX_CALL
919
grAlphaCombine(
920
GrCombineFunction_t function, GrCombineFactor_t factor,
921
GrCombineLocal_t local, GrCombineOther_t other,
922
FxBool invert
923
)
924
{
925
LOG("grAlphaCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);
926
static int last_function = 0;
927
static int last_factor = 0;
928
static int last_local = 0;
929
static int last_other = 0;
930
931
if(last_function == function && last_factor == factor &&
932
last_local == local && last_other == other && first_alpha == 0 && !a_combiner_ext) return;
933
first_alpha = 0;
934
a_combiner_ext = 0;
935
936
last_function = function;
937
last_factor = factor;
938
last_local = local;
939
last_other = other;
940
941
if (invert) display_warning("grAlphaCombine : inverted result");
942
943
alpha_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);
944
chroma_other_alpha = other;
945
946
strcpy(fragment_shader_alpha_combiner, "");
947
948
switch(function)
949
{
950
case GR_COMBINE_FUNCTION_ZERO:
951
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = 0.0; \n");
952
break;
953
case GR_COMBINE_FUNCTION_LOCAL:
954
writeGLSLAlphaLocal(local);
955
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");
956
break;
957
case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
958
writeGLSLAlphaLocal(local);
959
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");
960
break;
961
case GR_COMBINE_FUNCTION_SCALE_OTHER:
962
writeGLSLAlphaOther(other);
963
writeGLSLAlphaFactor(factor,local,1,other,0);
964
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other; \n");
965
break;
966
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
967
writeGLSLAlphaLocal(local);
968
writeGLSLAlphaOther(other);
969
writeGLSLAlphaFactor(factor,local,0,other,0);
970
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");
971
break;
972
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
973
writeGLSLAlphaLocal(local);
974
writeGLSLAlphaOther(other);
975
writeGLSLAlphaFactor(factor,local,0,other,0);
976
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");
977
break;
978
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
979
writeGLSLAlphaLocal(local);
980
writeGLSLAlphaOther(other);
981
writeGLSLAlphaFactor(factor,local,0,other,0);
982
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local); \n");
983
break;
984
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
985
writeGLSLAlphaLocal(local);
986
writeGLSLAlphaOther(other);
987
writeGLSLAlphaFactor(factor,local,0,other,0);
988
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");
989
break;
990
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
991
writeGLSLAlphaLocal(local);
992
writeGLSLAlphaOther(other);
993
writeGLSLAlphaFactor(factor,local,0,other,0);
994
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");
995
break;
996
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
997
writeGLSLAlphaLocal(local);
998
writeGLSLAlphaFactor(factor,local,0,other,1);
999
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");
1000
break;
1001
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1002
writeGLSLAlphaLocal(local);
1003
writeGLSLAlphaFactor(factor,local,0,other,1);
1004
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");
1005
break;
1006
default:
1007
display_warning("grAlphaCombine : unknown function : %x", function);
1008
}
1009
1010
//compile_shader();
1011
need_to_compile = 1;
1012
}
1013
1014
void writeGLSLTextureColorFactor(int num_tex, int factor)
1015
{
1016
switch(factor)
1017
{
1018
case GR_COMBINE_FACTOR_ZERO:
1019
if(num_tex == 0)
1020
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");
1021
else
1022
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(0.0); \n");
1023
break;
1024
case GR_COMBINE_FACTOR_LOCAL:
1025
if(num_tex == 0)
1026
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = readtex0; \n");
1027
else
1028
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = readtex1; \n");
1029
break;
1030
case GR_COMBINE_FACTOR_OTHER_ALPHA:
1031
if(num_tex == 0)
1032
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");
1033
else
1034
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(ctexture0.a); \n");
1035
break;
1036
case GR_COMBINE_FACTOR_LOCAL_ALPHA:
1037
if(num_tex == 0)
1038
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(readtex0.a); \n");
1039
else
1040
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(readtex1.a); \n");
1041
break;
1042
case GR_COMBINE_FACTOR_DETAIL_FACTOR:
1043
if(num_tex == 0)
1044
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(lambda); \n");
1045
else
1046
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(lambda); \n");
1047
break;
1048
case GR_COMBINE_FACTOR_ONE:
1049
if(num_tex == 0)
1050
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0); \n");
1051
else
1052
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0); \n");
1053
break;
1054
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
1055
if(num_tex == 0)
1056
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - readtex0; \n");
1057
else
1058
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - readtex1; \n");
1059
break;
1060
case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
1061
if(num_tex == 0)
1062
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(0.0); \n");
1063
else
1064
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(ctexture0.a); \n");
1065
break;
1066
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
1067
if(num_tex == 0)
1068
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(readtex0.a); \n");
1069
else
1070
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(readtex1.a); \n");
1071
break;
1072
case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
1073
if(num_tex == 0)
1074
strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(lambda); \n");
1075
else
1076
strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(lambda); \n");
1077
break;
1078
default:
1079
display_warning("unknown writeGLSLTextureColorFactor : %x", factor);
1080
}
1081
}
1082
1083
void writeGLSLTextureAlphaFactor(int num_tex, int factor)
1084
{
1085
switch(factor)
1086
{
1087
case GR_COMBINE_FACTOR_ZERO:
1088
if(num_tex == 0)
1089
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");
1090
else
1091
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 0.0; \n");
1092
break;
1093
case GR_COMBINE_FACTOR_LOCAL:
1094
if(num_tex == 0)
1095
strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");
1096
else
1097
strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");
1098
break;
1099
case GR_COMBINE_FACTOR_OTHER_ALPHA:
1100
if(num_tex == 0)
1101
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");
1102
else
1103
strcat(fragment_shader_texture1, "float texture1_alpha_factor = ctexture0.a; \n");
1104
break;
1105
case GR_COMBINE_FACTOR_LOCAL_ALPHA:
1106
if(num_tex == 0)
1107
strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");
1108
else
1109
strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");
1110
break;
1111
case GR_COMBINE_FACTOR_DETAIL_FACTOR:
1112
if(num_tex == 0)
1113
strcat(fragment_shader_texture0, "float texture0_alpha_factor = lambda; \n");
1114
else
1115
strcat(fragment_shader_texture1, "float texture1_alpha_factor = lambda; \n");
1116
break;
1117
case GR_COMBINE_FACTOR_ONE:
1118
if(num_tex == 0)
1119
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0; \n");
1120
else
1121
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0; \n");
1122
break;
1123
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:
1124
if(num_tex == 0)
1125
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");
1126
else
1127
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");
1128
break;
1129
case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:
1130
if(num_tex == 0)
1131
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - 0.0; \n");
1132
else
1133
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - ctexture0.a; \n");
1134
break;
1135
case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:
1136
if(num_tex == 0)
1137
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");
1138
else
1139
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");
1140
break;
1141
case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:
1142
if(num_tex == 0)
1143
strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - lambda; \n");
1144
else
1145
strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - lambda; \n");
1146
break;
1147
default:
1148
display_warning("unknown writeGLSLTextureAlphaFactor : %x", factor);
1149
}
1150
}
1151
1152
FX_ENTRY void FX_CALL
1153
grTexCombine(
1154
GrChipID_t tmu,
1155
GrCombineFunction_t rgb_function,
1156
GrCombineFactor_t rgb_factor,
1157
GrCombineFunction_t alpha_function,
1158
GrCombineFactor_t alpha_factor,
1159
FxBool rgb_invert,
1160
FxBool alpha_invert
1161
)
1162
{
1163
LOG("grTexCombine(%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, rgb_function, rgb_factor, alpha_function, alpha_factor, rgb_invert, alpha_invert);
1164
int num_tex;
1165
1166
if (tmu == GR_TMU0) num_tex = 1;
1167
else num_tex = 0;
1168
1169
if(num_tex == 0)
1170
{
1171
static int last_function = 0;
1172
static int last_factor = 0;
1173
static int last_afunction = 0;
1174
static int last_afactor = 0;
1175
static int last_rgb_invert = 0;
1176
1177
if(last_function == rgb_function && last_factor == rgb_factor &&
1178
last_afunction == alpha_function && last_afactor == alpha_factor &&
1179
last_rgb_invert == rgb_invert && first_texture0 == 0 && !tex0_combiner_ext) return;
1180
first_texture0 = 0;
1181
tex0_combiner_ext = 0;
1182
1183
last_function = rgb_function;
1184
last_factor = rgb_factor;
1185
last_afunction = alpha_function;
1186
last_afactor = alpha_factor;
1187
last_rgb_invert= rgb_invert;
1188
texture0_combiner_key = rgb_function | (rgb_factor << 4) |
1189
(alpha_function << 8) | (alpha_factor << 12) |
1190
(rgb_invert << 16);
1191
texture0_combinera_key = 0;
1192
strcpy(fragment_shader_texture0, "");
1193
}
1194
else
1195
{
1196
static int last_function = 0;
1197
static int last_factor = 0;
1198
static int last_afunction = 0;
1199
static int last_afactor = 0;
1200
static int last_rgb_invert = 0;
1201
1202
if(last_function == rgb_function && last_factor == rgb_factor &&
1203
last_afunction == alpha_function && last_afactor == alpha_factor &&
1204
last_rgb_invert == rgb_invert && first_texture1 == 0 && !tex1_combiner_ext) return;
1205
first_texture1 = 0;
1206
tex1_combiner_ext = 0;
1207
1208
last_function = rgb_function;
1209
last_factor = rgb_factor;
1210
last_afunction = alpha_function;
1211
last_afactor = alpha_factor;
1212
last_rgb_invert = rgb_invert;
1213
1214
texture1_combiner_key = rgb_function | (rgb_factor << 4) |
1215
(alpha_function << 8) | (alpha_factor << 12) |
1216
(rgb_invert << 16);
1217
texture1_combinera_key = 0;
1218
strcpy(fragment_shader_texture1, "");
1219
}
1220
1221
switch(rgb_function)
1222
{
1223
case GR_COMBINE_FUNCTION_ZERO:
1224
if(num_tex == 0)
1225
strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(0.0); \n");
1226
else
1227
strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(0.0); \n");
1228
break;
1229
case GR_COMBINE_FUNCTION_LOCAL:
1230
if(num_tex == 0)
1231
strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");
1232
else
1233
strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");
1234
break;
1235
case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
1236
if(num_tex == 0)
1237
strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(readtex0.a); \n");
1238
else
1239
strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(readtex1.a); \n");
1240
break;
1241
case GR_COMBINE_FUNCTION_SCALE_OTHER:
1242
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1243
if(num_tex == 0)
1244
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0); \n");
1245
else
1246
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0; \n");
1247
break;
1248
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
1249
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1250
if(num_tex == 0)
1251
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + readtex0; \n");
1252
else
1253
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + readtex1; \n");
1254
break;
1255
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
1256
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1257
if(num_tex == 0)
1258
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + vec4(readtex0.a); \n");
1259
else
1260
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + vec4(readtex1.a); \n");
1261
break;
1262
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
1263
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1264
if(num_tex == 0)
1265
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0); \n");
1266
else
1267
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1); \n");
1268
break;
1269
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
1270
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1271
if(num_tex == 0)
1272
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + readtex0; \n");
1273
else
1274
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + readtex1; \n");
1275
break;
1276
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1277
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1278
if(num_tex == 0)
1279
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + vec4(readtex0.a); \n");
1280
else
1281
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + vec4(readtex1.a); \n");
1282
break;
1283
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
1284
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1285
if(num_tex == 0)
1286
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + readtex0; \n");
1287
else
1288
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + readtex1; \n");
1289
break;
1290
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1291
writeGLSLTextureColorFactor(num_tex, rgb_factor);
1292
if(num_tex == 0)
1293
strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + vec4(readtex0.a); \n");
1294
else
1295
strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + vec4(readtex1.a); \n");
1296
break;
1297
default:
1298
if(num_tex == 0)
1299
strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");
1300
else
1301
strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");
1302
display_warning("grTextCombine : unknown rgb function : %x", rgb_function);
1303
}
1304
1305
if (rgb_invert)
1306
{
1307
if(num_tex == 0)
1308
strcat(fragment_shader_texture0, "ctexture0 = vec4(1.0) - ctexture0; \n");
1309
else
1310
strcat(fragment_shader_texture1, "ctexture1 = vec4(1.0) - ctexture1; \n");
1311
}
1312
1313
switch(alpha_function)
1314
{
1315
case GR_COMBINE_FACTOR_ZERO:
1316
if(num_tex == 0)
1317
strcat(fragment_shader_texture0, "ctexture0.a = 0.0; \n");
1318
else
1319
strcat(fragment_shader_texture1, "ctexture1.a = 0.0; \n");
1320
break;
1321
case GR_COMBINE_FUNCTION_LOCAL:
1322
if(num_tex == 0)
1323
strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1324
else
1325
strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");
1326
break;
1327
case GR_COMBINE_FUNCTION_LOCAL_ALPHA:
1328
if(num_tex == 0)
1329
strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1330
else
1331
strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");
1332
break;
1333
case GR_COMBINE_FUNCTION_SCALE_OTHER:
1334
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1335
if(num_tex == 0)
1336
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0; \n");
1337
else
1338
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a; \n");
1339
break;
1340
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:
1341
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1342
if(num_tex == 0)
1343
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");
1344
else
1345
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");
1346
break;
1347
case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:
1348
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1349
if(num_tex == 0)
1350
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");
1351
else
1352
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");
1353
break;
1354
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:
1355
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1356
if(num_tex == 0)
1357
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a); \n");
1358
else
1359
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a); \n");
1360
break;
1361
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:
1362
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1363
if(num_tex == 0)
1364
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");
1365
else
1366
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");
1367
break;
1368
case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1369
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1370
if(num_tex == 0)
1371
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");
1372
else
1373
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");
1374
break;
1375
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:
1376
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1377
if(num_tex == 0)
1378
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");
1379
else
1380
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");
1381
break;
1382
case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:
1383
writeGLSLTextureAlphaFactor(num_tex, alpha_factor);
1384
if(num_tex == 0)
1385
strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");
1386
else
1387
strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");
1388
break;
1389
default:
1390
if(num_tex == 0)
1391
strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");
1392
else
1393
strcat(fragment_shader_texture1, "ctexture1.a = ctexture0.a; \n");
1394
display_warning("grTextCombine : unknown alpha function : %x", alpha_function);
1395
}
1396
1397
if (alpha_invert)
1398
{
1399
if(num_tex == 0)
1400
strcat(fragment_shader_texture0, "ctexture0.a = 1.0 - ctexture0.a; \n");
1401
else
1402
strcat(fragment_shader_texture1, "ctexture1.a = 1.0 - ctexture1.a; \n");
1403
}
1404
need_to_compile = 1;
1405
}
1406
1407
FX_ENTRY void FX_CALL
1408
grAlphaBlendFunction(
1409
GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df,
1410
GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df
1411
)
1412
{
1413
int sfactorRGB = 0, dfactorRGB = 0, sfactorAlpha = 0, dfactorAlpha = 0;
1414
LOG("grAlphaBlendFunction(%d,%d,%d,%d)\r\n", rgb_sf, rgb_df, alpha_sf, alpha_df);
1415
1416
switch(rgb_sf)
1417
{
1418
case GR_BLEND_ZERO:
1419
sfactorRGB = GL_ZERO;
1420
break;
1421
case GR_BLEND_SRC_ALPHA:
1422
sfactorRGB = GL_SRC_ALPHA;
1423
break;
1424
case GR_BLEND_ONE:
1425
sfactorRGB = GL_ONE;
1426
break;
1427
case GR_BLEND_ONE_MINUS_SRC_ALPHA:
1428
sfactorRGB = GL_ONE_MINUS_SRC_ALPHA;
1429
break;
1430
default:
1431
display_warning("grAlphaBlendFunction : rgb_sf = %x", rgb_sf);
1432
}
1433
1434
switch(rgb_df)
1435
{
1436
case GR_BLEND_ZERO:
1437
dfactorRGB = GL_ZERO;
1438
break;
1439
case GR_BLEND_SRC_ALPHA:
1440
dfactorRGB = GL_SRC_ALPHA;
1441
break;
1442
case GR_BLEND_ONE:
1443
dfactorRGB = GL_ONE;
1444
break;
1445
case GR_BLEND_ONE_MINUS_SRC_ALPHA:
1446
dfactorRGB = GL_ONE_MINUS_SRC_ALPHA;
1447
break;
1448
default:
1449
display_warning("grAlphaBlendFunction : rgb_df = %x", rgb_df);
1450
}
1451
1452
switch(alpha_sf)
1453
{
1454
case GR_BLEND_ZERO:
1455
sfactorAlpha = GL_ZERO;
1456
break;
1457
case GR_BLEND_ONE:
1458
sfactorAlpha = GL_ONE;
1459
break;
1460
default:
1461
display_warning("grAlphaBlendFunction : alpha_sf = %x", alpha_sf);
1462
}
1463
1464
switch(alpha_df)
1465
{
1466
case GR_BLEND_ZERO:
1467
dfactorAlpha = GL_ZERO;
1468
break;
1469
case GR_BLEND_ONE:
1470
dfactorAlpha = GL_ONE;
1471
break;
1472
default:
1473
display_warning("grAlphaBlendFunction : alpha_df = %x", alpha_df);
1474
}
1475
glEnable(GL_BLEND);
1476
if (blend_func_separate_support)
1477
glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
1478
else
1479
glBlendFunc(sfactorRGB, dfactorRGB);
1480
}
1481
1482
FX_ENTRY void FX_CALL
1483
grAlphaTestReferenceValue( GrAlpha_t value )
1484
{
1485
LOG("grAlphaTestReferenceValue(%d)\r\n", value);
1486
alpha_ref = value;
1487
grAlphaTestFunction(alpha_func);
1488
}
1489
1490
FX_ENTRY void FX_CALL
1491
grAlphaTestFunction( GrCmpFnc_t function )
1492
{
1493
LOG("grAlphaTestFunction(%d)\r\n", function);
1494
alpha_func = function;
1495
switch(function)
1496
{
1497
case GR_CMP_GREATER:
1498
glAlphaFunc(GL_GREATER, alpha_ref/255.0f);
1499
break;
1500
case GR_CMP_GEQUAL:
1501
glAlphaFunc(GL_GEQUAL, alpha_ref/255.0f);
1502
break;
1503
case GR_CMP_ALWAYS:
1504
glAlphaFunc(GL_ALWAYS, alpha_ref/255.0f);
1505
glDisable(GL_ALPHA_TEST);
1506
return;
1507
break;
1508
default:
1509
display_warning("grAlphaTestFunction : unknown function : %x", function);
1510
}
1511
glEnable(GL_ALPHA_TEST);
1512
}
1513
1514
// fog
1515
1516
FX_ENTRY void FX_CALL
1517
grFogMode( GrFogMode_t mode )
1518
{
1519
LOG("grFogMode(%d)\r\n", mode);
1520
switch(mode)
1521
{
1522
case GR_FOG_DISABLE:
1523
glDisable(GL_FOG);
1524
fog_enabled = 0;
1525
break;
1526
case GR_FOG_WITH_TABLE_ON_Q:
1527
glEnable(GL_FOG);
1528
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1529
fog_enabled = 1;
1530
break;
1531
case GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT:
1532
glEnable(GL_FOG);
1533
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1534
fog_enabled = 2;
1535
break;
1536
default:
1537
display_warning("grFogMode : unknown mode : %x", mode);
1538
}
1539
need_to_compile = 1;
1540
}
1541
1542
FX_ENTRY float FX_CALL
1543
guFogTableIndexToW( int i )
1544
{
1545
LOG("guFogTableIndexToW(%d)\r\n", i);
1546
return (float)(pow(2.0, 3.0+(double)(i>>2)) / (8-(i&3)));
1547
}
1548
1549
FX_ENTRY void FX_CALL
1550
guFogGenerateLinear(GrFog_t *fogtable,
1551
float nearZ, float farZ )
1552
{
1553
LOG("guFogGenerateLinear(%f,%f)\r\n", nearZ, farZ);
1554
glFogi(GL_FOG_MODE, GL_LINEAR);
1555
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
1556
glFogf(GL_FOG_START, nearZ / 255.0f);
1557
glFogf(GL_FOG_END, farZ / 255.0f);
1558
}
1559
1560
FX_ENTRY void FX_CALL
1561
grFogTable( const GrFog_t ft[] )
1562
{
1563
LOG("grFogTable()\r\n");
1564
}
1565
1566
FX_ENTRY void FX_CALL
1567
grFogColorValue( GrColor_t fogcolor )
1568
{
1569
float color[4];
1570
LOG("grFogColorValue(%x)\r\n", fogcolor);
1571
1572
switch(lfb_color_fmt)
1573
{
1574
case GR_COLORFORMAT_ARGB:
1575
color[3] = ((fogcolor >> 24) & 0xFF) / 255.0f;
1576
color[0] = ((fogcolor >> 16) & 0xFF) / 255.0f;
1577
color[1] = ((fogcolor >> 8) & 0xFF) / 255.0f;
1578
color[2] = (fogcolor & 0xFF) / 255.0f;
1579
break;
1580
case GR_COLORFORMAT_RGBA:
1581
color[0] = ((fogcolor >> 24) & 0xFF) / 255.0f;
1582
color[1] = ((fogcolor >> 16) & 0xFF) / 255.0f;
1583
color[2] = ((fogcolor >> 8) & 0xFF) / 255.0f;
1584
color[3] = (fogcolor & 0xFF) / 255.0f;
1585
break;
1586
default:
1587
display_warning("grFogColorValue: unknown color format : %x", lfb_color_fmt);
1588
}
1589
1590
glFogfv(GL_FOG_COLOR, color);
1591
}
1592
1593
// chroma
1594
1595
FX_ENTRY void FX_CALL
1596
grChromakeyMode( GrChromakeyMode_t mode )
1597
{
1598
LOG("grChromakeyMode(%d)\r\n", mode);
1599
switch(mode)
1600
{
1601
case GR_CHROMAKEY_DISABLE:
1602
chroma_enabled = 0;
1603
break;
1604
case GR_CHROMAKEY_ENABLE:
1605
chroma_enabled = 1;
1606
break;
1607
default:
1608
display_warning("grChromakeyMode : unknown mode : %x", mode);
1609
}
1610
need_to_compile = 1;
1611
}
1612
1613
FX_ENTRY void FX_CALL
1614
grChromakeyValue( GrColor_t value )
1615
{
1616
LOG("grChromakeyValue(%x)\r\n", value);
1617
int chroma_color_location;
1618
1619
switch(lfb_color_fmt)
1620
{
1621
case GR_COLORFORMAT_ARGB:
1622
chroma_color[3] = 1.0;//((value >> 24) & 0xFF) / 255.0f;
1623
chroma_color[0] = ((value >> 16) & 0xFF) / 255.0f;
1624
chroma_color[1] = ((value >> 8) & 0xFF) / 255.0f;
1625
chroma_color[2] = (value & 0xFF) / 255.0f;
1626
break;
1627
case GR_COLORFORMAT_RGBA:
1628
chroma_color[0] = ((value >> 24) & 0xFF) / 255.0f;
1629
chroma_color[1] = ((value >> 16) & 0xFF) / 255.0f;
1630
chroma_color[2] = ((value >> 8) & 0xFF) / 255.0f;
1631
chroma_color[3] = 1.0;//(value & 0xFF) / 255.0f;
1632
break;
1633
default:
1634
display_warning("grChromakeyValue: unknown color format : %x", lfb_color_fmt);
1635
}
1636
1637
chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");
1638
glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],
1639
chroma_color[2], chroma_color[3]);
1640
}
1641
1642
static void setPattern()
1643
{
1644
int i;
1645
GLubyte stip[32*4];
1646
for(i=0; i<32; i++)
1647
{
1648
unsigned int val = (rand() << 17) | ((rand() & 1) << 16) | (rand() << 1) | (rand() & 1);
1649
stip[i*4+0] = (val >> 24) & 0xFF;
1650
stip[i*4+1] = (val >> 16) & 0xFF;
1651
stip[i*4+2] = (val >> 8) & 0xFF;
1652
stip[i*4+3] = val & 0xFF;
1653
}
1654
GLubyte texture[32*32*4];
1655
for(i=0; i<32; i++)
1656
{
1657
int j;
1658
for(j=0; j<4; j++)
1659
{
1660
texture[(i*32+j*8+0)*4+3] = ((stip[i*4+j] >> 7) & 1) ? 255 : 0;
1661
texture[(i*32+j*8+1)*4+3] = ((stip[i*4+j] >> 6) & 1) ? 255 : 0;
1662
texture[(i*32+j*8+2)*4+3] = ((stip[i*4+j] >> 5) & 1) ? 255 : 0;
1663
texture[(i*32+j*8+3)*4+3] = ((stip[i*4+j] >> 4) & 1) ? 255 : 0;
1664
texture[(i*32+j*8+4)*4+3] = ((stip[i*4+j] >> 3) & 1) ? 255 : 0;
1665
texture[(i*32+j*8+5)*4+3] = ((stip[i*4+j] >> 2) & 1) ? 255 : 0;
1666
texture[(i*32+j*8+6)*4+3] = ((stip[i*4+j] >> 1) & 1) ? 255 : 0;
1667
texture[(i*32+j*8+7)*4+3] = ((stip[i*4+j] >> 0) & 1) ? 255 : 0;
1668
}
1669
}
1670
glActiveTextureARB(GL_TEXTURE2_ARB);
1671
glEnable(GL_TEXTURE_2D);
1672
glBindTexture(GL_TEXTURE_2D, 33*1024*1024);
1673
glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
1674
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1675
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1676
glDisable(GL_TEXTURE_2D);
1677
}
1678
1679
FX_ENTRY void FX_CALL
1680
grStipplePattern(
1681
GrStipplePattern_t stipple)
1682
{
1683
LOG("grStipplePattern(%x)\r\n", stipple);
1684
srand(stipple);
1685
setPattern();
1686
}
1687
1688
FX_ENTRY void FX_CALL
1689
grStippleMode( GrStippleMode_t mode )
1690
{
1691
LOG("grStippleMode(%d)\r\n", mode);
1692
switch(mode)
1693
{
1694
case GR_STIPPLE_DISABLE:
1695
dither_enabled = 0;
1696
glActiveTextureARB(GL_TEXTURE2_ARB);
1697
glDisable(GL_TEXTURE_2D);
1698
break;
1699
case GR_STIPPLE_PATTERN:
1700
setPattern();
1701
dither_enabled = 1;
1702
glActiveTextureARB(GL_TEXTURE2_ARB);
1703
glEnable(GL_TEXTURE_2D);
1704
break;
1705
case GR_STIPPLE_ROTATE:
1706
setPattern();
1707
dither_enabled = 1;
1708
glActiveTextureARB(GL_TEXTURE2_ARB);
1709
glEnable(GL_TEXTURE_2D);
1710
break;
1711
default:
1712
display_warning("grStippleMode:%x", mode);
1713
}
1714
need_to_compile = 1;
1715
}
1716
1717
FX_ENTRY void FX_CALL
1718
grColorCombineExt(GrCCUColor_t a, GrCombineMode_t a_mode,
1719
GrCCUColor_t b, GrCombineMode_t b_mode,
1720
GrCCUColor_t c, FxBool c_invert,
1721
GrCCUColor_t d, FxBool d_invert,
1722
FxU32 shift, FxBool invert)
1723
{
1724
LOG("grColorCombineExt(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\r\n", a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
1725
if (invert) display_warning("grColorCombineExt : inverted result");
1726
if (shift) display_warning("grColorCombineExt : shift = %d", shift);
1727
1728
color_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
1729
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
1730
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
1731
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
1732
c_combiner_ext = 1;
1733
strcpy(fragment_shader_color_combiner, "");
1734
1735
switch(a)
1736
{
1737
case GR_CMBX_ZERO:
1738
strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");
1739
break;
1740
case GR_CMBX_TEXTURE_ALPHA:
1741
strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(ctexture1.a); \n");
1742
break;
1743
case GR_CMBX_CONSTANT_ALPHA:
1744
strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(constant_color.a); \n");
1745
break;
1746
case GR_CMBX_CONSTANT_COLOR:
1747
strcat(fragment_shader_color_combiner, "vec4 cs_a = constant_color; \n");
1748
break;
1749
case GR_CMBX_ITALPHA:
1750
strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(gl_Color.a); \n");
1751
break;
1752
case GR_CMBX_ITRGB:
1753
strcat(fragment_shader_color_combiner, "vec4 cs_a = gl_Color; \n");
1754
break;
1755
case GR_CMBX_TEXTURE_RGB:
1756
strcat(fragment_shader_color_combiner, "vec4 cs_a = ctexture1; \n");
1757
break;
1758
default:
1759
display_warning("grColorCombineExt : a = %x", a);
1760
strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");
1761
}
1762
1763
switch(a_mode)
1764
{
1765
case GR_FUNC_MODE_ZERO:
1766
strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");
1767
break;
1768
case GR_FUNC_MODE_X:
1769
strcat(fragment_shader_color_combiner, "vec4 c_a = cs_a; \n");
1770
break;
1771
case GR_FUNC_MODE_ONE_MINUS_X:
1772
strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(1.0) - cs_a; \n");
1773
break;
1774
case GR_FUNC_MODE_NEGATIVE_X:
1775
strcat(fragment_shader_color_combiner, "vec4 c_a = -cs_a; \n");
1776
break;
1777
default:
1778
display_warning("grColorCombineExt : a_mode = %x", a_mode);
1779
strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");
1780
}
1781
1782
switch(b)
1783
{
1784
case GR_CMBX_ZERO:
1785
strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");
1786
break;
1787
case GR_CMBX_TEXTURE_ALPHA:
1788
strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(ctexture1.a); \n");
1789
break;
1790
case GR_CMBX_CONSTANT_ALPHA:
1791
strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(constant_color.a); \n");
1792
break;
1793
case GR_CMBX_CONSTANT_COLOR:
1794
strcat(fragment_shader_color_combiner, "vec4 cs_b = constant_color; \n");
1795
break;
1796
case GR_CMBX_ITALPHA:
1797
strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(gl_Color.a); \n");
1798
break;
1799
case GR_CMBX_ITRGB:
1800
strcat(fragment_shader_color_combiner, "vec4 cs_b = gl_Color; \n");
1801
break;
1802
case GR_CMBX_TEXTURE_RGB:
1803
strcat(fragment_shader_color_combiner, "vec4 cs_b = ctexture1; \n");
1804
break;
1805
default:
1806
display_warning("grColorCombineExt : b = %x", b);
1807
strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");
1808
}
1809
1810
switch(b_mode)
1811
{
1812
case GR_FUNC_MODE_ZERO:
1813
strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");
1814
break;
1815
case GR_FUNC_MODE_X:
1816
strcat(fragment_shader_color_combiner, "vec4 c_b = cs_b; \n");
1817
break;
1818
case GR_FUNC_MODE_ONE_MINUS_X:
1819
strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(1.0) - cs_b; \n");
1820
break;
1821
case GR_FUNC_MODE_NEGATIVE_X:
1822
strcat(fragment_shader_color_combiner, "vec4 c_b = -cs_b; \n");
1823
break;
1824
default:
1825
display_warning("grColorCombineExt : b_mode = %x", b_mode);
1826
strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");
1827
}
1828
1829
switch(c)
1830
{
1831
case GR_CMBX_ZERO:
1832
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");
1833
break;
1834
case GR_CMBX_TEXTURE_ALPHA:
1835
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(ctexture1.a); \n");
1836
break;
1837
case GR_CMBX_ALOCAL:
1838
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_b.a); \n");
1839
break;
1840
case GR_CMBX_AOTHER:
1841
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_a.a); \n");
1842
break;
1843
case GR_CMBX_B:
1844
strcat(fragment_shader_color_combiner, "vec4 c_c = cs_b; \n");
1845
break;
1846
case GR_CMBX_CONSTANT_ALPHA:
1847
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(constant_color.a); \n");
1848
break;
1849
case GR_CMBX_CONSTANT_COLOR:
1850
strcat(fragment_shader_color_combiner, "vec4 c_c = constant_color; \n");
1851
break;
1852
case GR_CMBX_ITALPHA:
1853
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(gl_Color.a); \n");
1854
break;
1855
case GR_CMBX_ITRGB:
1856
strcat(fragment_shader_color_combiner, "vec4 c_c = gl_Color; \n");
1857
break;
1858
case GR_CMBX_TEXTURE_RGB:
1859
strcat(fragment_shader_color_combiner, "vec4 c_c = ctexture1; \n");
1860
break;
1861
default:
1862
display_warning("grColorCombineExt : c = %x", c);
1863
strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");
1864
}
1865
1866
if(c_invert)
1867
strcat(fragment_shader_color_combiner, "c_c = vec4(1.0) - c_c; \n");
1868
1869
switch(d)
1870
{
1871
case GR_CMBX_ZERO:
1872
strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");
1873
break;
1874
case GR_CMBX_ALOCAL:
1875
strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(c_b.a); \n");
1876
break;
1877
case GR_CMBX_B:
1878
strcat(fragment_shader_color_combiner, "vec4 c_d = cs_b; \n");
1879
break;
1880
case GR_CMBX_TEXTURE_RGB:
1881
strcat(fragment_shader_color_combiner, "vec4 c_d = ctexture1; \n");
1882
break;
1883
case GR_CMBX_ITRGB:
1884
strcat(fragment_shader_color_combiner, "vec4 c_d = gl_Color; \n");
1885
break;
1886
default:
1887
display_warning("grColorCombineExt : d = %x", d);
1888
strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");
1889
}
1890
1891
if(d_invert)
1892
strcat(fragment_shader_color_combiner, "c_d = vec4(1.0) - c_d; \n");
1893
1894
strcat(fragment_shader_color_combiner, "gl_FragColor = (c_a + c_b) * c_c + c_d; \n");
1895
1896
need_to_compile = 1;
1897
}
1898
1899
FX_ENTRY void FX_CALL
1900
grAlphaCombineExt(GrACUColor_t a, GrCombineMode_t a_mode,
1901
GrACUColor_t b, GrCombineMode_t b_mode,
1902
GrACUColor_t c, FxBool c_invert,
1903
GrACUColor_t d, FxBool d_invert,
1904
FxU32 shift, FxBool invert)
1905
{
1906
LOG("grAlphaCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
1907
if (invert) display_warning("grAlphaCombineExt : inverted result");
1908
if (shift) display_warning("grAlphaCombineExt : shift = %d", shift);
1909
1910
alpha_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
1911
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
1912
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
1913
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
1914
a_combiner_ext = 1;
1915
strcpy(fragment_shader_alpha_combiner, "");
1916
1917
switch(a)
1918
{
1919
case GR_CMBX_ZERO:
1920
strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");
1921
break;
1922
case GR_CMBX_TEXTURE_ALPHA:
1923
strcat(fragment_shader_alpha_combiner, "float as_a = ctexture1.a; \n");
1924
break;
1925
case GR_CMBX_CONSTANT_ALPHA:
1926
strcat(fragment_shader_alpha_combiner, "float as_a = constant_color.a; \n");
1927
break;
1928
case GR_CMBX_ITALPHA:
1929
strcat(fragment_shader_alpha_combiner, "float as_a = gl_Color.a; \n");
1930
break;
1931
default:
1932
display_warning("grAlphaCombineExt : a = %x", a);
1933
strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");
1934
}
1935
1936
switch(a_mode)
1937
{
1938
case GR_FUNC_MODE_ZERO:
1939
strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");
1940
break;
1941
case GR_FUNC_MODE_X:
1942
strcat(fragment_shader_alpha_combiner, "float a_a = as_a; \n");
1943
break;
1944
case GR_FUNC_MODE_ONE_MINUS_X:
1945
strcat(fragment_shader_alpha_combiner, "float a_a = 1.0 - as_a; \n");
1946
break;
1947
case GR_FUNC_MODE_NEGATIVE_X:
1948
strcat(fragment_shader_alpha_combiner, "float a_a = -as_a; \n");
1949
break;
1950
default:
1951
display_warning("grAlphaCombineExt : a_mode = %x", a_mode);
1952
strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");
1953
}
1954
1955
switch(b)
1956
{
1957
case GR_CMBX_ZERO:
1958
strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");
1959
break;
1960
case GR_CMBX_TEXTURE_ALPHA:
1961
strcat(fragment_shader_alpha_combiner, "float as_b = ctexture1.a; \n");
1962
break;
1963
case GR_CMBX_CONSTANT_ALPHA:
1964
strcat(fragment_shader_alpha_combiner, "float as_b = constant_color.a; \n");
1965
break;
1966
case GR_CMBX_ITALPHA:
1967
strcat(fragment_shader_alpha_combiner, "float as_b = gl_Color.a; \n");
1968
break;
1969
default:
1970
display_warning("grAlphaCombineExt : b = %x", b);
1971
strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");
1972
}
1973
1974
switch(b_mode)
1975
{
1976
case GR_FUNC_MODE_ZERO:
1977
strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");
1978
break;
1979
case GR_FUNC_MODE_X:
1980
strcat(fragment_shader_alpha_combiner, "float a_b = as_b; \n");
1981
break;
1982
case GR_FUNC_MODE_ONE_MINUS_X:
1983
strcat(fragment_shader_alpha_combiner, "float a_b = 1.0 - as_b; \n");
1984
break;
1985
case GR_FUNC_MODE_NEGATIVE_X:
1986
strcat(fragment_shader_alpha_combiner, "float a_b = -as_b; \n");
1987
break;
1988
default:
1989
display_warning("grAlphaCombineExt : b_mode = %x", b_mode);
1990
strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");
1991
}
1992
1993
switch(c)
1994
{
1995
case GR_CMBX_ZERO:
1996
strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");
1997
break;
1998
case GR_CMBX_TEXTURE_ALPHA:
1999
strcat(fragment_shader_alpha_combiner, "float a_c = ctexture1.a; \n");
2000
break;
2001
case GR_CMBX_ALOCAL:
2002
strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");
2003
break;
2004
case GR_CMBX_AOTHER:
2005
strcat(fragment_shader_alpha_combiner, "float a_c = as_a; \n");
2006
break;
2007
case GR_CMBX_B:
2008
strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");
2009
break;
2010
case GR_CMBX_CONSTANT_ALPHA:
2011
strcat(fragment_shader_alpha_combiner, "float a_c = constant_color.a; \n");
2012
break;
2013
case GR_CMBX_ITALPHA:
2014
strcat(fragment_shader_alpha_combiner, "float a_c = gl_Color.a; \n");
2015
break;
2016
default:
2017
display_warning("grAlphaCombineExt : c = %x", c);
2018
strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");
2019
}
2020
2021
if(c_invert)
2022
strcat(fragment_shader_alpha_combiner, "a_c = 1.0 - a_c; \n");
2023
2024
switch(d)
2025
{
2026
case GR_CMBX_ZERO:
2027
strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");
2028
break;
2029
case GR_CMBX_TEXTURE_ALPHA:
2030
strcat(fragment_shader_alpha_combiner, "float a_d = ctexture1.a; \n");
2031
break;
2032
case GR_CMBX_ALOCAL:
2033
strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");
2034
break;
2035
case GR_CMBX_B:
2036
strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");
2037
break;
2038
default:
2039
display_warning("grAlphaCombineExt : d = %x", d);
2040
strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");
2041
}
2042
2043
if(d_invert)
2044
strcat(fragment_shader_alpha_combiner, "a_d = 1.0 - a_d; \n");
2045
2046
strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = (a_a + a_b) * a_c + a_d; \n");
2047
2048
need_to_compile = 1;
2049
}
2050
2051
FX_ENTRY void FX_CALL
2052
grTexColorCombineExt(GrChipID_t tmu,
2053
GrTCCUColor_t a, GrCombineMode_t a_mode,
2054
GrTCCUColor_t b, GrCombineMode_t b_mode,
2055
GrTCCUColor_t c, FxBool c_invert,
2056
GrTCCUColor_t d, FxBool d_invert,
2057
FxU32 shift, FxBool invert)
2058
{
2059
int num_tex;
2060
LOG("grTexColorCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
2061
2062
if (invert) display_warning("grTexColorCombineExt : inverted result");
2063
if (shift) display_warning("grTexColorCombineExt : shift = %d", shift);
2064
2065
if (tmu == GR_TMU0) num_tex = 1;
2066
else num_tex = 0;
2067
2068
if(num_tex == 0)
2069
{
2070
texture0_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2071
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2072
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2073
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2074
tex0_combiner_ext = 1;
2075
strcpy(fragment_shader_texture0, "");
2076
}
2077
else
2078
{
2079
texture1_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2080
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2081
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2082
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2083
tex1_combiner_ext = 1;
2084
strcpy(fragment_shader_texture1, "");
2085
}
2086
2087
switch(a)
2088
{
2089
case GR_CMBX_ZERO:
2090
if(num_tex == 0)
2091
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2092
else
2093
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");
2094
break;
2095
case GR_CMBX_ITALPHA:
2096
if(num_tex == 0)
2097
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(gl_Color.a); \n");
2098
else
2099
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(gl_Color.a); \n");
2100
break;
2101
case GR_CMBX_ITRGB:
2102
if(num_tex == 0)
2103
strcat(fragment_shader_texture0, "vec4 ctex0s_a = gl_Color; \n");
2104
else
2105
strcat(fragment_shader_texture1, "vec4 ctex1s_a = gl_Color; \n");
2106
break;
2107
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2108
if(num_tex == 0)
2109
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(readtex0.a); \n");
2110
else
2111
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(readtex1.a); \n");
2112
break;
2113
case GR_CMBX_LOCAL_TEXTURE_RGB:
2114
if(num_tex == 0)
2115
strcat(fragment_shader_texture0, "vec4 ctex0s_a = readtex0; \n");
2116
else
2117
strcat(fragment_shader_texture1, "vec4 ctex1s_a = readtex1; \n");
2118
break;
2119
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2120
if(num_tex == 0)
2121
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2122
else
2123
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ctexture0.a); \n");
2124
break;
2125
case GR_CMBX_OTHER_TEXTURE_RGB:
2126
if(num_tex == 0)
2127
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2128
else
2129
strcat(fragment_shader_texture1, "vec4 ctex1s_a = ctexture0; \n");
2130
break;
2131
case GR_CMBX_TMU_CCOLOR:
2132
if(num_tex == 0)
2133
strcat(fragment_shader_texture0, "vec4 ctex0s_a = ccolor0; \n");
2134
else
2135
strcat(fragment_shader_texture1, "vec4 ctex1s_a = ccolor1; \n");
2136
break;
2137
case GR_CMBX_TMU_CALPHA:
2138
if(num_tex == 0)
2139
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(ccolor0.a); \n");
2140
else
2141
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ccolor1.a); \n");
2142
break;
2143
default:
2144
display_warning("grTexColorCombineExt : a = %x", a);
2145
if(num_tex == 0)
2146
strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");
2147
else
2148
strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");
2149
}
2150
2151
switch(a_mode)
2152
{
2153
case GR_FUNC_MODE_ZERO:
2154
if(num_tex == 0)
2155
strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");
2156
else
2157
strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");
2158
break;
2159
case GR_FUNC_MODE_X:
2160
if(num_tex == 0)
2161
strcat(fragment_shader_texture0, "vec4 ctex0_a = ctex0s_a; \n");
2162
else
2163
strcat(fragment_shader_texture1, "vec4 ctex1_a = ctex1s_a; \n");
2164
break;
2165
case GR_FUNC_MODE_ONE_MINUS_X:
2166
if(num_tex == 0)
2167
strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(1.0) - ctex0s_a; \n");
2168
else
2169
strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(1.0) - ctex1s_a; \n");
2170
break;
2171
case GR_FUNC_MODE_NEGATIVE_X:
2172
if(num_tex == 0)
2173
strcat(fragment_shader_texture0, "vec4 ctex0_a = -ctex0s_a; \n");
2174
else
2175
strcat(fragment_shader_texture1, "vec4 ctex1_a = -ctex1s_a; \n");
2176
break;
2177
default:
2178
display_warning("grTexColorCombineExt : a_mode = %x", a_mode);
2179
if(num_tex == 0)
2180
strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");
2181
else
2182
strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");
2183
}
2184
2185
switch(b)
2186
{
2187
case GR_CMBX_ZERO:
2188
if(num_tex == 0)
2189
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2190
else
2191
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");
2192
break;
2193
case GR_CMBX_ITALPHA:
2194
if(num_tex == 0)
2195
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(gl_Color.a); \n");
2196
else
2197
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(gl_Color.a); \n");
2198
break;
2199
case GR_CMBX_ITRGB:
2200
if(num_tex == 0)
2201
strcat(fragment_shader_texture0, "vec4 ctex0s_b = gl_Color; \n");
2202
else
2203
strcat(fragment_shader_texture1, "vec4 ctex1s_b = gl_Color; \n");
2204
break;
2205
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2206
if(num_tex == 0)
2207
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(readtex0.a); \n");
2208
else
2209
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(readtex1.a); \n");
2210
break;
2211
case GR_CMBX_LOCAL_TEXTURE_RGB:
2212
if(num_tex == 0)
2213
strcat(fragment_shader_texture0, "vec4 ctex0s_b = readtex0; \n");
2214
else
2215
strcat(fragment_shader_texture1, "vec4 ctex1s_b = readtex1; \n");
2216
break;
2217
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2218
if(num_tex == 0)
2219
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2220
else
2221
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ctexture0.a); \n");
2222
break;
2223
case GR_CMBX_OTHER_TEXTURE_RGB:
2224
if(num_tex == 0)
2225
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2226
else
2227
strcat(fragment_shader_texture1, "vec4 ctex1s_b = ctexture0; \n");
2228
break;
2229
case GR_CMBX_TMU_CALPHA:
2230
if(num_tex == 0)
2231
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(ccolor0.a); \n");
2232
else
2233
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ccolor1.a); \n");
2234
break;
2235
case GR_CMBX_TMU_CCOLOR:
2236
if(num_tex == 0)
2237
strcat(fragment_shader_texture0, "vec4 ctex0s_b = ccolor0; \n");
2238
else
2239
strcat(fragment_shader_texture1, "vec4 ctex1s_b = ccolor1; \n");
2240
break;
2241
default:
2242
display_warning("grTexColorCombineExt : b = %x", b);
2243
if(num_tex == 0)
2244
strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");
2245
else
2246
strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");
2247
}
2248
2249
switch(b_mode)
2250
{
2251
case GR_FUNC_MODE_ZERO:
2252
if(num_tex == 0)
2253
strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");
2254
else
2255
strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");
2256
break;
2257
case GR_FUNC_MODE_X:
2258
if(num_tex == 0)
2259
strcat(fragment_shader_texture0, "vec4 ctex0_b = ctex0s_b; \n");
2260
else
2261
strcat(fragment_shader_texture1, "vec4 ctex1_b = ctex1s_b; \n");
2262
break;
2263
case GR_FUNC_MODE_ONE_MINUS_X:
2264
if(num_tex == 0)
2265
strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(1.0) - ctex0s_b; \n");
2266
else
2267
strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(1.0) - ctex1s_b; \n");
2268
break;
2269
case GR_FUNC_MODE_NEGATIVE_X:
2270
if(num_tex == 0)
2271
strcat(fragment_shader_texture0, "vec4 ctex0_b = -ctex0s_b; \n");
2272
else
2273
strcat(fragment_shader_texture1, "vec4 ctex1_b = -ctex1s_b; \n");
2274
break;
2275
default:
2276
display_warning("grTexColorCombineExt : b_mode = %x", b_mode);
2277
if(num_tex == 0)
2278
strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");
2279
else
2280
strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");
2281
}
2282
2283
switch(c)
2284
{
2285
case GR_CMBX_ZERO:
2286
if(num_tex == 0)
2287
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2288
else
2289
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");
2290
break;
2291
case GR_CMBX_B:
2292
if(num_tex == 0)
2293
strcat(fragment_shader_texture0, "vec4 ctex0_c = ctex0s_b; \n");
2294
else
2295
strcat(fragment_shader_texture1, "vec4 ctex1_c = ctex1s_b; \n");
2296
break;
2297
case GR_CMBX_DETAIL_FACTOR:
2298
if(num_tex == 0)
2299
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(lambda); \n");
2300
else
2301
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(lambda); \n");
2302
break;
2303
case GR_CMBX_ITRGB:
2304
if(num_tex == 0)
2305
strcat(fragment_shader_texture0, "vec4 ctex0_c = gl_Color; \n");
2306
else
2307
strcat(fragment_shader_texture1, "vec4 ctex1_c = gl_Color; \n");
2308
break;
2309
case GR_CMBX_ITALPHA:
2310
if(num_tex == 0)
2311
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(gl_Color.a); \n");
2312
else
2313
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(gl_Color.a); \n");
2314
break;
2315
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2316
if(num_tex == 0)
2317
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(readtex0.a); \n");
2318
else
2319
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(readtex1.a); \n");
2320
break;
2321
case GR_CMBX_LOCAL_TEXTURE_RGB:
2322
if(num_tex == 0)
2323
strcat(fragment_shader_texture0, "vec4 ctex0_c = readtex0; \n");
2324
else
2325
strcat(fragment_shader_texture1, "vec4 ctex1_c = readtex1; \n");
2326
break;
2327
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2328
if(num_tex == 0)
2329
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2330
else
2331
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ctexture0.a); \n");
2332
break;
2333
case GR_CMBX_OTHER_TEXTURE_RGB:
2334
if(num_tex == 0)
2335
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2336
else
2337
strcat(fragment_shader_texture1, "vec4 ctex1_c = ctexture0; \n");
2338
break;
2339
case GR_CMBX_TMU_CALPHA:
2340
if(num_tex == 0)
2341
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(ccolor0.a); \n");
2342
else
2343
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ccolor1.a); \n");
2344
break;
2345
case GR_CMBX_TMU_CCOLOR:
2346
if(num_tex == 0)
2347
strcat(fragment_shader_texture0, "vec4 ctex0_c = ccolor0; \n");
2348
else
2349
strcat(fragment_shader_texture1, "vec4 ctex1_c = ccolor1; \n");
2350
break;
2351
default:
2352
display_warning("grTexColorCombineExt : c = %x", c);
2353
if(num_tex == 0)
2354
strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");
2355
else
2356
strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");
2357
}
2358
2359
if(c_invert)
2360
{
2361
if(num_tex == 0)
2362
strcat(fragment_shader_texture0, "ctex0_c = vec4(1.0) - ctex0_c; \n");
2363
else
2364
strcat(fragment_shader_texture1, "ctex1_c = vec4(1.0) - ctex1_c; \n");
2365
}
2366
2367
switch(d)
2368
{
2369
case GR_CMBX_ZERO:
2370
if(num_tex == 0)
2371
strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");
2372
else
2373
strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");
2374
break;
2375
case GR_CMBX_B:
2376
if(num_tex == 0)
2377
strcat(fragment_shader_texture0, "vec4 ctex0_d = ctex0s_b; \n");
2378
else
2379
strcat(fragment_shader_texture1, "vec4 ctex1_d = ctex1s_b; \n");
2380
break;
2381
case GR_CMBX_ITRGB:
2382
if(num_tex == 0)
2383
strcat(fragment_shader_texture0, "vec4 ctex0_d = gl_Color; \n");
2384
else
2385
strcat(fragment_shader_texture1, "vec4 ctex1_d = gl_Color; \n");
2386
break;
2387
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2388
if(num_tex == 0)
2389
strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(readtex0.a); \n");
2390
else
2391
strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(readtex1.a); \n");
2392
break;
2393
default:
2394
display_warning("grTexColorCombineExt : d = %x", d);
2395
if(num_tex == 0)
2396
strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");
2397
else
2398
strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");
2399
}
2400
2401
if(d_invert)
2402
{
2403
if(num_tex == 0)
2404
strcat(fragment_shader_texture0, "ctex0_d = vec4(1.0) - ctex0_d; \n");
2405
else
2406
strcat(fragment_shader_texture1, "ctex1_d = vec4(1.0) - ctex1_d; \n");
2407
}
2408
2409
if(num_tex == 0)
2410
strcat(fragment_shader_texture0, "vec4 ctexture0 = (ctex0_a + ctex0_b) * ctex0_c + ctex0_d; \n");
2411
else
2412
strcat(fragment_shader_texture1, "vec4 ctexture1 = (ctex1_a + ctex1_b) * ctex1_c + ctex1_d; \n");
2413
need_to_compile = 1;
2414
}
2415
2416
FX_ENTRY void FX_CALL
2417
grTexAlphaCombineExt(GrChipID_t tmu,
2418
GrTACUColor_t a, GrCombineMode_t a_mode,
2419
GrTACUColor_t b, GrCombineMode_t b_mode,
2420
GrTACUColor_t c, FxBool c_invert,
2421
GrTACUColor_t d, FxBool d_invert,
2422
FxU32 shift, FxBool invert)
2423
{
2424
int num_tex;
2425
LOG("grTexAlphaCombineExt(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, a, a_mode, b, b_mode, c, c_invert, d, d_invert, shift, invert);
2426
2427
if (invert) display_warning("grTexAlphaCombineExt : inverted result");
2428
if (shift) display_warning("grTexAlphaCombineExt : shift = %d", shift);
2429
2430
if (tmu == GR_TMU0) num_tex = 1;
2431
else num_tex = 0;
2432
2433
if(num_tex == 0)
2434
{
2435
texture0_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2436
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2437
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2438
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2439
}
2440
else
2441
{
2442
texture1_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |
2443
((b & 0x1F) << 7) | ((b_mode & 3) << 12) |
2444
((c & 0x1F) << 14) | ((c_invert & 1) << 19) |
2445
((d & 0x1F) << 20) | ((d_invert & 1) << 25);
2446
}
2447
2448
switch(a)
2449
{
2450
case GR_CMBX_ITALPHA:
2451
if(num_tex == 0)
2452
strcat(fragment_shader_texture0, "ctex0s_a.a = gl_Color.a; \n");
2453
else
2454
strcat(fragment_shader_texture1, "ctex1s_a.a = gl_Color.a; \n");
2455
break;
2456
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2457
if(num_tex == 0)
2458
strcat(fragment_shader_texture0, "ctex0s_a.a = readtex0.a; \n");
2459
else
2460
strcat(fragment_shader_texture1, "ctex1s_a.a = readtex1.a; \n");
2461
break;
2462
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2463
if(num_tex == 0)
2464
strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");
2465
else
2466
strcat(fragment_shader_texture1, "ctex1s_a.a = ctexture0.a; \n");
2467
break;
2468
case GR_CMBX_TMU_CALPHA:
2469
if(num_tex == 0)
2470
strcat(fragment_shader_texture0, "ctex0s_a.a = ccolor0.a; \n");
2471
else
2472
strcat(fragment_shader_texture1, "ctex1s_a.a = ccolor1.a; \n");
2473
break;
2474
default:
2475
display_warning("grTexAlphaCombineExt : a = %x", a);
2476
if(num_tex == 0)
2477
strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");
2478
else
2479
strcat(fragment_shader_texture1, "ctex1s_a.a = 0.0; \n");
2480
}
2481
2482
switch(a_mode)
2483
{
2484
case GR_FUNC_MODE_ZERO:
2485
if(num_tex == 0)
2486
strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");
2487
else
2488
strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");
2489
break;
2490
case GR_FUNC_MODE_X:
2491
if(num_tex == 0)
2492
strcat(fragment_shader_texture0, "ctex0_a.a = ctex0s_a.a; \n");
2493
else
2494
strcat(fragment_shader_texture1, "ctex1_a.a = ctex1s_a.a; \n");
2495
break;
2496
case GR_FUNC_MODE_ONE_MINUS_X:
2497
if(num_tex == 0)
2498
strcat(fragment_shader_texture0, "ctex0_a.a = 1.0 - ctex0s_a.a; \n");
2499
else
2500
strcat(fragment_shader_texture1, "ctex1_a.a = 1.0 - ctex1s_a.a; \n");
2501
break;
2502
case GR_FUNC_MODE_NEGATIVE_X:
2503
if(num_tex == 0)
2504
strcat(fragment_shader_texture0, "ctex0_a.a = -ctex0s_a.a; \n");
2505
else
2506
strcat(fragment_shader_texture1, "ctex1_a.a = -ctex1s_a.a; \n");
2507
break;
2508
default:
2509
display_warning("grTexAlphaCombineExt : a_mode = %x", a_mode);
2510
if(num_tex == 0)
2511
strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");
2512
else
2513
strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");
2514
}
2515
2516
switch(b)
2517
{
2518
case GR_CMBX_ITALPHA:
2519
if(num_tex == 0)
2520
strcat(fragment_shader_texture0, "ctex0s_b.a = gl_Color.a; \n");
2521
else
2522
strcat(fragment_shader_texture1, "ctex1s_b.a = gl_Color.a; \n");
2523
break;
2524
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2525
if(num_tex == 0)
2526
strcat(fragment_shader_texture0, "ctex0s_b.a = readtex0.a; \n");
2527
else
2528
strcat(fragment_shader_texture1, "ctex1s_b.a = readtex1.a; \n");
2529
break;
2530
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2531
if(num_tex == 0)
2532
strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");
2533
else
2534
strcat(fragment_shader_texture1, "ctex1s_b.a = ctexture0.a; \n");
2535
break;
2536
case GR_CMBX_TMU_CALPHA:
2537
if(num_tex == 0)
2538
strcat(fragment_shader_texture0, "ctex0s_b.a = ccolor0.a; \n");
2539
else
2540
strcat(fragment_shader_texture1, "ctex1s_b.a = ccolor1.a; \n");
2541
break;
2542
default:
2543
display_warning("grTexAlphaCombineExt : b = %x", b);
2544
if(num_tex == 0)
2545
strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");
2546
else
2547
strcat(fragment_shader_texture1, "ctex1s_b.a = 0.0; \n");
2548
}
2549
2550
switch(b_mode)
2551
{
2552
case GR_FUNC_MODE_ZERO:
2553
if(num_tex == 0)
2554
strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");
2555
else
2556
strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");
2557
break;
2558
case GR_FUNC_MODE_X:
2559
if(num_tex == 0)
2560
strcat(fragment_shader_texture0, "ctex0_b.a = ctex0s_b.a; \n");
2561
else
2562
strcat(fragment_shader_texture1, "ctex1_b.a = ctex1s_b.a; \n");
2563
break;
2564
case GR_FUNC_MODE_ONE_MINUS_X:
2565
if(num_tex == 0)
2566
strcat(fragment_shader_texture0, "ctex0_b.a = 1.0 - ctex0s_b.a; \n");
2567
else
2568
strcat(fragment_shader_texture1, "ctex1_b.a = 1.0 - ctex1s_b.a; \n");
2569
break;
2570
case GR_FUNC_MODE_NEGATIVE_X:
2571
if(num_tex == 0)
2572
strcat(fragment_shader_texture0, "ctex0_b.a = -ctex0s_b.a; \n");
2573
else
2574
strcat(fragment_shader_texture1, "ctex1_b.a = -ctex1s_b.a; \n");
2575
break;
2576
default:
2577
display_warning("grTexAlphaCombineExt : b_mode = %x", b_mode);
2578
if(num_tex == 0)
2579
strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");
2580
else
2581
strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");
2582
}
2583
2584
switch(c)
2585
{
2586
case GR_CMBX_ZERO:
2587
if(num_tex == 0)
2588
strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2589
else
2590
strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");
2591
break;
2592
case GR_CMBX_B:
2593
if(num_tex == 0)
2594
strcat(fragment_shader_texture0, "ctex0_c.a = ctex0s_b.a; \n");
2595
else
2596
strcat(fragment_shader_texture1, "ctex1_c.a = ctex1s_b.a; \n");
2597
break;
2598
case GR_CMBX_DETAIL_FACTOR:
2599
if(num_tex == 0)
2600
strcat(fragment_shader_texture0, "ctex0_c.a = lambda; \n");
2601
else
2602
strcat(fragment_shader_texture1, "ctex1_c.a = lambda; \n");
2603
break;
2604
case GR_CMBX_ITALPHA:
2605
if(num_tex == 0)
2606
strcat(fragment_shader_texture0, "ctex0_c.a = gl_Color.a; \n");
2607
else
2608
strcat(fragment_shader_texture1, "ctex1_c.a = gl_Color.a; \n");
2609
break;
2610
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2611
if(num_tex == 0)
2612
strcat(fragment_shader_texture0, "ctex0_c.a = readtex0.a; \n");
2613
else
2614
strcat(fragment_shader_texture1, "ctex1_c.a = readtex1.a; \n");
2615
break;
2616
case GR_CMBX_OTHER_TEXTURE_ALPHA:
2617
if(num_tex == 0)
2618
strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2619
else
2620
strcat(fragment_shader_texture1, "ctex1_c.a = ctexture0.a; \n");
2621
break;
2622
case GR_CMBX_TMU_CALPHA:
2623
if(num_tex == 0)
2624
strcat(fragment_shader_texture0, "ctex0_c.a = ccolor0.a; \n");
2625
else
2626
strcat(fragment_shader_texture1, "ctex1_c.a = ccolor1.a; \n");
2627
break;
2628
default:
2629
display_warning("grTexAlphaCombineExt : c = %x", c);
2630
if(num_tex == 0)
2631
strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");
2632
else
2633
strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");
2634
}
2635
2636
if(c_invert)
2637
{
2638
if(num_tex == 0)
2639
strcat(fragment_shader_texture0, "ctex0_c.a = 1.0 - ctex0_c.a; \n");
2640
else
2641
strcat(fragment_shader_texture1, "ctex1_c.a = 1.0 - ctex1_c.a; \n");
2642
}
2643
2644
switch(d)
2645
{
2646
case GR_CMBX_ZERO:
2647
if(num_tex == 0)
2648
strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");
2649
else
2650
strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");
2651
break;
2652
case GR_CMBX_B:
2653
if(num_tex == 0)
2654
strcat(fragment_shader_texture0, "ctex0_d.a = ctex0s_b.a; \n");
2655
else
2656
strcat(fragment_shader_texture1, "ctex1_d.a = ctex1s_b.a; \n");
2657
break;
2658
case GR_CMBX_ITALPHA:
2659
if(num_tex == 0)
2660
strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");
2661
else
2662
strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");
2663
break;
2664
case GR_CMBX_ITRGB:
2665
if(num_tex == 0)
2666
strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");
2667
else
2668
strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");
2669
break;
2670
case GR_CMBX_LOCAL_TEXTURE_ALPHA:
2671
if(num_tex == 0)
2672
strcat(fragment_shader_texture0, "ctex0_d.a = readtex0.a; \n");
2673
else
2674
strcat(fragment_shader_texture1, "ctex1_d.a = readtex1.a; \n");
2675
break;
2676
default:
2677
display_warning("grTexAlphaCombineExt : d = %x", d);
2678
if(num_tex == 0)
2679
strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");
2680
else
2681
strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");
2682
}
2683
2684
if(d_invert)
2685
{
2686
if(num_tex == 0)
2687
strcat(fragment_shader_texture0, "ctex0_d.a = 1.0 - ctex0_d.a; \n");
2688
else
2689
strcat(fragment_shader_texture1, "ctex1_d.a = 1.0 - ctex1_d.a; \n");
2690
}
2691
2692
if(num_tex == 0)
2693
strcat(fragment_shader_texture0, "ctexture0.a = (ctex0_a.a + ctex0_b.a) * ctex0_c.a + ctex0_d.a; \n");
2694
else
2695
strcat(fragment_shader_texture1, "ctexture1.a = (ctex1_a.a + ctex1_b.a) * ctex1_c.a + ctex1_d.a; \n");
2696
2697
need_to_compile = 1;
2698
}
2699
2700
FX_ENTRY void FX_CALL
2701
grConstantColorValueExt(GrChipID_t tmu,
2702
GrColor_t value)
2703
{
2704
int num_tex;
2705
LOG("grConstantColorValueExt(%d,%d)\r\n", tmu, value);
2706
2707
if (tmu == GR_TMU0) num_tex = 1;
2708
else num_tex = 0;
2709
2710
switch(lfb_color_fmt)
2711
{
2712
case GR_COLORFORMAT_ARGB:
2713
if(num_tex == 0)
2714
{
2715
ccolor0[3] = ((value >> 24) & 0xFF) / 255.0f;
2716
ccolor0[0] = ((value >> 16) & 0xFF) / 255.0f;
2717
ccolor0[1] = ((value >> 8) & 0xFF) / 255.0f;
2718
ccolor0[2] = (value & 0xFF) / 255.0f;
2719
}
2720
else
2721
{
2722
ccolor1[3] = ((value >> 24) & 0xFF) / 255.0f;
2723
ccolor1[0] = ((value >> 16) & 0xFF) / 255.0f;
2724
ccolor1[1] = ((value >> 8) & 0xFF) / 255.0f;
2725
ccolor1[2] = (value & 0xFF) / 255.0f;
2726
}
2727
break;
2728
case GR_COLORFORMAT_RGBA:
2729
if(num_tex == 0)
2730
{
2731
ccolor0[0] = ((value >> 24) & 0xFF) / 255.0f;
2732
ccolor0[1] = ((value >> 16) & 0xFF) / 255.0f;
2733
ccolor0[2] = ((value >> 8) & 0xFF) / 255.0f;
2734
ccolor0[3] = (value & 0xFF) / 255.0f;
2735
}
2736
else
2737
{
2738
ccolor1[0] = ((value >> 24) & 0xFF) / 255.0f;
2739
ccolor1[1] = ((value >> 16) & 0xFF) / 255.0f;
2740
ccolor1[2] = ((value >> 8) & 0xFF) / 255.0f;
2741
ccolor1[3] = (value & 0xFF) / 255.0f;
2742
}
2743
break;
2744
default:
2745
display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);
2746
}
2747
2748
if(num_tex == 0)
2749
{
2750
ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");
2751
glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);
2752
}
2753
else
2754
{
2755
ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");
2756
glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);
2757
}
2758
}
2759
2760