Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glitch64/combiner.cpp
2 views
/*1* Glide64 - Glide video plugin for Nintendo 64 emulators.2* Copyright (c) 2002 Dave20013* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License16* along with this program; if not, write to the Free Software17* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA18*/1920#ifdef _WIN3221#include <windows.h>22#else // _WIN3223#include <string.h>24#include <stdlib.h>25#endif // _WIN3226#include <math.h>27#include <stdio.h>28#include "glide.h"29#include "main.h"3031static int fct[4], source0[4], operand0[4], source1[4], operand1[4], source2[4], operand2[4];32static int fcta[4],sourcea0[4],operanda0[4],sourcea1[4],operanda1[4],sourcea2[4],operanda2[4];33static int alpha_ref, alpha_func;3435float texture_env_color[4];36float ccolor0[4];37float ccolor1[4];38static float chroma_color[4];39int fog_enabled;40static int chroma_enabled;41static int chroma_other_color;42static int chroma_other_alpha;43static int dither_enabled;44int blackandwhite0;45int blackandwhite1;46#ifdef _WIN3247static float farF;48static float nearF;49#endif // _WIN325051int need_lambda[2];52float lambda_color[2][4];5354// shaders variables55int need_to_compile;5657static GLhandleARB fragment_shader_object;58static GLhandleARB fragment_depth_shader_object;59static GLhandleARB vertex_shader_object;60static GLhandleARB program_object_default;61static GLhandleARB program_object_depth;62static GLhandleARB program_object;63static int constant_color_location;64static int ccolor0_location;65static int ccolor1_location;66static int first_color = 1;67static int first_alpha = 1;68static int first_texture0 = 1;69static int first_texture1 = 1;70static int tex0_combiner_ext = 0;71static int tex1_combiner_ext = 0;72static int c_combiner_ext = 0;73static int a_combiner_ext = 0;7475static const char* fragment_shader_header =76"uniform sampler2D texture0; \n"77"uniform sampler2D texture1; \n"78"uniform sampler2D ditherTex; \n"79"uniform vec4 constant_color; \n"80"uniform vec4 ccolor0; \n"81"uniform vec4 ccolor1; \n"82"uniform vec4 chroma_color; \n"83"uniform float lambda; \n"84"varying vec4 fogValue; \n"85" \n"86"void test_chroma(vec4 ctexture1); \n"87" \n"88" \n"89"void main() \n"90"{ \n"91;9293// using gl_FragCoord is terribly slow on ATI and varying variables don't work for some unknown94// reason, so we use the unused components of the texture2 coordinates95static const char* fragment_shader_dither =96" float dithx = (gl_TexCoord[2].b + 1.0)*0.5*1000.0; \n"97" float dithy = (gl_TexCoord[2].a + 1.0)*0.5*1000.0; \n"98" if(texture2D(ditherTex, vec2((dithx-32.0*floor(dithx/32.0))/32.0, \n"99" (dithy-32.0*floor(dithy/32.0))/32.0)).a > 0.5) discard; \n"100;101102static const char* fragment_shader_default =103" gl_FragColor = texture2D(texture0, vec2(gl_TexCoord[0])); \n"104;105106static const char* fragment_shader_readtex0color =107" vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"108;109110static const char* fragment_shader_readtex0bw =111" vec4 readtex0 = texture2D(texture0, vec2(gl_TexCoord[0])); \n"112" readtex0 = vec4(vec3(readtex0.b), \n"113" readtex0.r + readtex0.g * 8.0 / 256.0); \n"114;115static const char* fragment_shader_readtex0bw_2 =116" vec4 readtex0 = vec4(dot(texture2D(texture0, vec2(gl_TexCoord[0])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"117;118119static const char* fragment_shader_readtex1color =120" vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"121;122123static const char* fragment_shader_readtex1bw =124" vec4 readtex1 = texture2D(texture1, vec2(gl_TexCoord[1])); \n"125" readtex1 = vec4(vec3(readtex1.b), \n"126" readtex1.r + readtex1.g * 8.0 / 256.0); \n"127;128static const char* fragment_shader_readtex1bw_2 =129" vec4 readtex1 = vec4(dot(texture2D(texture1, vec2(gl_TexCoord[1])), vec4(1.0/3, 1.0/3, 1.0/3, 0))); \n"130;131132static const char* fragment_shader_fog =133" float fog; \n"134" fog = gl_TexCoord[0].b; \n"135" gl_FragColor = vec4(mix(gl_Fog.color.rgb, gl_FragColor.rgb, fog), gl_FragColor.a); \n"136;137138static const char* fragment_shader_end =139"} \n"140;141142static const char* vertex_shader =143"varying vec4 fogValue; \n"144" \n"145"void main() \n"146"{ \n"147" gl_Position = ftransform(); \n"148" gl_FrontColor = gl_Color; \n"149" gl_TexCoord[0] = gl_MultiTexCoord0; \n"150" gl_TexCoord[1] = gl_MultiTexCoord1; \n"151" float f = (gl_Fog.end - gl_SecondaryColor.r) * gl_Fog.scale; \n" // fog value passed through secondary color (workaround ATI bug)152" f = clamp(f, 0.0, 1.0); \n"153" gl_TexCoord[0].b = f; \n" // various data passed through154" gl_TexCoord[2].b = gl_Vertex.x; \n" // texture coordinates155" gl_TexCoord[2].a = gl_Vertex.y; \n" // again it is the only way156"} \n" // i've found to get it working fast with ATI drivers157;158159static char fragment_shader_color_combiner[1024];160static char fragment_shader_alpha_combiner[1024];161static char fragment_shader_texture1[1024];162static char fragment_shader_texture0[1024];163static char fragment_shader_chroma[1024];164static char shader_log[2048];165166void updateCombiner(int i)167{168glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);169glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, fct[i]);170glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, source0[i]);171glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, operand0[i]);172glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, source1[i]);173glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, operand1[i]);174glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, source2[i]);175glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, operand2[i]);176}177178void updateCombinera(int i)179{180glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);181glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, fcta[i]);182glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, sourcea0[i]);183glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, operanda0[i]);184glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, sourcea1[i]);185glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, operanda1[i]);186glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_ARB, sourcea2[i]);187glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_ARB, operanda2[i]);188}189190void init_combiner()191{192int texture[4] = {0, 0, 0, 0};193194glActiveTextureARB(GL_TEXTURE0_ARB);195glEnable(GL_TEXTURE_2D);196197// creating a fake texture198glBindTexture(GL_TEXTURE_2D, default_texture);199glTexImage2D(GL_TEXTURE_2D, 0, 3, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);200glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);201glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);202203glActiveTextureARB(GL_TEXTURE1_ARB);204glBindTexture(GL_TEXTURE_2D, default_texture);205glEnable(GL_TEXTURE_2D);206207int texture0_location;208int texture1_location;209char *fragment_shader;210int log_length;211212// depth shader213fragment_depth_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);214215char s[128];216// ZIGGY convert a 565 texture into depth component217sprintf(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);218fragment_shader = (char*)malloc(strlen(fragment_shader_header)+219strlen(s)+220strlen(fragment_shader_end)+1);221strcpy(fragment_shader, fragment_shader_header);222strcat(fragment_shader, s);223strcat(fragment_shader, fragment_shader_end);224glShaderSourceARB(fragment_depth_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);225free(fragment_shader);226227glCompileShaderARB(fragment_depth_shader_object);228229// default shader230fragment_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);231232fragment_shader = (char*)malloc(strlen(fragment_shader_header)+233strlen(fragment_shader_default)+234strlen(fragment_shader_end)+1);235strcpy(fragment_shader, fragment_shader_header);236strcat(fragment_shader, fragment_shader_default);237strcat(fragment_shader, fragment_shader_end);238glShaderSourceARB(fragment_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);239free(fragment_shader);240241glCompileShaderARB(fragment_shader_object);242243vertex_shader_object = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);244glShaderSourceARB(vertex_shader_object, 1, &vertex_shader, NULL);245glCompileShaderARB(vertex_shader_object);246247// depth program248program_object = glCreateProgramObjectARB();249program_object_depth = program_object;250glAttachObjectARB(program_object, fragment_depth_shader_object);251glAttachObjectARB(program_object, vertex_shader_object);252glLinkProgramARB(program_object);253glUseProgramObjectARB(program_object);254255glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);256if(!log_length)257{258glGetInfoLogARB(fragment_shader_object, 2048, &log_length, shader_log);259if(log_length) display_warning(shader_log);260glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);261if(log_length) display_warning(shader_log);262glGetInfoLogARB(program_object, 2048, &log_length, shader_log);263if(log_length) display_warning(shader_log);264}265266texture0_location = glGetUniformLocationARB(program_object, "texture0");267texture1_location = glGetUniformLocationARB(program_object, "texture1");268glUniform1iARB(texture0_location, 0);269glUniform1iARB(texture1_location, 1);270271// default program272program_object = glCreateProgramObjectARB();273program_object_default = program_object;274glAttachObjectARB(program_object, fragment_shader_object);275glAttachObjectARB(program_object, vertex_shader_object);276glLinkProgramARB(program_object);277glUseProgramObjectARB(program_object);278279glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);280if(!log_length)281{282glGetInfoLogARB(fragment_shader_object, 2048, &log_length, shader_log);283if(log_length) display_warning(shader_log);284glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);285if(log_length) display_warning(shader_log);286glGetInfoLogARB(program_object, 2048, &log_length, shader_log);287if(log_length) display_warning(shader_log);288}289290texture0_location = glGetUniformLocationARB(program_object, "texture0");291texture1_location = glGetUniformLocationARB(program_object, "texture1");292glUniform1iARB(texture0_location, 0);293glUniform1iARB(texture1_location, 1);294295strcpy(fragment_shader_color_combiner, "");296strcpy(fragment_shader_alpha_combiner, "");297strcpy(fragment_shader_texture1, "vec4 ctexture1 = texture2D(texture0, vec2(gl_TexCoord[0])); \n");298strcpy(fragment_shader_texture0, "");299300first_color = 1;301first_alpha = 1;302first_texture0 = 1;303first_texture1 = 1;304need_to_compile = 0;305fog_enabled = 0;306chroma_enabled = 0;307dither_enabled = 0;308blackandwhite0 = 0;309blackandwhite1 = 0;310}311312void compile_chroma_shader()313{314strcpy(fragment_shader_chroma, "\nvoid test_chroma(vec4 ctexture1)\n{\n");315316switch(chroma_other_alpha)317{318case GR_COMBINE_OTHER_ITERATED:319strcat(fragment_shader_chroma, "float alpha = gl_Color.a; \n");320break;321case GR_COMBINE_OTHER_TEXTURE:322strcat(fragment_shader_chroma, "float alpha = ctexture1.a; \n");323break;324case GR_COMBINE_OTHER_CONSTANT:325strcat(fragment_shader_chroma, "float alpha = constant_color.a; \n");326break;327default:328display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_alpha);329}330331switch(chroma_other_color)332{333case GR_COMBINE_OTHER_ITERATED:334strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(gl_Color),alpha); \n");335break;336case GR_COMBINE_OTHER_TEXTURE:337strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(ctexture1),alpha); \n");338break;339case GR_COMBINE_OTHER_CONSTANT:340strcat(fragment_shader_chroma, "vec4 color = vec4(vec3(constant_color),alpha); \n");341break;342default:343display_warning("unknown compile_choma_shader_alpha : %x", chroma_other_color);344}345346strcat(fragment_shader_chroma, "if (color.rgb == chroma_color.rgb) discard; \n");347strcat(fragment_shader_chroma, "}");348}349350typedef struct _shader_program_key351{352int color_combiner;353int alpha_combiner;354int texture0_combiner;355int texture1_combiner;356int texture0_combinera;357int texture1_combinera;358int fog_enabled;359int chroma_enabled;360int dither_enabled;361int blackandwhite0;362int blackandwhite1;363GLhandleARB fragment_shader_object;364GLhandleARB program_object;365} shader_program_key;366367static shader_program_key* shader_programs = NULL;368static int number_of_programs = 0;369static int color_combiner_key;370static int alpha_combiner_key;371static int texture0_combiner_key;372static int texture1_combiner_key;373static int texture0_combinera_key;374static int texture1_combinera_key;375376void compile_shader()377{378int texture0_location;379int texture1_location;380int ditherTex_location;381char *fragment_shader;382int i;383int chroma_color_location;384int log_length;385386need_to_compile = 0;387388for(i=0; i<number_of_programs; i++)389{390if(shader_programs[i].color_combiner == color_combiner_key &&391shader_programs[i].alpha_combiner == alpha_combiner_key &&392shader_programs[i].texture0_combiner == texture0_combiner_key &&393shader_programs[i].texture1_combiner == texture1_combiner_key &&394shader_programs[i].texture0_combinera == texture0_combinera_key &&395shader_programs[i].texture1_combinera == texture1_combinera_key &&396shader_programs[i].fog_enabled == fog_enabled &&397shader_programs[i].chroma_enabled == chroma_enabled &&398shader_programs[i].dither_enabled == dither_enabled &&399shader_programs[i].blackandwhite0 == blackandwhite0 &&400shader_programs[i].blackandwhite1 == blackandwhite1)401{402program_object = shader_programs[i].program_object;403glUseProgramObjectARB(program_object);404405texture0_location = glGetUniformLocationARB(program_object, "texture0");406texture1_location = glGetUniformLocationARB(program_object, "texture1");407glUniform1iARB(texture0_location, 0);408glUniform1iARB(texture1_location, 1);409410constant_color_location = glGetUniformLocationARB(program_object, "constant_color");411glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],412texture_env_color[2], texture_env_color[3]);413414ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");415glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);416417ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");418glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);419420chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");421glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],422chroma_color[2], chroma_color[3]);423424if(dither_enabled)425{426ditherTex_location = glGetUniformLocationARB(program_object, "ditherTex");427glUniform1iARB(ditherTex_location, 2);428}429430set_lambda();431return;432}433}434435if(shader_programs != NULL)436shader_programs = (shader_program_key*)realloc(shader_programs, (number_of_programs+1)*sizeof(shader_program_key));437else438shader_programs = (shader_program_key*)malloc(sizeof(shader_program_key));439//printf("number of shaders %d\n", number_of_programs);440441shader_programs[number_of_programs].color_combiner = color_combiner_key;442shader_programs[number_of_programs].alpha_combiner = alpha_combiner_key;443shader_programs[number_of_programs].texture0_combiner = texture0_combiner_key;444shader_programs[number_of_programs].texture1_combiner = texture1_combiner_key;445shader_programs[number_of_programs].texture0_combinera = texture0_combinera_key;446shader_programs[number_of_programs].texture1_combinera = texture1_combinera_key;447shader_programs[number_of_programs].fog_enabled = fog_enabled;448shader_programs[number_of_programs].chroma_enabled = chroma_enabled;449shader_programs[number_of_programs].dither_enabled = dither_enabled;450shader_programs[number_of_programs].blackandwhite0 = blackandwhite0;451shader_programs[number_of_programs].blackandwhite1 = blackandwhite1;452453if(chroma_enabled)454{455strcat(fragment_shader_texture1, "test_chroma(ctexture1); \n");456compile_chroma_shader();457}458459fragment_shader = (char*)malloc(4096);460461strcpy(fragment_shader, fragment_shader_header);462if(dither_enabled) strcat(fragment_shader, fragment_shader_dither);463switch (blackandwhite0) {464case 1: strcat(fragment_shader, fragment_shader_readtex0bw); break;465case 2: strcat(fragment_shader, fragment_shader_readtex0bw_2); break;466default: strcat(fragment_shader, fragment_shader_readtex0color);467}468switch (blackandwhite1) {469case 1: strcat(fragment_shader, fragment_shader_readtex1bw); break;470case 2: strcat(fragment_shader, fragment_shader_readtex1bw_2); break;471default: strcat(fragment_shader, fragment_shader_readtex1color);472}473strcat(fragment_shader, fragment_shader_texture0);474strcat(fragment_shader, fragment_shader_texture1);475strcat(fragment_shader, fragment_shader_color_combiner);476strcat(fragment_shader, fragment_shader_alpha_combiner);477if(fog_enabled) strcat(fragment_shader, fragment_shader_fog);478strcat(fragment_shader, fragment_shader_end);479if(chroma_enabled) strcat(fragment_shader, fragment_shader_chroma);480481shader_programs[number_of_programs].fragment_shader_object = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);482glShaderSourceARB(shader_programs[number_of_programs].fragment_shader_object, 1, (const GLcharARB**)&fragment_shader, NULL);483free(fragment_shader);484485glCompileShaderARB(shader_programs[number_of_programs].fragment_shader_object);486487program_object = glCreateProgramObjectARB();488shader_programs[number_of_programs].program_object = program_object;489glAttachObjectARB(program_object, shader_programs[number_of_programs].fragment_shader_object);490glAttachObjectARB(program_object, vertex_shader_object);491glLinkProgramARB(program_object);492glUseProgramObjectARB(program_object);493494glGetObjectParameterivARB(program_object, GL_OBJECT_LINK_STATUS_ARB , &log_length);495if(!log_length)496{497glGetInfoLogARB(shader_programs[number_of_programs].fragment_shader_object,4982048, &log_length, shader_log);499if(log_length) display_warning(shader_log);500glGetInfoLogARB(vertex_shader_object, 2048, &log_length, shader_log);501if(log_length) display_warning(shader_log);502glGetInfoLogARB(program_object,5032048, &log_length, shader_log);504if(log_length) display_warning(shader_log);505}506507texture0_location = glGetUniformLocationARB(program_object, "texture0");508texture1_location = glGetUniformLocationARB(program_object, "texture1");509glUniform1iARB(texture0_location, 0);510glUniform1iARB(texture1_location, 1);511512constant_color_location = glGetUniformLocationARB(program_object, "constant_color");513glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],514texture_env_color[2], texture_env_color[3]);515516ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");517glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);518519ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");520glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);521522chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");523glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],524chroma_color[2], chroma_color[3]);525526if(dither_enabled)527{528ditherTex_location = glGetUniformLocationARB(program_object, "ditherTex");529glUniform1iARB(ditherTex_location, 2);530}531532set_lambda();533number_of_programs++;534}535536void free_combiners()537{538free(shader_programs);539shader_programs = NULL;540number_of_programs = 0;541}542543void set_copy_shader()544{545int texture0_location;546547glUseProgramObjectARB(program_object_default);548texture0_location = glGetUniformLocationARB(program_object, "texture0");549glUniform1iARB(texture0_location, 0);550}551552void set_depth_shader()553{554int texture0_location;555556glUseProgramObjectARB(program_object_depth);557texture0_location = glGetUniformLocationARB(program_object, "texture0");558glUniform1iARB(texture0_location, 0);559}560561void set_lambda()562{563int lambda_location = glGetUniformLocationARB(program_object, "lambda");564glUniform1fARB(lambda_location, lambda);565}566567FX_ENTRY void FX_CALL568grConstantColorValue( GrColor_t value )569{570LOG("grConstantColorValue(%d)\r\n", value);571switch(lfb_color_fmt)572{573case GR_COLORFORMAT_ARGB:574texture_env_color[3] = ((value >> 24) & 0xFF) / 255.0f;575texture_env_color[0] = ((value >> 16) & 0xFF) / 255.0f;576texture_env_color[1] = ((value >> 8) & 0xFF) / 255.0f;577texture_env_color[2] = (value & 0xFF) / 255.0f;578break;579case GR_COLORFORMAT_RGBA:580texture_env_color[0] = ((value >> 24) & 0xFF) / 255.0f;581texture_env_color[1] = ((value >> 16) & 0xFF) / 255.0f;582texture_env_color[2] = ((value >> 8) & 0xFF) / 255.0f;583texture_env_color[3] = (value & 0xFF) / 255.0f;584break;585default:586display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);587}588589constant_color_location = glGetUniformLocationARB(program_object, "constant_color");590glUniform4fARB(constant_color_location, texture_env_color[0], texture_env_color[1],591texture_env_color[2], texture_env_color[3]);592}593594int setOtherColorSource(int other)595{596switch(other)597{598case GR_COMBINE_OTHER_ITERATED:599return GL_PRIMARY_COLOR_ARB;600break;601case GR_COMBINE_OTHER_TEXTURE:602return GL_PREVIOUS_ARB;603break;604case GR_COMBINE_OTHER_CONSTANT:605return GL_CONSTANT_ARB;606break;607default:608display_warning("unknwown other color source : %x", other);609}610return 0;611}612613int setLocalColorSource(int local)614{615switch(local)616{617case GR_COMBINE_LOCAL_ITERATED:618return GL_PRIMARY_COLOR_ARB;619break;620case GR_COMBINE_LOCAL_CONSTANT:621return GL_CONSTANT_ARB;622break;623default:624display_warning("unknwown local color source : %x", local);625}626return 0;627}628629void writeGLSLColorOther(int other)630{631switch(other)632{633case GR_COMBINE_OTHER_ITERATED:634strcat(fragment_shader_color_combiner, "vec4 color_other = gl_Color; \n");635break;636case GR_COMBINE_OTHER_TEXTURE:637strcat(fragment_shader_color_combiner, "vec4 color_other = ctexture1; \n");638break;639case GR_COMBINE_OTHER_CONSTANT:640strcat(fragment_shader_color_combiner, "vec4 color_other = constant_color; \n");641break;642default:643display_warning("unknown writeGLSLColorOther : %x", other);644}645}646647void writeGLSLColorLocal(int local)648{649switch(local)650{651case GR_COMBINE_LOCAL_ITERATED:652strcat(fragment_shader_color_combiner, "vec4 color_local = gl_Color; \n");653break;654case GR_COMBINE_LOCAL_CONSTANT:655strcat(fragment_shader_color_combiner, "vec4 color_local = constant_color; \n");656break;657default:658display_warning("unknown writeGLSLColorLocal : %x", local);659}660}661662void writeGLSLColorFactor(int factor, int local, int need_local, int other, int need_other)663{664switch(factor)665{666case GR_COMBINE_FACTOR_ZERO:667strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(0.0); \n");668break;669case GR_COMBINE_FACTOR_LOCAL:670if(need_local) writeGLSLColorLocal(local);671strcat(fragment_shader_color_combiner, "vec4 color_factor = color_local; \n");672break;673case GR_COMBINE_FACTOR_OTHER_ALPHA:674if(need_other) writeGLSLColorOther(other);675strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_other.a); \n");676break;677case GR_COMBINE_FACTOR_LOCAL_ALPHA:678if(need_local) writeGLSLColorLocal(local);679strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(color_local.a); \n");680break;681case GR_COMBINE_FACTOR_TEXTURE_ALPHA:682strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(ctexture1.a); \n");683break;684case GR_COMBINE_FACTOR_TEXTURE_RGB:685strcat(fragment_shader_color_combiner, "vec4 color_factor = ctexture1; \n");686break;687case GR_COMBINE_FACTOR_ONE:688strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0); \n");689break;690case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:691if(need_local) writeGLSLColorLocal(local);692strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - color_local; \n");693break;694case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:695if(need_other) writeGLSLColorOther(other);696strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_other.a); \n");697break;698case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:699if(need_local) writeGLSLColorLocal(local);700strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(color_local.a); \n");701break;702case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:703strcat(fragment_shader_color_combiner, "vec4 color_factor = vec4(1.0) - vec4(ctexture1.a); \n");704break;705default:706display_warning("unknown writeGLSLColorFactor : %x", factor);707}708}709710FX_ENTRY void FX_CALL711grColorCombine(712GrCombineFunction_t function, GrCombineFactor_t factor,713GrCombineLocal_t local, GrCombineOther_t other,714FxBool invert )715{716LOG("grColorCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);717static int last_function = 0;718static int last_factor = 0;719static int last_local = 0;720static int last_other = 0;721722if(last_function == function && last_factor == factor &&723last_local == local && last_other == other && first_color == 0 && !c_combiner_ext) return;724first_color = 0;725c_combiner_ext = 0;726727last_function = function;728last_factor = factor;729last_local = local;730last_other = other;731732if (invert) display_warning("grColorCombine : inverted result");733734color_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);735chroma_other_color = other;736737strcpy(fragment_shader_color_combiner, "");738switch(function)739{740case GR_COMBINE_FUNCTION_ZERO:741strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(0.0); \n");742break;743case GR_COMBINE_FUNCTION_LOCAL:744writeGLSLColorLocal(local);745strcat(fragment_shader_color_combiner, "gl_FragColor = color_local; \n");746break;747case GR_COMBINE_FUNCTION_LOCAL_ALPHA:748writeGLSLColorLocal(local);749strcat(fragment_shader_color_combiner, "gl_FragColor = vec4(color_local.a); \n");750break;751case GR_COMBINE_FUNCTION_SCALE_OTHER:752writeGLSLColorOther(other);753writeGLSLColorFactor(factor,local,1,other,0);754strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other; \n");755break;756case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:757writeGLSLColorLocal(local);758writeGLSLColorOther(other);759writeGLSLColorFactor(factor,local,0,other,0);760strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + color_local; \n");761break;762case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:763writeGLSLColorLocal(local);764writeGLSLColorOther(other);765writeGLSLColorFactor(factor,local,0,other,0);766strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * color_other + vec4(color_local.a); \n");767break;768case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:769writeGLSLColorLocal(local);770writeGLSLColorOther(other);771writeGLSLColorFactor(factor,local,0,other,0);772strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local); \n");773break;774case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:775writeGLSLColorLocal(local);776writeGLSLColorOther(other);777writeGLSLColorFactor(factor,local,0,other,0);778strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + color_local; \n");779break;780case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:781writeGLSLColorLocal(local);782writeGLSLColorOther(other);783writeGLSLColorFactor(factor,local,0,other,0);784strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (color_other - color_local) + vec4(color_local.a); \n");785break;786case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:787writeGLSLColorLocal(local);788writeGLSLColorFactor(factor,local,0,other,1);789strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + color_local; \n");790break;791case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:792writeGLSLColorLocal(local);793writeGLSLColorFactor(factor,local,0,other,1);794strcat(fragment_shader_color_combiner, "gl_FragColor = color_factor * (-color_local) + vec4(color_local.a); \n");795break;796default:797strcpy(fragment_shader_color_combiner, fragment_shader_default);798display_warning("grColorCombine : unknown function : %x", function);799}800//compile_shader();801need_to_compile = 1;802}803804int setOtherAlphaSource(int other)805{806switch(other)807{808case GR_COMBINE_OTHER_ITERATED:809return GL_PRIMARY_COLOR_ARB;810break;811case GR_COMBINE_OTHER_TEXTURE:812return GL_PREVIOUS_ARB;813break;814case GR_COMBINE_OTHER_CONSTANT:815return GL_CONSTANT_ARB;816break;817default:818display_warning("unknwown other alpha source : %x", other);819}820return 0;821}822823int setLocalAlphaSource(int local)824{825switch(local)826{827case GR_COMBINE_LOCAL_ITERATED:828return GL_PRIMARY_COLOR_ARB;829break;830case GR_COMBINE_LOCAL_CONSTANT:831return GL_CONSTANT_ARB;832break;833default:834display_warning("unknwown local alpha source : %x", local);835}836return 0;837}838839void writeGLSLAlphaOther(int other)840{841switch(other)842{843case GR_COMBINE_OTHER_ITERATED:844strcat(fragment_shader_alpha_combiner, "float alpha_other = gl_Color.a; \n");845break;846case GR_COMBINE_OTHER_TEXTURE:847strcat(fragment_shader_alpha_combiner, "float alpha_other = ctexture1.a; \n");848break;849case GR_COMBINE_OTHER_CONSTANT:850strcat(fragment_shader_alpha_combiner, "float alpha_other = constant_color.a; \n");851break;852default:853display_warning("unknown writeGLSLAlphaOther : %x", other);854}855}856857void writeGLSLAlphaLocal(int local)858{859switch(local)860{861case GR_COMBINE_LOCAL_ITERATED:862strcat(fragment_shader_alpha_combiner, "float alpha_local = gl_Color.a; \n");863break;864case GR_COMBINE_LOCAL_CONSTANT:865strcat(fragment_shader_alpha_combiner, "float alpha_local = constant_color.a; \n");866break;867default:868display_warning("unknown writeGLSLAlphaLocal : %x", local);869}870}871872void writeGLSLAlphaFactor(int factor, int local, int need_local, int other, int need_other)873{874switch(factor)875{876case GR_COMBINE_FACTOR_ZERO:877strcat(fragment_shader_alpha_combiner, "float alpha_factor = 0.0; \n");878break;879case GR_COMBINE_FACTOR_LOCAL:880if(need_local) writeGLSLAlphaLocal(local);881strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");882break;883case GR_COMBINE_FACTOR_OTHER_ALPHA:884if(need_other) writeGLSLAlphaOther(other);885strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_other; \n");886break;887case GR_COMBINE_FACTOR_LOCAL_ALPHA:888if(need_local) writeGLSLAlphaLocal(local);889strcat(fragment_shader_alpha_combiner, "float alpha_factor = alpha_local; \n");890break;891case GR_COMBINE_FACTOR_TEXTURE_ALPHA:892strcat(fragment_shader_alpha_combiner, "float alpha_factor = ctexture1.a; \n");893break;894case GR_COMBINE_FACTOR_ONE:895strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0; \n");896break;897case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:898if(need_local) writeGLSLAlphaLocal(local);899strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");900break;901case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:902if(need_other) writeGLSLAlphaOther(other);903strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_other; \n");904break;905case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:906if(need_local) writeGLSLAlphaLocal(local);907strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - alpha_local; \n");908break;909case GR_COMBINE_FACTOR_ONE_MINUS_TEXTURE_ALPHA:910strcat(fragment_shader_alpha_combiner, "float alpha_factor = 1.0 - ctexture1.a; \n");911break;912default:913display_warning("unknown writeGLSLAlphaFactor : %x", factor);914}915}916917FX_ENTRY void FX_CALL918grAlphaCombine(919GrCombineFunction_t function, GrCombineFactor_t factor,920GrCombineLocal_t local, GrCombineOther_t other,921FxBool invert922)923{924LOG("grAlphaCombine(%d,%d,%d,%d,%d)\r\n", function, factor, local, other, invert);925static int last_function = 0;926static int last_factor = 0;927static int last_local = 0;928static int last_other = 0;929930if(last_function == function && last_factor == factor &&931last_local == local && last_other == other && first_alpha == 0 && !a_combiner_ext) return;932first_alpha = 0;933a_combiner_ext = 0;934935last_function = function;936last_factor = factor;937last_local = local;938last_other = other;939940if (invert) display_warning("grAlphaCombine : inverted result");941942alpha_combiner_key = function | (factor << 4) | (local << 8) | (other << 10);943chroma_other_alpha = other;944945strcpy(fragment_shader_alpha_combiner, "");946947switch(function)948{949case GR_COMBINE_FUNCTION_ZERO:950strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = 0.0; \n");951break;952case GR_COMBINE_FUNCTION_LOCAL:953writeGLSLAlphaLocal(local);954strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");955break;956case GR_COMBINE_FUNCTION_LOCAL_ALPHA:957writeGLSLAlphaLocal(local);958strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_local; \n");959break;960case GR_COMBINE_FUNCTION_SCALE_OTHER:961writeGLSLAlphaOther(other);962writeGLSLAlphaFactor(factor,local,1,other,0);963strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other; \n");964break;965case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:966writeGLSLAlphaLocal(local);967writeGLSLAlphaOther(other);968writeGLSLAlphaFactor(factor,local,0,other,0);969strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");970break;971case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:972writeGLSLAlphaLocal(local);973writeGLSLAlphaOther(other);974writeGLSLAlphaFactor(factor,local,0,other,0);975strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * alpha_other + alpha_local; \n");976break;977case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:978writeGLSLAlphaLocal(local);979writeGLSLAlphaOther(other);980writeGLSLAlphaFactor(factor,local,0,other,0);981strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local); \n");982break;983case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:984writeGLSLAlphaLocal(local);985writeGLSLAlphaOther(other);986writeGLSLAlphaFactor(factor,local,0,other,0);987strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");988break;989case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:990writeGLSLAlphaLocal(local);991writeGLSLAlphaOther(other);992writeGLSLAlphaFactor(factor,local,0,other,0);993strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (alpha_other - alpha_local) + alpha_local; \n");994break;995case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:996writeGLSLAlphaLocal(local);997writeGLSLAlphaFactor(factor,local,0,other,1);998strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");999break;1000case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:1001writeGLSLAlphaLocal(local);1002writeGLSLAlphaFactor(factor,local,0,other,1);1003strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = alpha_factor * (-alpha_local) + alpha_local; \n");1004break;1005default:1006display_warning("grAlphaCombine : unknown function : %x", function);1007}10081009//compile_shader();1010need_to_compile = 1;1011}10121013void writeGLSLTextureColorFactor(int num_tex, int factor)1014{1015switch(factor)1016{1017case GR_COMBINE_FACTOR_ZERO:1018if(num_tex == 0)1019strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");1020else1021strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(0.0); \n");1022break;1023case GR_COMBINE_FACTOR_LOCAL:1024if(num_tex == 0)1025strcat(fragment_shader_texture0, "vec4 texture0_color_factor = readtex0; \n");1026else1027strcat(fragment_shader_texture1, "vec4 texture1_color_factor = readtex1; \n");1028break;1029case GR_COMBINE_FACTOR_OTHER_ALPHA:1030if(num_tex == 0)1031strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(0.0); \n");1032else1033strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(ctexture0.a); \n");1034break;1035case GR_COMBINE_FACTOR_LOCAL_ALPHA:1036if(num_tex == 0)1037strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(readtex0.a); \n");1038else1039strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(readtex1.a); \n");1040break;1041case GR_COMBINE_FACTOR_DETAIL_FACTOR:1042if(num_tex == 0)1043strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(lambda); \n");1044else1045strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(lambda); \n");1046break;1047case GR_COMBINE_FACTOR_ONE:1048if(num_tex == 0)1049strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0); \n");1050else1051strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0); \n");1052break;1053case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:1054if(num_tex == 0)1055strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - readtex0; \n");1056else1057strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - readtex1; \n");1058break;1059case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:1060if(num_tex == 0)1061strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(0.0); \n");1062else1063strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(ctexture0.a); \n");1064break;1065case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:1066if(num_tex == 0)1067strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(readtex0.a); \n");1068else1069strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(readtex1.a); \n");1070break;1071case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:1072if(num_tex == 0)1073strcat(fragment_shader_texture0, "vec4 texture0_color_factor = vec4(1.0) - vec4(lambda); \n");1074else1075strcat(fragment_shader_texture1, "vec4 texture1_color_factor = vec4(1.0) - vec4(lambda); \n");1076break;1077default:1078display_warning("unknown writeGLSLTextureColorFactor : %x", factor);1079}1080}10811082void writeGLSLTextureAlphaFactor(int num_tex, int factor)1083{1084switch(factor)1085{1086case GR_COMBINE_FACTOR_ZERO:1087if(num_tex == 0)1088strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");1089else1090strcat(fragment_shader_texture1, "float texture1_alpha_factor = 0.0; \n");1091break;1092case GR_COMBINE_FACTOR_LOCAL:1093if(num_tex == 0)1094strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");1095else1096strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");1097break;1098case GR_COMBINE_FACTOR_OTHER_ALPHA:1099if(num_tex == 0)1100strcat(fragment_shader_texture0, "float texture0_alpha_factor = 0.0; \n");1101else1102strcat(fragment_shader_texture1, "float texture1_alpha_factor = ctexture0.a; \n");1103break;1104case GR_COMBINE_FACTOR_LOCAL_ALPHA:1105if(num_tex == 0)1106strcat(fragment_shader_texture0, "float texture0_alpha_factor = readtex0.a; \n");1107else1108strcat(fragment_shader_texture1, "float texture1_alpha_factor = readtex1.a; \n");1109break;1110case GR_COMBINE_FACTOR_DETAIL_FACTOR:1111if(num_tex == 0)1112strcat(fragment_shader_texture0, "float texture0_alpha_factor = lambda; \n");1113else1114strcat(fragment_shader_texture1, "float texture1_alpha_factor = lambda; \n");1115break;1116case GR_COMBINE_FACTOR_ONE:1117if(num_tex == 0)1118strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0; \n");1119else1120strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0; \n");1121break;1122case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL:1123if(num_tex == 0)1124strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");1125else1126strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");1127break;1128case GR_COMBINE_FACTOR_ONE_MINUS_OTHER_ALPHA:1129if(num_tex == 0)1130strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - 0.0; \n");1131else1132strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - ctexture0.a; \n");1133break;1134case GR_COMBINE_FACTOR_ONE_MINUS_LOCAL_ALPHA:1135if(num_tex == 0)1136strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - readtex0.a; \n");1137else1138strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - readtex1.a; \n");1139break;1140case GR_COMBINE_FACTOR_ONE_MINUS_DETAIL_FACTOR:1141if(num_tex == 0)1142strcat(fragment_shader_texture0, "float texture0_alpha_factor = 1.0 - lambda; \n");1143else1144strcat(fragment_shader_texture1, "float texture1_alpha_factor = 1.0 - lambda; \n");1145break;1146default:1147display_warning("unknown writeGLSLTextureAlphaFactor : %x", factor);1148}1149}11501151FX_ENTRY void FX_CALL1152grTexCombine(1153GrChipID_t tmu,1154GrCombineFunction_t rgb_function,1155GrCombineFactor_t rgb_factor,1156GrCombineFunction_t alpha_function,1157GrCombineFactor_t alpha_factor,1158FxBool rgb_invert,1159FxBool alpha_invert1160)1161{1162LOG("grTexCombine(%d,%d,%d,%d,%d,%d,%d)\r\n", tmu, rgb_function, rgb_factor, alpha_function, alpha_factor, rgb_invert, alpha_invert);1163int num_tex;11641165if (tmu == GR_TMU0) num_tex = 1;1166else num_tex = 0;11671168if(num_tex == 0)1169{1170static int last_function = 0;1171static int last_factor = 0;1172static int last_afunction = 0;1173static int last_afactor = 0;1174static int last_rgb_invert = 0;11751176if(last_function == rgb_function && last_factor == rgb_factor &&1177last_afunction == alpha_function && last_afactor == alpha_factor &&1178last_rgb_invert == rgb_invert && first_texture0 == 0 && !tex0_combiner_ext) return;1179first_texture0 = 0;1180tex0_combiner_ext = 0;11811182last_function = rgb_function;1183last_factor = rgb_factor;1184last_afunction = alpha_function;1185last_afactor = alpha_factor;1186last_rgb_invert= rgb_invert;1187texture0_combiner_key = rgb_function | (rgb_factor << 4) |1188(alpha_function << 8) | (alpha_factor << 12) |1189(rgb_invert << 16);1190texture0_combinera_key = 0;1191strcpy(fragment_shader_texture0, "");1192}1193else1194{1195static int last_function = 0;1196static int last_factor = 0;1197static int last_afunction = 0;1198static int last_afactor = 0;1199static int last_rgb_invert = 0;12001201if(last_function == rgb_function && last_factor == rgb_factor &&1202last_afunction == alpha_function && last_afactor == alpha_factor &&1203last_rgb_invert == rgb_invert && first_texture1 == 0 && !tex1_combiner_ext) return;1204first_texture1 = 0;1205tex1_combiner_ext = 0;12061207last_function = rgb_function;1208last_factor = rgb_factor;1209last_afunction = alpha_function;1210last_afactor = alpha_factor;1211last_rgb_invert = rgb_invert;12121213texture1_combiner_key = rgb_function | (rgb_factor << 4) |1214(alpha_function << 8) | (alpha_factor << 12) |1215(rgb_invert << 16);1216texture1_combinera_key = 0;1217strcpy(fragment_shader_texture1, "");1218}12191220switch(rgb_function)1221{1222case GR_COMBINE_FUNCTION_ZERO:1223if(num_tex == 0)1224strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(0.0); \n");1225else1226strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(0.0); \n");1227break;1228case GR_COMBINE_FUNCTION_LOCAL:1229if(num_tex == 0)1230strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");1231else1232strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");1233break;1234case GR_COMBINE_FUNCTION_LOCAL_ALPHA:1235if(num_tex == 0)1236strcat(fragment_shader_texture0, "vec4 ctexture0 = vec4(readtex0.a); \n");1237else1238strcat(fragment_shader_texture1, "vec4 ctexture1 = vec4(readtex1.a); \n");1239break;1240case GR_COMBINE_FUNCTION_SCALE_OTHER:1241writeGLSLTextureColorFactor(num_tex, rgb_factor);1242if(num_tex == 0)1243strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0); \n");1244else1245strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0; \n");1246break;1247case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:1248writeGLSLTextureColorFactor(num_tex, rgb_factor);1249if(num_tex == 0)1250strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + readtex0; \n");1251else1252strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + readtex1; \n");1253break;1254case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:1255writeGLSLTextureColorFactor(num_tex, rgb_factor);1256if(num_tex == 0)1257strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * vec4(0.0) + vec4(readtex0.a); \n");1258else1259strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * ctexture0 + vec4(readtex1.a); \n");1260break;1261case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:1262writeGLSLTextureColorFactor(num_tex, rgb_factor);1263if(num_tex == 0)1264strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0); \n");1265else1266strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1); \n");1267break;1268case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:1269writeGLSLTextureColorFactor(num_tex, rgb_factor);1270if(num_tex == 0)1271strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + readtex0; \n");1272else1273strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + readtex1; \n");1274break;1275case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:1276writeGLSLTextureColorFactor(num_tex, rgb_factor);1277if(num_tex == 0)1278strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (vec4(0.0) - readtex0) + vec4(readtex0.a); \n");1279else1280strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (ctexture0 - readtex1) + vec4(readtex1.a); \n");1281break;1282case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:1283writeGLSLTextureColorFactor(num_tex, rgb_factor);1284if(num_tex == 0)1285strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + readtex0; \n");1286else1287strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + readtex1; \n");1288break;1289case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:1290writeGLSLTextureColorFactor(num_tex, rgb_factor);1291if(num_tex == 0)1292strcat(fragment_shader_texture0, "vec4 ctexture0 = texture0_color_factor * (-readtex0) + vec4(readtex0.a); \n");1293else1294strcat(fragment_shader_texture1, "vec4 ctexture1 = texture1_color_factor * (-readtex1) + vec4(readtex1.a); \n");1295break;1296default:1297if(num_tex == 0)1298strcat(fragment_shader_texture0, "vec4 ctexture0 = readtex0; \n");1299else1300strcat(fragment_shader_texture1, "vec4 ctexture1 = readtex1; \n");1301display_warning("grTextCombine : unknown rgb function : %x", rgb_function);1302}13031304if (rgb_invert)1305{1306if(num_tex == 0)1307strcat(fragment_shader_texture0, "ctexture0 = vec4(1.0) - ctexture0; \n");1308else1309strcat(fragment_shader_texture1, "ctexture1 = vec4(1.0) - ctexture1; \n");1310}13111312switch(alpha_function)1313{1314case GR_COMBINE_FACTOR_ZERO:1315if(num_tex == 0)1316strcat(fragment_shader_texture0, "ctexture0.a = 0.0; \n");1317else1318strcat(fragment_shader_texture1, "ctexture1.a = 0.0; \n");1319break;1320case GR_COMBINE_FUNCTION_LOCAL:1321if(num_tex == 0)1322strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");1323else1324strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");1325break;1326case GR_COMBINE_FUNCTION_LOCAL_ALPHA:1327if(num_tex == 0)1328strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");1329else1330strcat(fragment_shader_texture1, "ctexture1.a = readtex1.a; \n");1331break;1332case GR_COMBINE_FUNCTION_SCALE_OTHER:1333writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1334if(num_tex == 0)1335strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0; \n");1336else1337strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a; \n");1338break;1339case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL:1340writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1341if(num_tex == 0)1342strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");1343else1344strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");1345break;1346case GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL_ALPHA:1347writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1348if(num_tex == 0)1349strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * 0.0 + readtex0.a; \n");1350else1351strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * ctexture0.a + readtex1.a; \n");1352break;1353case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL:1354writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1355if(num_tex == 0)1356strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a); \n");1357else1358strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a); \n");1359break;1360case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL:1361writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1362if(num_tex == 0)1363strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");1364else1365strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");1366break;1367case GR_COMBINE_FUNCTION_SCALE_OTHER_MINUS_LOCAL_ADD_LOCAL_ALPHA:1368writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1369if(num_tex == 0)1370strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (0.0 - readtex0.a) + readtex0.a; \n");1371else1372strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (ctexture0.a - readtex1.a) + readtex1.a; \n");1373break;1374case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL:1375writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1376if(num_tex == 0)1377strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");1378else1379strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");1380break;1381case GR_COMBINE_FUNCTION_SCALE_MINUS_LOCAL_ADD_LOCAL_ALPHA:1382writeGLSLTextureAlphaFactor(num_tex, alpha_factor);1383if(num_tex == 0)1384strcat(fragment_shader_texture0, "ctexture0.a = texture0_alpha_factor * (-readtex0.a) + readtex0.a; \n");1385else1386strcat(fragment_shader_texture1, "ctexture1.a = texture1_alpha_factor * (-readtex1.a) + readtex1.a; \n");1387break;1388default:1389if(num_tex == 0)1390strcat(fragment_shader_texture0, "ctexture0.a = readtex0.a; \n");1391else1392strcat(fragment_shader_texture1, "ctexture1.a = ctexture0.a; \n");1393display_warning("grTextCombine : unknown alpha function : %x", alpha_function);1394}13951396if (alpha_invert)1397{1398if(num_tex == 0)1399strcat(fragment_shader_texture0, "ctexture0.a = 1.0 - ctexture0.a; \n");1400else1401strcat(fragment_shader_texture1, "ctexture1.a = 1.0 - ctexture1.a; \n");1402}1403need_to_compile = 1;1404}14051406FX_ENTRY void FX_CALL1407grAlphaBlendFunction(1408GrAlphaBlendFnc_t rgb_sf, GrAlphaBlendFnc_t rgb_df,1409GrAlphaBlendFnc_t alpha_sf, GrAlphaBlendFnc_t alpha_df1410)1411{1412int sfactorRGB = 0, dfactorRGB = 0, sfactorAlpha = 0, dfactorAlpha = 0;1413LOG("grAlphaBlendFunction(%d,%d,%d,%d)\r\n", rgb_sf, rgb_df, alpha_sf, alpha_df);14141415switch(rgb_sf)1416{1417case GR_BLEND_ZERO:1418sfactorRGB = GL_ZERO;1419break;1420case GR_BLEND_SRC_ALPHA:1421sfactorRGB = GL_SRC_ALPHA;1422break;1423case GR_BLEND_ONE:1424sfactorRGB = GL_ONE;1425break;1426case GR_BLEND_ONE_MINUS_SRC_ALPHA:1427sfactorRGB = GL_ONE_MINUS_SRC_ALPHA;1428break;1429default:1430display_warning("grAlphaBlendFunction : rgb_sf = %x", rgb_sf);1431}14321433switch(rgb_df)1434{1435case GR_BLEND_ZERO:1436dfactorRGB = GL_ZERO;1437break;1438case GR_BLEND_SRC_ALPHA:1439dfactorRGB = GL_SRC_ALPHA;1440break;1441case GR_BLEND_ONE:1442dfactorRGB = GL_ONE;1443break;1444case GR_BLEND_ONE_MINUS_SRC_ALPHA:1445dfactorRGB = GL_ONE_MINUS_SRC_ALPHA;1446break;1447default:1448display_warning("grAlphaBlendFunction : rgb_df = %x", rgb_df);1449}14501451switch(alpha_sf)1452{1453case GR_BLEND_ZERO:1454sfactorAlpha = GL_ZERO;1455break;1456case GR_BLEND_ONE:1457sfactorAlpha = GL_ONE;1458break;1459default:1460display_warning("grAlphaBlendFunction : alpha_sf = %x", alpha_sf);1461}14621463switch(alpha_df)1464{1465case GR_BLEND_ZERO:1466dfactorAlpha = GL_ZERO;1467break;1468case GR_BLEND_ONE:1469dfactorAlpha = GL_ONE;1470break;1471default:1472display_warning("grAlphaBlendFunction : alpha_df = %x", alpha_df);1473}1474glEnable(GL_BLEND);1475if (blend_func_separate_support)1476glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);1477else1478glBlendFunc(sfactorRGB, dfactorRGB);1479}14801481FX_ENTRY void FX_CALL1482grAlphaTestReferenceValue( GrAlpha_t value )1483{1484LOG("grAlphaTestReferenceValue(%d)\r\n", value);1485alpha_ref = value;1486grAlphaTestFunction(alpha_func);1487}14881489FX_ENTRY void FX_CALL1490grAlphaTestFunction( GrCmpFnc_t function )1491{1492LOG("grAlphaTestFunction(%d)\r\n", function);1493alpha_func = function;1494switch(function)1495{1496case GR_CMP_GREATER:1497glAlphaFunc(GL_GREATER, alpha_ref/255.0f);1498break;1499case GR_CMP_GEQUAL:1500glAlphaFunc(GL_GEQUAL, alpha_ref/255.0f);1501break;1502case GR_CMP_ALWAYS:1503glAlphaFunc(GL_ALWAYS, alpha_ref/255.0f);1504glDisable(GL_ALPHA_TEST);1505return;1506break;1507default:1508display_warning("grAlphaTestFunction : unknown function : %x", function);1509}1510glEnable(GL_ALPHA_TEST);1511}15121513// fog15141515FX_ENTRY void FX_CALL1516grFogMode( GrFogMode_t mode )1517{1518LOG("grFogMode(%d)\r\n", mode);1519switch(mode)1520{1521case GR_FOG_DISABLE:1522glDisable(GL_FOG);1523fog_enabled = 0;1524break;1525case GR_FOG_WITH_TABLE_ON_Q:1526glEnable(GL_FOG);1527glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);1528fog_enabled = 1;1529break;1530case GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT:1531glEnable(GL_FOG);1532glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);1533fog_enabled = 2;1534break;1535default:1536display_warning("grFogMode : unknown mode : %x", mode);1537}1538need_to_compile = 1;1539}15401541FX_ENTRY float FX_CALL1542guFogTableIndexToW( int i )1543{1544LOG("guFogTableIndexToW(%d)\r\n", i);1545return (float)(pow(2.0, 3.0+(double)(i>>2)) / (8-(i&3)));1546}15471548FX_ENTRY void FX_CALL1549guFogGenerateLinear(GrFog_t *fogtable,1550float nearZ, float farZ )1551{1552LOG("guFogGenerateLinear(%f,%f)\r\n", nearZ, farZ);1553glFogi(GL_FOG_MODE, GL_LINEAR);1554glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);1555glFogf(GL_FOG_START, nearZ / 255.0f);1556glFogf(GL_FOG_END, farZ / 255.0f);1557}15581559FX_ENTRY void FX_CALL1560grFogTable( const GrFog_t ft[] )1561{1562LOG("grFogTable()\r\n");1563}15641565FX_ENTRY void FX_CALL1566grFogColorValue( GrColor_t fogcolor )1567{1568float color[4];1569LOG("grFogColorValue(%x)\r\n", fogcolor);15701571switch(lfb_color_fmt)1572{1573case GR_COLORFORMAT_ARGB:1574color[3] = ((fogcolor >> 24) & 0xFF) / 255.0f;1575color[0] = ((fogcolor >> 16) & 0xFF) / 255.0f;1576color[1] = ((fogcolor >> 8) & 0xFF) / 255.0f;1577color[2] = (fogcolor & 0xFF) / 255.0f;1578break;1579case GR_COLORFORMAT_RGBA:1580color[0] = ((fogcolor >> 24) & 0xFF) / 255.0f;1581color[1] = ((fogcolor >> 16) & 0xFF) / 255.0f;1582color[2] = ((fogcolor >> 8) & 0xFF) / 255.0f;1583color[3] = (fogcolor & 0xFF) / 255.0f;1584break;1585default:1586display_warning("grFogColorValue: unknown color format : %x", lfb_color_fmt);1587}15881589glFogfv(GL_FOG_COLOR, color);1590}15911592// chroma15931594FX_ENTRY void FX_CALL1595grChromakeyMode( GrChromakeyMode_t mode )1596{1597LOG("grChromakeyMode(%d)\r\n", mode);1598switch(mode)1599{1600case GR_CHROMAKEY_DISABLE:1601chroma_enabled = 0;1602break;1603case GR_CHROMAKEY_ENABLE:1604chroma_enabled = 1;1605break;1606default:1607display_warning("grChromakeyMode : unknown mode : %x", mode);1608}1609need_to_compile = 1;1610}16111612FX_ENTRY void FX_CALL1613grChromakeyValue( GrColor_t value )1614{1615LOG("grChromakeyValue(%x)\r\n", value);1616int chroma_color_location;16171618switch(lfb_color_fmt)1619{1620case GR_COLORFORMAT_ARGB:1621chroma_color[3] = 1.0;//((value >> 24) & 0xFF) / 255.0f;1622chroma_color[0] = ((value >> 16) & 0xFF) / 255.0f;1623chroma_color[1] = ((value >> 8) & 0xFF) / 255.0f;1624chroma_color[2] = (value & 0xFF) / 255.0f;1625break;1626case GR_COLORFORMAT_RGBA:1627chroma_color[0] = ((value >> 24) & 0xFF) / 255.0f;1628chroma_color[1] = ((value >> 16) & 0xFF) / 255.0f;1629chroma_color[2] = ((value >> 8) & 0xFF) / 255.0f;1630chroma_color[3] = 1.0;//(value & 0xFF) / 255.0f;1631break;1632default:1633display_warning("grChromakeyValue: unknown color format : %x", lfb_color_fmt);1634}16351636chroma_color_location = glGetUniformLocationARB(program_object, "chroma_color");1637glUniform4fARB(chroma_color_location, chroma_color[0], chroma_color[1],1638chroma_color[2], chroma_color[3]);1639}16401641static void setPattern()1642{1643int i;1644GLubyte stip[32*4];1645for(i=0; i<32; i++)1646{1647unsigned int val = (rand() << 17) | ((rand() & 1) << 16) | (rand() << 1) | (rand() & 1);1648stip[i*4+0] = (val >> 24) & 0xFF;1649stip[i*4+1] = (val >> 16) & 0xFF;1650stip[i*4+2] = (val >> 8) & 0xFF;1651stip[i*4+3] = val & 0xFF;1652}1653GLubyte texture[32*32*4];1654for(i=0; i<32; i++)1655{1656int j;1657for(j=0; j<4; j++)1658{1659texture[(i*32+j*8+0)*4+3] = ((stip[i*4+j] >> 7) & 1) ? 255 : 0;1660texture[(i*32+j*8+1)*4+3] = ((stip[i*4+j] >> 6) & 1) ? 255 : 0;1661texture[(i*32+j*8+2)*4+3] = ((stip[i*4+j] >> 5) & 1) ? 255 : 0;1662texture[(i*32+j*8+3)*4+3] = ((stip[i*4+j] >> 4) & 1) ? 255 : 0;1663texture[(i*32+j*8+4)*4+3] = ((stip[i*4+j] >> 3) & 1) ? 255 : 0;1664texture[(i*32+j*8+5)*4+3] = ((stip[i*4+j] >> 2) & 1) ? 255 : 0;1665texture[(i*32+j*8+6)*4+3] = ((stip[i*4+j] >> 1) & 1) ? 255 : 0;1666texture[(i*32+j*8+7)*4+3] = ((stip[i*4+j] >> 0) & 1) ? 255 : 0;1667}1668}1669glActiveTextureARB(GL_TEXTURE2_ARB);1670glEnable(GL_TEXTURE_2D);1671glBindTexture(GL_TEXTURE_2D, 33*1024*1024);1672glTexImage2D(GL_TEXTURE_2D, 0, 4, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);1673glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);1674glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);1675glDisable(GL_TEXTURE_2D);1676}16771678FX_ENTRY void FX_CALL1679grStipplePattern(1680GrStipplePattern_t stipple)1681{1682LOG("grStipplePattern(%x)\r\n", stipple);1683srand(stipple);1684setPattern();1685}16861687FX_ENTRY void FX_CALL1688grStippleMode( GrStippleMode_t mode )1689{1690LOG("grStippleMode(%d)\r\n", mode);1691switch(mode)1692{1693case GR_STIPPLE_DISABLE:1694dither_enabled = 0;1695glActiveTextureARB(GL_TEXTURE2_ARB);1696glDisable(GL_TEXTURE_2D);1697break;1698case GR_STIPPLE_PATTERN:1699setPattern();1700dither_enabled = 1;1701glActiveTextureARB(GL_TEXTURE2_ARB);1702glEnable(GL_TEXTURE_2D);1703break;1704case GR_STIPPLE_ROTATE:1705setPattern();1706dither_enabled = 1;1707glActiveTextureARB(GL_TEXTURE2_ARB);1708glEnable(GL_TEXTURE_2D);1709break;1710default:1711display_warning("grStippleMode:%x", mode);1712}1713need_to_compile = 1;1714}17151716FX_ENTRY void FX_CALL1717grColorCombineExt(GrCCUColor_t a, GrCombineMode_t a_mode,1718GrCCUColor_t b, GrCombineMode_t b_mode,1719GrCCUColor_t c, FxBool c_invert,1720GrCCUColor_t d, FxBool d_invert,1721FxU32 shift, FxBool invert)1722{1723LOG("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);1724if (invert) display_warning("grColorCombineExt : inverted result");1725if (shift) display_warning("grColorCombineExt : shift = %d", shift);17261727color_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |1728((b & 0x1F) << 7) | ((b_mode & 3) << 12) |1729((c & 0x1F) << 14) | ((c_invert & 1) << 19) |1730((d & 0x1F) << 20) | ((d_invert & 1) << 25);1731c_combiner_ext = 1;1732strcpy(fragment_shader_color_combiner, "");17331734switch(a)1735{1736case GR_CMBX_ZERO:1737strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");1738break;1739case GR_CMBX_TEXTURE_ALPHA:1740strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(ctexture1.a); \n");1741break;1742case GR_CMBX_CONSTANT_ALPHA:1743strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(constant_color.a); \n");1744break;1745case GR_CMBX_CONSTANT_COLOR:1746strcat(fragment_shader_color_combiner, "vec4 cs_a = constant_color; \n");1747break;1748case GR_CMBX_ITALPHA:1749strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(gl_Color.a); \n");1750break;1751case GR_CMBX_ITRGB:1752strcat(fragment_shader_color_combiner, "vec4 cs_a = gl_Color; \n");1753break;1754case GR_CMBX_TEXTURE_RGB:1755strcat(fragment_shader_color_combiner, "vec4 cs_a = ctexture1; \n");1756break;1757default:1758display_warning("grColorCombineExt : a = %x", a);1759strcat(fragment_shader_color_combiner, "vec4 cs_a = vec4(0.0); \n");1760}17611762switch(a_mode)1763{1764case GR_FUNC_MODE_ZERO:1765strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");1766break;1767case GR_FUNC_MODE_X:1768strcat(fragment_shader_color_combiner, "vec4 c_a = cs_a; \n");1769break;1770case GR_FUNC_MODE_ONE_MINUS_X:1771strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(1.0) - cs_a; \n");1772break;1773case GR_FUNC_MODE_NEGATIVE_X:1774strcat(fragment_shader_color_combiner, "vec4 c_a = -cs_a; \n");1775break;1776default:1777display_warning("grColorCombineExt : a_mode = %x", a_mode);1778strcat(fragment_shader_color_combiner, "vec4 c_a = vec4(0.0); \n");1779}17801781switch(b)1782{1783case GR_CMBX_ZERO:1784strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");1785break;1786case GR_CMBX_TEXTURE_ALPHA:1787strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(ctexture1.a); \n");1788break;1789case GR_CMBX_CONSTANT_ALPHA:1790strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(constant_color.a); \n");1791break;1792case GR_CMBX_CONSTANT_COLOR:1793strcat(fragment_shader_color_combiner, "vec4 cs_b = constant_color; \n");1794break;1795case GR_CMBX_ITALPHA:1796strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(gl_Color.a); \n");1797break;1798case GR_CMBX_ITRGB:1799strcat(fragment_shader_color_combiner, "vec4 cs_b = gl_Color; \n");1800break;1801case GR_CMBX_TEXTURE_RGB:1802strcat(fragment_shader_color_combiner, "vec4 cs_b = ctexture1; \n");1803break;1804default:1805display_warning("grColorCombineExt : b = %x", b);1806strcat(fragment_shader_color_combiner, "vec4 cs_b = vec4(0.0); \n");1807}18081809switch(b_mode)1810{1811case GR_FUNC_MODE_ZERO:1812strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");1813break;1814case GR_FUNC_MODE_X:1815strcat(fragment_shader_color_combiner, "vec4 c_b = cs_b; \n");1816break;1817case GR_FUNC_MODE_ONE_MINUS_X:1818strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(1.0) - cs_b; \n");1819break;1820case GR_FUNC_MODE_NEGATIVE_X:1821strcat(fragment_shader_color_combiner, "vec4 c_b = -cs_b; \n");1822break;1823default:1824display_warning("grColorCombineExt : b_mode = %x", b_mode);1825strcat(fragment_shader_color_combiner, "vec4 c_b = vec4(0.0); \n");1826}18271828switch(c)1829{1830case GR_CMBX_ZERO:1831strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");1832break;1833case GR_CMBX_TEXTURE_ALPHA:1834strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(ctexture1.a); \n");1835break;1836case GR_CMBX_ALOCAL:1837strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_b.a); \n");1838break;1839case GR_CMBX_AOTHER:1840strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(c_a.a); \n");1841break;1842case GR_CMBX_B:1843strcat(fragment_shader_color_combiner, "vec4 c_c = cs_b; \n");1844break;1845case GR_CMBX_CONSTANT_ALPHA:1846strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(constant_color.a); \n");1847break;1848case GR_CMBX_CONSTANT_COLOR:1849strcat(fragment_shader_color_combiner, "vec4 c_c = constant_color; \n");1850break;1851case GR_CMBX_ITALPHA:1852strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(gl_Color.a); \n");1853break;1854case GR_CMBX_ITRGB:1855strcat(fragment_shader_color_combiner, "vec4 c_c = gl_Color; \n");1856break;1857case GR_CMBX_TEXTURE_RGB:1858strcat(fragment_shader_color_combiner, "vec4 c_c = ctexture1; \n");1859break;1860default:1861display_warning("grColorCombineExt : c = %x", c);1862strcat(fragment_shader_color_combiner, "vec4 c_c = vec4(0.0); \n");1863}18641865if(c_invert)1866strcat(fragment_shader_color_combiner, "c_c = vec4(1.0) - c_c; \n");18671868switch(d)1869{1870case GR_CMBX_ZERO:1871strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");1872break;1873case GR_CMBX_ALOCAL:1874strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(c_b.a); \n");1875break;1876case GR_CMBX_B:1877strcat(fragment_shader_color_combiner, "vec4 c_d = cs_b; \n");1878break;1879case GR_CMBX_TEXTURE_RGB:1880strcat(fragment_shader_color_combiner, "vec4 c_d = ctexture1; \n");1881break;1882case GR_CMBX_ITRGB:1883strcat(fragment_shader_color_combiner, "vec4 c_d = gl_Color; \n");1884break;1885default:1886display_warning("grColorCombineExt : d = %x", d);1887strcat(fragment_shader_color_combiner, "vec4 c_d = vec4(0.0); \n");1888}18891890if(d_invert)1891strcat(fragment_shader_color_combiner, "c_d = vec4(1.0) - c_d; \n");18921893strcat(fragment_shader_color_combiner, "gl_FragColor = (c_a + c_b) * c_c + c_d; \n");18941895need_to_compile = 1;1896}18971898FX_ENTRY void FX_CALL1899grAlphaCombineExt(GrACUColor_t a, GrCombineMode_t a_mode,1900GrACUColor_t b, GrCombineMode_t b_mode,1901GrACUColor_t c, FxBool c_invert,1902GrACUColor_t d, FxBool d_invert,1903FxU32 shift, FxBool invert)1904{1905LOG("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);1906if (invert) display_warning("grAlphaCombineExt : inverted result");1907if (shift) display_warning("grAlphaCombineExt : shift = %d", shift);19081909alpha_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |1910((b & 0x1F) << 7) | ((b_mode & 3) << 12) |1911((c & 0x1F) << 14) | ((c_invert & 1) << 19) |1912((d & 0x1F) << 20) | ((d_invert & 1) << 25);1913a_combiner_ext = 1;1914strcpy(fragment_shader_alpha_combiner, "");19151916switch(a)1917{1918case GR_CMBX_ZERO:1919strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");1920break;1921case GR_CMBX_TEXTURE_ALPHA:1922strcat(fragment_shader_alpha_combiner, "float as_a = ctexture1.a; \n");1923break;1924case GR_CMBX_CONSTANT_ALPHA:1925strcat(fragment_shader_alpha_combiner, "float as_a = constant_color.a; \n");1926break;1927case GR_CMBX_ITALPHA:1928strcat(fragment_shader_alpha_combiner, "float as_a = gl_Color.a; \n");1929break;1930default:1931display_warning("grAlphaCombineExt : a = %x", a);1932strcat(fragment_shader_alpha_combiner, "float as_a = 0.0; \n");1933}19341935switch(a_mode)1936{1937case GR_FUNC_MODE_ZERO:1938strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");1939break;1940case GR_FUNC_MODE_X:1941strcat(fragment_shader_alpha_combiner, "float a_a = as_a; \n");1942break;1943case GR_FUNC_MODE_ONE_MINUS_X:1944strcat(fragment_shader_alpha_combiner, "float a_a = 1.0 - as_a; \n");1945break;1946case GR_FUNC_MODE_NEGATIVE_X:1947strcat(fragment_shader_alpha_combiner, "float a_a = -as_a; \n");1948break;1949default:1950display_warning("grAlphaCombineExt : a_mode = %x", a_mode);1951strcat(fragment_shader_alpha_combiner, "float a_a = 0.0; \n");1952}19531954switch(b)1955{1956case GR_CMBX_ZERO:1957strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");1958break;1959case GR_CMBX_TEXTURE_ALPHA:1960strcat(fragment_shader_alpha_combiner, "float as_b = ctexture1.a; \n");1961break;1962case GR_CMBX_CONSTANT_ALPHA:1963strcat(fragment_shader_alpha_combiner, "float as_b = constant_color.a; \n");1964break;1965case GR_CMBX_ITALPHA:1966strcat(fragment_shader_alpha_combiner, "float as_b = gl_Color.a; \n");1967break;1968default:1969display_warning("grAlphaCombineExt : b = %x", b);1970strcat(fragment_shader_alpha_combiner, "float as_b = 0.0; \n");1971}19721973switch(b_mode)1974{1975case GR_FUNC_MODE_ZERO:1976strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");1977break;1978case GR_FUNC_MODE_X:1979strcat(fragment_shader_alpha_combiner, "float a_b = as_b; \n");1980break;1981case GR_FUNC_MODE_ONE_MINUS_X:1982strcat(fragment_shader_alpha_combiner, "float a_b = 1.0 - as_b; \n");1983break;1984case GR_FUNC_MODE_NEGATIVE_X:1985strcat(fragment_shader_alpha_combiner, "float a_b = -as_b; \n");1986break;1987default:1988display_warning("grAlphaCombineExt : b_mode = %x", b_mode);1989strcat(fragment_shader_alpha_combiner, "float a_b = 0.0; \n");1990}19911992switch(c)1993{1994case GR_CMBX_ZERO:1995strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");1996break;1997case GR_CMBX_TEXTURE_ALPHA:1998strcat(fragment_shader_alpha_combiner, "float a_c = ctexture1.a; \n");1999break;2000case GR_CMBX_ALOCAL:2001strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");2002break;2003case GR_CMBX_AOTHER:2004strcat(fragment_shader_alpha_combiner, "float a_c = as_a; \n");2005break;2006case GR_CMBX_B:2007strcat(fragment_shader_alpha_combiner, "float a_c = as_b; \n");2008break;2009case GR_CMBX_CONSTANT_ALPHA:2010strcat(fragment_shader_alpha_combiner, "float a_c = constant_color.a; \n");2011break;2012case GR_CMBX_ITALPHA:2013strcat(fragment_shader_alpha_combiner, "float a_c = gl_Color.a; \n");2014break;2015default:2016display_warning("grAlphaCombineExt : c = %x", c);2017strcat(fragment_shader_alpha_combiner, "float a_c = 0.0; \n");2018}20192020if(c_invert)2021strcat(fragment_shader_alpha_combiner, "a_c = 1.0 - a_c; \n");20222023switch(d)2024{2025case GR_CMBX_ZERO:2026strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");2027break;2028case GR_CMBX_TEXTURE_ALPHA:2029strcat(fragment_shader_alpha_combiner, "float a_d = ctexture1.a; \n");2030break;2031case GR_CMBX_ALOCAL:2032strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");2033break;2034case GR_CMBX_B:2035strcat(fragment_shader_alpha_combiner, "float a_d = as_b; \n");2036break;2037default:2038display_warning("grAlphaCombineExt : d = %x", d);2039strcat(fragment_shader_alpha_combiner, "float a_d = 0.0; \n");2040}20412042if(d_invert)2043strcat(fragment_shader_alpha_combiner, "a_d = 1.0 - a_d; \n");20442045strcat(fragment_shader_alpha_combiner, "gl_FragColor.a = (a_a + a_b) * a_c + a_d; \n");20462047need_to_compile = 1;2048}20492050FX_ENTRY void FX_CALL2051grTexColorCombineExt(GrChipID_t tmu,2052GrTCCUColor_t a, GrCombineMode_t a_mode,2053GrTCCUColor_t b, GrCombineMode_t b_mode,2054GrTCCUColor_t c, FxBool c_invert,2055GrTCCUColor_t d, FxBool d_invert,2056FxU32 shift, FxBool invert)2057{2058int num_tex;2059LOG("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);20602061if (invert) display_warning("grTexColorCombineExt : inverted result");2062if (shift) display_warning("grTexColorCombineExt : shift = %d", shift);20632064if (tmu == GR_TMU0) num_tex = 1;2065else num_tex = 0;20662067if(num_tex == 0)2068{2069texture0_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |2070((b & 0x1F) << 7) | ((b_mode & 3) << 12) |2071((c & 0x1F) << 14) | ((c_invert & 1) << 19) |2072((d & 0x1F) << 20) | ((d_invert & 1) << 25);2073tex0_combiner_ext = 1;2074strcpy(fragment_shader_texture0, "");2075}2076else2077{2078texture1_combiner_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |2079((b & 0x1F) << 7) | ((b_mode & 3) << 12) |2080((c & 0x1F) << 14) | ((c_invert & 1) << 19) |2081((d & 0x1F) << 20) | ((d_invert & 1) << 25);2082tex1_combiner_ext = 1;2083strcpy(fragment_shader_texture1, "");2084}20852086switch(a)2087{2088case GR_CMBX_ZERO:2089if(num_tex == 0)2090strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");2091else2092strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");2093break;2094case GR_CMBX_ITALPHA:2095if(num_tex == 0)2096strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(gl_Color.a); \n");2097else2098strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(gl_Color.a); \n");2099break;2100case GR_CMBX_ITRGB:2101if(num_tex == 0)2102strcat(fragment_shader_texture0, "vec4 ctex0s_a = gl_Color; \n");2103else2104strcat(fragment_shader_texture1, "vec4 ctex1s_a = gl_Color; \n");2105break;2106case GR_CMBX_LOCAL_TEXTURE_ALPHA:2107if(num_tex == 0)2108strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(readtex0.a); \n");2109else2110strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(readtex1.a); \n");2111break;2112case GR_CMBX_LOCAL_TEXTURE_RGB:2113if(num_tex == 0)2114strcat(fragment_shader_texture0, "vec4 ctex0s_a = readtex0; \n");2115else2116strcat(fragment_shader_texture1, "vec4 ctex1s_a = readtex1; \n");2117break;2118case GR_CMBX_OTHER_TEXTURE_ALPHA:2119if(num_tex == 0)2120strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");2121else2122strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ctexture0.a); \n");2123break;2124case GR_CMBX_OTHER_TEXTURE_RGB:2125if(num_tex == 0)2126strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");2127else2128strcat(fragment_shader_texture1, "vec4 ctex1s_a = ctexture0; \n");2129break;2130case GR_CMBX_TMU_CCOLOR:2131if(num_tex == 0)2132strcat(fragment_shader_texture0, "vec4 ctex0s_a = ccolor0; \n");2133else2134strcat(fragment_shader_texture1, "vec4 ctex1s_a = ccolor1; \n");2135break;2136case GR_CMBX_TMU_CALPHA:2137if(num_tex == 0)2138strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(ccolor0.a); \n");2139else2140strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(ccolor1.a); \n");2141break;2142default:2143display_warning("grTexColorCombineExt : a = %x", a);2144if(num_tex == 0)2145strcat(fragment_shader_texture0, "vec4 ctex0s_a = vec4(0.0); \n");2146else2147strcat(fragment_shader_texture1, "vec4 ctex1s_a = vec4(0.0); \n");2148}21492150switch(a_mode)2151{2152case GR_FUNC_MODE_ZERO:2153if(num_tex == 0)2154strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");2155else2156strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");2157break;2158case GR_FUNC_MODE_X:2159if(num_tex == 0)2160strcat(fragment_shader_texture0, "vec4 ctex0_a = ctex0s_a; \n");2161else2162strcat(fragment_shader_texture1, "vec4 ctex1_a = ctex1s_a; \n");2163break;2164case GR_FUNC_MODE_ONE_MINUS_X:2165if(num_tex == 0)2166strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(1.0) - ctex0s_a; \n");2167else2168strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(1.0) - ctex1s_a; \n");2169break;2170case GR_FUNC_MODE_NEGATIVE_X:2171if(num_tex == 0)2172strcat(fragment_shader_texture0, "vec4 ctex0_a = -ctex0s_a; \n");2173else2174strcat(fragment_shader_texture1, "vec4 ctex1_a = -ctex1s_a; \n");2175break;2176default:2177display_warning("grTexColorCombineExt : a_mode = %x", a_mode);2178if(num_tex == 0)2179strcat(fragment_shader_texture0, "vec4 ctex0_a = vec4(0.0); \n");2180else2181strcat(fragment_shader_texture1, "vec4 ctex1_a = vec4(0.0); \n");2182}21832184switch(b)2185{2186case GR_CMBX_ZERO:2187if(num_tex == 0)2188strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");2189else2190strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");2191break;2192case GR_CMBX_ITALPHA:2193if(num_tex == 0)2194strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(gl_Color.a); \n");2195else2196strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(gl_Color.a); \n");2197break;2198case GR_CMBX_ITRGB:2199if(num_tex == 0)2200strcat(fragment_shader_texture0, "vec4 ctex0s_b = gl_Color; \n");2201else2202strcat(fragment_shader_texture1, "vec4 ctex1s_b = gl_Color; \n");2203break;2204case GR_CMBX_LOCAL_TEXTURE_ALPHA:2205if(num_tex == 0)2206strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(readtex0.a); \n");2207else2208strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(readtex1.a); \n");2209break;2210case GR_CMBX_LOCAL_TEXTURE_RGB:2211if(num_tex == 0)2212strcat(fragment_shader_texture0, "vec4 ctex0s_b = readtex0; \n");2213else2214strcat(fragment_shader_texture1, "vec4 ctex1s_b = readtex1; \n");2215break;2216case GR_CMBX_OTHER_TEXTURE_ALPHA:2217if(num_tex == 0)2218strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");2219else2220strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ctexture0.a); \n");2221break;2222case GR_CMBX_OTHER_TEXTURE_RGB:2223if(num_tex == 0)2224strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");2225else2226strcat(fragment_shader_texture1, "vec4 ctex1s_b = ctexture0; \n");2227break;2228case GR_CMBX_TMU_CALPHA:2229if(num_tex == 0)2230strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(ccolor0.a); \n");2231else2232strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(ccolor1.a); \n");2233break;2234case GR_CMBX_TMU_CCOLOR:2235if(num_tex == 0)2236strcat(fragment_shader_texture0, "vec4 ctex0s_b = ccolor0; \n");2237else2238strcat(fragment_shader_texture1, "vec4 ctex1s_b = ccolor1; \n");2239break;2240default:2241display_warning("grTexColorCombineExt : b = %x", b);2242if(num_tex == 0)2243strcat(fragment_shader_texture0, "vec4 ctex0s_b = vec4(0.0); \n");2244else2245strcat(fragment_shader_texture1, "vec4 ctex1s_b = vec4(0.0); \n");2246}22472248switch(b_mode)2249{2250case GR_FUNC_MODE_ZERO:2251if(num_tex == 0)2252strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");2253else2254strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");2255break;2256case GR_FUNC_MODE_X:2257if(num_tex == 0)2258strcat(fragment_shader_texture0, "vec4 ctex0_b = ctex0s_b; \n");2259else2260strcat(fragment_shader_texture1, "vec4 ctex1_b = ctex1s_b; \n");2261break;2262case GR_FUNC_MODE_ONE_MINUS_X:2263if(num_tex == 0)2264strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(1.0) - ctex0s_b; \n");2265else2266strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(1.0) - ctex1s_b; \n");2267break;2268case GR_FUNC_MODE_NEGATIVE_X:2269if(num_tex == 0)2270strcat(fragment_shader_texture0, "vec4 ctex0_b = -ctex0s_b; \n");2271else2272strcat(fragment_shader_texture1, "vec4 ctex1_b = -ctex1s_b; \n");2273break;2274default:2275display_warning("grTexColorCombineExt : b_mode = %x", b_mode);2276if(num_tex == 0)2277strcat(fragment_shader_texture0, "vec4 ctex0_b = vec4(0.0); \n");2278else2279strcat(fragment_shader_texture1, "vec4 ctex1_b = vec4(0.0); \n");2280}22812282switch(c)2283{2284case GR_CMBX_ZERO:2285if(num_tex == 0)2286strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");2287else2288strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");2289break;2290case GR_CMBX_B:2291if(num_tex == 0)2292strcat(fragment_shader_texture0, "vec4 ctex0_c = ctex0s_b; \n");2293else2294strcat(fragment_shader_texture1, "vec4 ctex1_c = ctex1s_b; \n");2295break;2296case GR_CMBX_DETAIL_FACTOR:2297if(num_tex == 0)2298strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(lambda); \n");2299else2300strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(lambda); \n");2301break;2302case GR_CMBX_ITRGB:2303if(num_tex == 0)2304strcat(fragment_shader_texture0, "vec4 ctex0_c = gl_Color; \n");2305else2306strcat(fragment_shader_texture1, "vec4 ctex1_c = gl_Color; \n");2307break;2308case GR_CMBX_ITALPHA:2309if(num_tex == 0)2310strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(gl_Color.a); \n");2311else2312strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(gl_Color.a); \n");2313break;2314case GR_CMBX_LOCAL_TEXTURE_ALPHA:2315if(num_tex == 0)2316strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(readtex0.a); \n");2317else2318strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(readtex1.a); \n");2319break;2320case GR_CMBX_LOCAL_TEXTURE_RGB:2321if(num_tex == 0)2322strcat(fragment_shader_texture0, "vec4 ctex0_c = readtex0; \n");2323else2324strcat(fragment_shader_texture1, "vec4 ctex1_c = readtex1; \n");2325break;2326case GR_CMBX_OTHER_TEXTURE_ALPHA:2327if(num_tex == 0)2328strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");2329else2330strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ctexture0.a); \n");2331break;2332case GR_CMBX_OTHER_TEXTURE_RGB:2333if(num_tex == 0)2334strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");2335else2336strcat(fragment_shader_texture1, "vec4 ctex1_c = ctexture0; \n");2337break;2338case GR_CMBX_TMU_CALPHA:2339if(num_tex == 0)2340strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(ccolor0.a); \n");2341else2342strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(ccolor1.a); \n");2343break;2344case GR_CMBX_TMU_CCOLOR:2345if(num_tex == 0)2346strcat(fragment_shader_texture0, "vec4 ctex0_c = ccolor0; \n");2347else2348strcat(fragment_shader_texture1, "vec4 ctex1_c = ccolor1; \n");2349break;2350default:2351display_warning("grTexColorCombineExt : c = %x", c);2352if(num_tex == 0)2353strcat(fragment_shader_texture0, "vec4 ctex0_c = vec4(0.0); \n");2354else2355strcat(fragment_shader_texture1, "vec4 ctex1_c = vec4(0.0); \n");2356}23572358if(c_invert)2359{2360if(num_tex == 0)2361strcat(fragment_shader_texture0, "ctex0_c = vec4(1.0) - ctex0_c; \n");2362else2363strcat(fragment_shader_texture1, "ctex1_c = vec4(1.0) - ctex1_c; \n");2364}23652366switch(d)2367{2368case GR_CMBX_ZERO:2369if(num_tex == 0)2370strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");2371else2372strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");2373break;2374case GR_CMBX_B:2375if(num_tex == 0)2376strcat(fragment_shader_texture0, "vec4 ctex0_d = ctex0s_b; \n");2377else2378strcat(fragment_shader_texture1, "vec4 ctex1_d = ctex1s_b; \n");2379break;2380case GR_CMBX_ITRGB:2381if(num_tex == 0)2382strcat(fragment_shader_texture0, "vec4 ctex0_d = gl_Color; \n");2383else2384strcat(fragment_shader_texture1, "vec4 ctex1_d = gl_Color; \n");2385break;2386case GR_CMBX_LOCAL_TEXTURE_ALPHA:2387if(num_tex == 0)2388strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(readtex0.a); \n");2389else2390strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(readtex1.a); \n");2391break;2392default:2393display_warning("grTexColorCombineExt : d = %x", d);2394if(num_tex == 0)2395strcat(fragment_shader_texture0, "vec4 ctex0_d = vec4(0.0); \n");2396else2397strcat(fragment_shader_texture1, "vec4 ctex1_d = vec4(0.0); \n");2398}23992400if(d_invert)2401{2402if(num_tex == 0)2403strcat(fragment_shader_texture0, "ctex0_d = vec4(1.0) - ctex0_d; \n");2404else2405strcat(fragment_shader_texture1, "ctex1_d = vec4(1.0) - ctex1_d; \n");2406}24072408if(num_tex == 0)2409strcat(fragment_shader_texture0, "vec4 ctexture0 = (ctex0_a + ctex0_b) * ctex0_c + ctex0_d; \n");2410else2411strcat(fragment_shader_texture1, "vec4 ctexture1 = (ctex1_a + ctex1_b) * ctex1_c + ctex1_d; \n");2412need_to_compile = 1;2413}24142415FX_ENTRY void FX_CALL2416grTexAlphaCombineExt(GrChipID_t tmu,2417GrTACUColor_t a, GrCombineMode_t a_mode,2418GrTACUColor_t b, GrCombineMode_t b_mode,2419GrTACUColor_t c, FxBool c_invert,2420GrTACUColor_t d, FxBool d_invert,2421FxU32 shift, FxBool invert)2422{2423int num_tex;2424LOG("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);24252426if (invert) display_warning("grTexAlphaCombineExt : inverted result");2427if (shift) display_warning("grTexAlphaCombineExt : shift = %d", shift);24282429if (tmu == GR_TMU0) num_tex = 1;2430else num_tex = 0;24312432if(num_tex == 0)2433{2434texture0_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |2435((b & 0x1F) << 7) | ((b_mode & 3) << 12) |2436((c & 0x1F) << 14) | ((c_invert & 1) << 19) |2437((d & 0x1F) << 20) | ((d_invert & 1) << 25);2438}2439else2440{2441texture1_combinera_key = 0x80000000 | (a & 0x1F) | ((a_mode & 3) << 5) |2442((b & 0x1F) << 7) | ((b_mode & 3) << 12) |2443((c & 0x1F) << 14) | ((c_invert & 1) << 19) |2444((d & 0x1F) << 20) | ((d_invert & 1) << 25);2445}24462447switch(a)2448{2449case GR_CMBX_ITALPHA:2450if(num_tex == 0)2451strcat(fragment_shader_texture0, "ctex0s_a.a = gl_Color.a; \n");2452else2453strcat(fragment_shader_texture1, "ctex1s_a.a = gl_Color.a; \n");2454break;2455case GR_CMBX_LOCAL_TEXTURE_ALPHA:2456if(num_tex == 0)2457strcat(fragment_shader_texture0, "ctex0s_a.a = readtex0.a; \n");2458else2459strcat(fragment_shader_texture1, "ctex1s_a.a = readtex1.a; \n");2460break;2461case GR_CMBX_OTHER_TEXTURE_ALPHA:2462if(num_tex == 0)2463strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");2464else2465strcat(fragment_shader_texture1, "ctex1s_a.a = ctexture0.a; \n");2466break;2467case GR_CMBX_TMU_CALPHA:2468if(num_tex == 0)2469strcat(fragment_shader_texture0, "ctex0s_a.a = ccolor0.a; \n");2470else2471strcat(fragment_shader_texture1, "ctex1s_a.a = ccolor1.a; \n");2472break;2473default:2474display_warning("grTexAlphaCombineExt : a = %x", a);2475if(num_tex == 0)2476strcat(fragment_shader_texture0, "ctex0s_a.a = 0.0; \n");2477else2478strcat(fragment_shader_texture1, "ctex1s_a.a = 0.0; \n");2479}24802481switch(a_mode)2482{2483case GR_FUNC_MODE_ZERO:2484if(num_tex == 0)2485strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");2486else2487strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");2488break;2489case GR_FUNC_MODE_X:2490if(num_tex == 0)2491strcat(fragment_shader_texture0, "ctex0_a.a = ctex0s_a.a; \n");2492else2493strcat(fragment_shader_texture1, "ctex1_a.a = ctex1s_a.a; \n");2494break;2495case GR_FUNC_MODE_ONE_MINUS_X:2496if(num_tex == 0)2497strcat(fragment_shader_texture0, "ctex0_a.a = 1.0 - ctex0s_a.a; \n");2498else2499strcat(fragment_shader_texture1, "ctex1_a.a = 1.0 - ctex1s_a.a; \n");2500break;2501case GR_FUNC_MODE_NEGATIVE_X:2502if(num_tex == 0)2503strcat(fragment_shader_texture0, "ctex0_a.a = -ctex0s_a.a; \n");2504else2505strcat(fragment_shader_texture1, "ctex1_a.a = -ctex1s_a.a; \n");2506break;2507default:2508display_warning("grTexAlphaCombineExt : a_mode = %x", a_mode);2509if(num_tex == 0)2510strcat(fragment_shader_texture0, "ctex0_a.a = 0.0; \n");2511else2512strcat(fragment_shader_texture1, "ctex1_a.a = 0.0; \n");2513}25142515switch(b)2516{2517case GR_CMBX_ITALPHA:2518if(num_tex == 0)2519strcat(fragment_shader_texture0, "ctex0s_b.a = gl_Color.a; \n");2520else2521strcat(fragment_shader_texture1, "ctex1s_b.a = gl_Color.a; \n");2522break;2523case GR_CMBX_LOCAL_TEXTURE_ALPHA:2524if(num_tex == 0)2525strcat(fragment_shader_texture0, "ctex0s_b.a = readtex0.a; \n");2526else2527strcat(fragment_shader_texture1, "ctex1s_b.a = readtex1.a; \n");2528break;2529case GR_CMBX_OTHER_TEXTURE_ALPHA:2530if(num_tex == 0)2531strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");2532else2533strcat(fragment_shader_texture1, "ctex1s_b.a = ctexture0.a; \n");2534break;2535case GR_CMBX_TMU_CALPHA:2536if(num_tex == 0)2537strcat(fragment_shader_texture0, "ctex0s_b.a = ccolor0.a; \n");2538else2539strcat(fragment_shader_texture1, "ctex1s_b.a = ccolor1.a; \n");2540break;2541default:2542display_warning("grTexAlphaCombineExt : b = %x", b);2543if(num_tex == 0)2544strcat(fragment_shader_texture0, "ctex0s_b.a = 0.0; \n");2545else2546strcat(fragment_shader_texture1, "ctex1s_b.a = 0.0; \n");2547}25482549switch(b_mode)2550{2551case GR_FUNC_MODE_ZERO:2552if(num_tex == 0)2553strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");2554else2555strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");2556break;2557case GR_FUNC_MODE_X:2558if(num_tex == 0)2559strcat(fragment_shader_texture0, "ctex0_b.a = ctex0s_b.a; \n");2560else2561strcat(fragment_shader_texture1, "ctex1_b.a = ctex1s_b.a; \n");2562break;2563case GR_FUNC_MODE_ONE_MINUS_X:2564if(num_tex == 0)2565strcat(fragment_shader_texture0, "ctex0_b.a = 1.0 - ctex0s_b.a; \n");2566else2567strcat(fragment_shader_texture1, "ctex1_b.a = 1.0 - ctex1s_b.a; \n");2568break;2569case GR_FUNC_MODE_NEGATIVE_X:2570if(num_tex == 0)2571strcat(fragment_shader_texture0, "ctex0_b.a = -ctex0s_b.a; \n");2572else2573strcat(fragment_shader_texture1, "ctex1_b.a = -ctex1s_b.a; \n");2574break;2575default:2576display_warning("grTexAlphaCombineExt : b_mode = %x", b_mode);2577if(num_tex == 0)2578strcat(fragment_shader_texture0, "ctex0_b.a = 0.0; \n");2579else2580strcat(fragment_shader_texture1, "ctex1_b.a = 0.0; \n");2581}25822583switch(c)2584{2585case GR_CMBX_ZERO:2586if(num_tex == 0)2587strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");2588else2589strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");2590break;2591case GR_CMBX_B:2592if(num_tex == 0)2593strcat(fragment_shader_texture0, "ctex0_c.a = ctex0s_b.a; \n");2594else2595strcat(fragment_shader_texture1, "ctex1_c.a = ctex1s_b.a; \n");2596break;2597case GR_CMBX_DETAIL_FACTOR:2598if(num_tex == 0)2599strcat(fragment_shader_texture0, "ctex0_c.a = lambda; \n");2600else2601strcat(fragment_shader_texture1, "ctex1_c.a = lambda; \n");2602break;2603case GR_CMBX_ITALPHA:2604if(num_tex == 0)2605strcat(fragment_shader_texture0, "ctex0_c.a = gl_Color.a; \n");2606else2607strcat(fragment_shader_texture1, "ctex1_c.a = gl_Color.a; \n");2608break;2609case GR_CMBX_LOCAL_TEXTURE_ALPHA:2610if(num_tex == 0)2611strcat(fragment_shader_texture0, "ctex0_c.a = readtex0.a; \n");2612else2613strcat(fragment_shader_texture1, "ctex1_c.a = readtex1.a; \n");2614break;2615case GR_CMBX_OTHER_TEXTURE_ALPHA:2616if(num_tex == 0)2617strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");2618else2619strcat(fragment_shader_texture1, "ctex1_c.a = ctexture0.a; \n");2620break;2621case GR_CMBX_TMU_CALPHA:2622if(num_tex == 0)2623strcat(fragment_shader_texture0, "ctex0_c.a = ccolor0.a; \n");2624else2625strcat(fragment_shader_texture1, "ctex1_c.a = ccolor1.a; \n");2626break;2627default:2628display_warning("grTexAlphaCombineExt : c = %x", c);2629if(num_tex == 0)2630strcat(fragment_shader_texture0, "ctex0_c.a = 0.0; \n");2631else2632strcat(fragment_shader_texture1, "ctex1_c.a = 0.0; \n");2633}26342635if(c_invert)2636{2637if(num_tex == 0)2638strcat(fragment_shader_texture0, "ctex0_c.a = 1.0 - ctex0_c.a; \n");2639else2640strcat(fragment_shader_texture1, "ctex1_c.a = 1.0 - ctex1_c.a; \n");2641}26422643switch(d)2644{2645case GR_CMBX_ZERO:2646if(num_tex == 0)2647strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");2648else2649strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");2650break;2651case GR_CMBX_B:2652if(num_tex == 0)2653strcat(fragment_shader_texture0, "ctex0_d.a = ctex0s_b.a; \n");2654else2655strcat(fragment_shader_texture1, "ctex1_d.a = ctex1s_b.a; \n");2656break;2657case GR_CMBX_ITALPHA:2658if(num_tex == 0)2659strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");2660else2661strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");2662break;2663case GR_CMBX_ITRGB:2664if(num_tex == 0)2665strcat(fragment_shader_texture0, "ctex0_d.a = gl_Color.a; \n");2666else2667strcat(fragment_shader_texture1, "ctex1_d.a = gl_Color.a; \n");2668break;2669case GR_CMBX_LOCAL_TEXTURE_ALPHA:2670if(num_tex == 0)2671strcat(fragment_shader_texture0, "ctex0_d.a = readtex0.a; \n");2672else2673strcat(fragment_shader_texture1, "ctex1_d.a = readtex1.a; \n");2674break;2675default:2676display_warning("grTexAlphaCombineExt : d = %x", d);2677if(num_tex == 0)2678strcat(fragment_shader_texture0, "ctex0_d.a = 0.0; \n");2679else2680strcat(fragment_shader_texture1, "ctex1_d.a = 0.0; \n");2681}26822683if(d_invert)2684{2685if(num_tex == 0)2686strcat(fragment_shader_texture0, "ctex0_d.a = 1.0 - ctex0_d.a; \n");2687else2688strcat(fragment_shader_texture1, "ctex1_d.a = 1.0 - ctex1_d.a; \n");2689}26902691if(num_tex == 0)2692strcat(fragment_shader_texture0, "ctexture0.a = (ctex0_a.a + ctex0_b.a) * ctex0_c.a + ctex0_d.a; \n");2693else2694strcat(fragment_shader_texture1, "ctexture1.a = (ctex1_a.a + ctex1_b.a) * ctex1_c.a + ctex1_d.a; \n");26952696need_to_compile = 1;2697}26982699FX_ENTRY void FX_CALL2700grConstantColorValueExt(GrChipID_t tmu,2701GrColor_t value)2702{2703int num_tex;2704LOG("grConstantColorValueExt(%d,%d)\r\n", tmu, value);27052706if (tmu == GR_TMU0) num_tex = 1;2707else num_tex = 0;27082709switch(lfb_color_fmt)2710{2711case GR_COLORFORMAT_ARGB:2712if(num_tex == 0)2713{2714ccolor0[3] = ((value >> 24) & 0xFF) / 255.0f;2715ccolor0[0] = ((value >> 16) & 0xFF) / 255.0f;2716ccolor0[1] = ((value >> 8) & 0xFF) / 255.0f;2717ccolor0[2] = (value & 0xFF) / 255.0f;2718}2719else2720{2721ccolor1[3] = ((value >> 24) & 0xFF) / 255.0f;2722ccolor1[0] = ((value >> 16) & 0xFF) / 255.0f;2723ccolor1[1] = ((value >> 8) & 0xFF) / 255.0f;2724ccolor1[2] = (value & 0xFF) / 255.0f;2725}2726break;2727case GR_COLORFORMAT_RGBA:2728if(num_tex == 0)2729{2730ccolor0[0] = ((value >> 24) & 0xFF) / 255.0f;2731ccolor0[1] = ((value >> 16) & 0xFF) / 255.0f;2732ccolor0[2] = ((value >> 8) & 0xFF) / 255.0f;2733ccolor0[3] = (value & 0xFF) / 255.0f;2734}2735else2736{2737ccolor1[0] = ((value >> 24) & 0xFF) / 255.0f;2738ccolor1[1] = ((value >> 16) & 0xFF) / 255.0f;2739ccolor1[2] = ((value >> 8) & 0xFF) / 255.0f;2740ccolor1[3] = (value & 0xFF) / 255.0f;2741}2742break;2743default:2744display_warning("grConstantColorValue: unknown color format : %x", lfb_color_fmt);2745}27462747if(num_tex == 0)2748{2749ccolor0_location = glGetUniformLocationARB(program_object, "ccolor0");2750glUniform4fARB(ccolor0_location, ccolor0[0], ccolor0[1], ccolor0[2], ccolor0[3]);2751}2752else2753{2754ccolor1_location = glGetUniformLocationARB(program_object, "ccolor1");2755glUniform4fARB(ccolor1_location, ccolor1[0], ccolor1[1], ccolor1[2], ccolor1[3]);2756}2757}275827592760