typedef struct { int cmd:8; unsigned int muxs0:24; cc1 ac1 unsigned int muxs1:32; cc2 ac2 } Gsetcombine; /* * SetCombineMode macros are NOT redunant. It allow the C preprocessor * to substitute single parameter which includes commas in the token and * rescan for higher parameter count macro substitution. * * eg. gsDPSetCombineMode(G_CC_MODULATE, G_CC_MODULATE) turns into * gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0, * TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0) */ The above example inputs the values into the spaces below, which is then packed gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \ a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \ { \ _SHIFTL(G_SETCOMBINE, 24, 8) | \ _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \ G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \ GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), 0, 24), \ (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, \ G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \ GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, \ G_ACMUX_##Ac1, G_CCMUX_##d1, \ G_ACMUX_##Ab1, G_ACMUX_##Ad1)) \ } =Zoinkitys Original (My Corrections and legnths)======================================================== | | | upper word Legnth (bits) Options | | 00F00000 a0 4 com, t0, t1, Prim, Shade, Env, Noise, 1, 0 | | 000F8000 c0 5 com, t0, t1, Prim, Shade, Env, Scale, Com_A, t0_A, T1_A, Prim_A, Shade_A, | Env_A, L_F, P_L_F, K5, 0 | | 00007000 AA0 3 com, t0, t1, Prim, Shade, Env, 1, 0 | | 00000E00 AC0 3 T0, T1, Prim, Shade, Env, L_F, P_L_F, 0 | | 000001E0 a1 4 | | 0000001F c1 5 | | | | lower word | | F0000000 b0 4 com, t0, t1, Prim, Shade, Env, center, k4, 0 | | 0F000000 b1 4 com, t0, t1, Prim, Shade, Env, 1, 0 | | 00E00000 AA1 3 com, t0, t1, Prim, Shade, Env, 1, 0 | | 001C0000 AC1 3 com, t0, t1, Prim, Shade, Env, 1, 0 | | 00038000 d0 3 | | 00007000 AB0 3 | | 00000E00 AD0 3 | | 000001C0 d1 3 | | 00000038 AB1 3 | | 00000007 AD1 3 | ======================================================================================================== In case the hex is confusing, I find it so, I made a bitmap. Each group is a value. -Bit Map----------------------------------------- | t1 L_F t1 LF com SHADE |expected | t1 l_f t1 lf com shade | | 0010 01101 010 000 0000 00100 |Archives:509478.bin |0000 0000 1111 11111 111 111 1111 11111 | | a0 c0 A0 C0 a1 c1 | ________________________________ | | |CYCLE1 (TRILERP) | | t0 0 0 0 t0 t0 t0 0 0 SHADE |expected |CC0: t1 - t0 * LF + t0 | | t0 0 0 0 t0 t0 t0 0 0 shade |Archives:509478.bin |AC0: t1 - t0 * lf + t0 | |0001 1111 111 111 001 001 001 111 111 100 | | | |1111 1111 111 111 111 111 111 111 111 111 | |CYCLE2 (MODULATERGB) | | b0 b1 A1 C1 d0 B0 D0 d1 B1 D1 | |CC1: Com - 0 * shade + 0 | | | |AC1: 0 - 0 * 0 + shade | ------------------------------------------------- |_______________________________| Below lists the values of the combine modes. Where the legnth is 3 bits, use the ACMUX values. General Rule of thumb is, if the value is all 1's then the value = 0 The exotic Modes are only available to values of bit legnths of 5 (c0 and c1). /* * G_SETCOMBINE: color combine modes --- This stuff is direct from SDK */ /* Color combiner constants: */ #define G_CCMUX_COMBINED 0 combined output from cycle 1 mode #define G_CCMUX_TEXEL0 1 texture map output #define G_CCMUX_TEXEL1 2 texture map output from tile+1 #define G_CCMUX_PRIMITIVE 3 PrimColor #define G_CCMUX_SHADE 4 Shade color #define G_CCMUX_ENVIRONMENT 5 Environment color #define G_CCMUX_CENTER 6 chroma key center value #define G_CCMUX_SCALE 6 key scale value #define G_CCMUX_1 6 1.0 #define G_CCMUX_COMBINED_ALPHA 7 combined alpha output from cycle 1 #define G_CCMUX_NOISE 7 Random (Static on old TV) #define G_CCMUX_K4 7 color convert constant K4 #define G_CV_K4 = 114 #define G_CCMUX_TEXEL0_ALPHA 8 texture map alpha #define G_CCMUX_TEXEL1_ALPHA 9 texture map alpha from tile+1 #define G_CCMUX_PRIMITIVE_ALPHA 10 A PrimColor Alpha #define G_CCMUX_SHADE_ALPHA 11 B Shade alpha #define G_CCMUX_ENV_ALPHA 12 C Environment color alpha #define G_CCMUX_LOD_FRACTION 13 D LOD fraction L_F #define G_CCMUX_PRIM_LOD_FRAC 14 E Prim LOD fraction P_L_F #define G_CCMUX_K5 15 F color convert constant K5 #define G_CV_K5 = 42 #define G_CCMUX_0 31 1F 0.0 /* Alpha combiner constants: */ #define G_ACMUX_COMBINED 0 #define G_ACMUX_LOD_FRACTION 0 #define G_ACMUX_TEXEL0 1 #define G_ACMUX_TEXEL1 2 #define G_ACMUX_PRIMITIVE 3 #define G_ACMUX_SHADE 4 #define G_ACMUX_ENVIRONMENT 5 #define G_ACMUX_PRIM_LOD_FRAC 6 #define G_ACMUX_1 6 #define G_ACMUX_0 7 These are some common pattern names. They're probably from source, since they were gleaned from the internal names you see in some roms. At the very least, the patterns are very consistant from game to game. Note that there are two sets of these for each command: x0 and x1 - CONFIRMED THIS IS SOURCE ============================================================================================= SetCombine Mode Description =========================== The Combiner 0 in 1 cycle should be set to SHADE for untextured Tris or MODULATEI for textured tris, or MODULATEIA for transparent textures. In 2 Cycle Mode, 0 should be set to TRILERP (or TEMPLERP for custom transition distance) if textured with a Mip-Mapable texture (<2048 Bytes), and 1 should be set to MODULATEI2/IA2. If the Tri is UnTextured or the Texture is Non-Mip-mapable (>2048 Bytes) 0 should be set to MODULATEI/IA and 1 set to PASS2 While there are Presets for both I and RGB, they are the same combiner and dont make any difference. Where the color output will be (a-b)*c+d and the alpha output will be (A-B)*C+D. The values you can use for each of a, b, c, d, A, B, C, and D are above. =============================================================================================== Preset names | | G_CC_ | (a - b) * c + d |(A - B) * C + D ----------------------------------------------------------------------------------------------- PRIMITIVE | 0 0 0 prim. |0 0 0 prim. SHADE | 0 0 0 shade |0 0 0 shade SHADEDECALA | 0 0 0 shade |0 0 0 texel0 DECALRGB | 0 0 0 texel0 |0 0 0 shade DECALRGBA | 0 0 0 texel0 |0 0 0 texel0 ADDRGB | 1 0 texel0 shade |0 0 0 shade ADDRGBDECALA | 1 0 texel0 shade |0 0 0 texel0 MODULATERGB | texel0 0 shade 0 |0 0 0 shade MODULATEI | texel0 0 shade 0 |0 0 0 shade MODULATERGBA | texel0 0 shade 0 |texel0 0 shade 0 MODULATEIA | texel0 0 shade 0 |texel0 0 shade 0 MODULATERGBDECALA | texel0 0 shade 0 |0 0 0 texel0 MODULATEIDECALA | texel0 0 shade 0 |0 0 0 texel0 MODULATERGB_PRIM | texel0 0 prim. 0 |0 0 0 prim. MODULATEI_PRIM | texel0 0 prim. 0 |0 0 0 prim. MODULATERGBA_PRIM | texel0 0 prim. 0 |texel0 0 prim. 0 MODULATEIA_PRIM | texel0 0 prim. 0 |texel0 0 prim. 0 MODULATERGBDECALA_PRIM | texel0 0 prim. 0 |0 0 0 texel0 MODULATEIDECALA_PRIM | texel0 0 prim. 0 |0 0 0 texel0 REFLECTRGB | env. 0 texel0 shade |0 0 0 shade REFLECTRGBDECALA | env. 0 texel0 shade |0 0 0 texel0 BLENDI | env. shade texel0 shade |0 0 0 shade BLENDIA | env. shade texel0 shade |texel0 0 shade 0 BLENDIDECALA | env. shade texel0 shade |0 0 0 texel0 BLENDRGBA | texel0 shade texel0A shade |0 0 0 shade BLENDRGBDECALA | texel0 shade texel0A shade |0 0 0 texel0 BLENDPE | prim. env. texel0 env. |texel0 0 shade 0 BLENDPEDECALA | prim. env. texel0 env. |0 0 0 texel0 BLENDPE_ALT | env. prim. texel0 prim. |texel0 0 shade 0 BLENDPEDECALA_ALT | env. prim. texel0 prim. |0 0 0 texel0 HILITERGB | prim. shade texel0 shade |0 0 0 shade HILITERGBA | prim. shade texel0 shade |prim. shade texel0 shade HILITERGBDECALA | prim. shade texel0 shade |0 0 0 texel0 TWOcolourTEX | prim. shade texel0 shade |0 0 0 shade | | /* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */ | | SPARSEST | PRIM, TEXEL0 L_F TEXEL0 |PRIM TEXEL0 L_F TEXEL0 TEMPLERP | TEXEL1 TEXEL0 P_L_F TEXEL0 |TEXEL1 TEXEL0 P_L_F TEXEL0 | | /* typical CC cycle 1 modes, usually followed by other cycle 2 modes */ | | TRILERP | TEXEL1 TEXEL0 L_F TEXEL0 |TEXEL1 TEXEL0 L_F TEXEL0 INTERFERENCE | TEXEL0 0 TEXEL1 0 |TEXEL0 0 TEXEL1 0 When in 2Cycle Mode, CC1 should be set to TRILERP for Tri-Liner Filtering /* * One-cycle color convert operation */ #define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE /* * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock. * Therefore, CC looks for step1 results in TEXEL1 */ #define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0 /* typical CC cycle 2 modes */ #define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED #define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE #define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0 #define G_CC_MODULATERGB2 G_CC_MODULATEI2 #define G_CC_MODULATERGBA2 G_CC_MODULATEIA2 #define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE #define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0 #define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2 #define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2 #define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE /* * ? #define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE */ #define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE #define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0 #define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0 #define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE #define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED #define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0 #define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED Compile Tests ============================================================ To help work out the bit orders and legnths I compiled a series of demos with a custom Combiner. I list each C code then I list the hex output from ROM. Below That I print the bit map. Corrections Listed below have now been input above but kept for refrence. Also you may notice that I assigned 5 bits to b0 and 3 to b1. This was wrong and has also been corrected above. Oh My... I just found that the docs actually specify Bit Legnths and Shift Values Already... They were under my nose but I couldnt see them... ah well, the compiling was still usefull since there are order issues with regards to b1, A1 and C1. Control1 All 0 #define G_CC_MYNEWMODE 0,0,0,0, 0,0,0,0 FC FF FF FF FF FF FF FF Control2 All Combine #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,COMBINED, COMBINED,COMBINED,COMBINED,COMBINED FC 00 00 00 00 00 00 00 #define G_CC_MYNEWMODE 0,COMBINED,COMBINED,COMBINED, COMBINED,COMBINED,COMBINED,COMBINED FC F0 00 00 00 00 00 00 1CYC FC F0 01 E0 00 00 00 00 1111 1100 1111 00000 000 000 1111 00000 00000 000 000 000 000 000 000 000 000 000 a0 a1 Seems good #define G_CC_MYNEWMODE COMBINED,0,COMBINED,COMBINED, COMBINED,COMBINED,COMBINED,COMBINED FC 00 00 00 F0 00 00 00 1CYC FC 00 00 00 FF 00 00 00 1111 1100 0000 00000 000 000 0000 00000 11111 111 000 000 000 000 000 000 000 000 b0 seems good, b1 is d0 #define G_CC_MYNEWMODE COMBINED,COMBINED,0,COMBINED, COMBINED,COMBINED,COMBINED,COMBINED FC 0F 80 00 00 00 00 00 1CYC FC 0F 80 1F 00 00 00 00 1111 1100 0000 11111 000 000 0000 11111 00000 000 000 000 000 000 000 000 000 000 c0 c1 seems good #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,0, COMBINED,COMBINED,COMBINED,COMBINED FC 00 00 00 00 03 80 00 1CYC FC 00 00 00 00 03 81 C0 1111 1100 0000 00000 000 000 0000 00000 00000 000 000 000 111 000 000 111 000 000 d1 ok, d0 is b1 #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,COMBINED, 0,COMBINED,COMBINED,COMBINED FC 00 70 00 00 00 00 00 1CYC FC 00 70 00 00 E0 00 00 1111 1100 0000 00000 111 000 0000 00000 00000 000 111 000 000 000 000 000 000 000 A0 ok, A1 is B0 #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,COMBINED, COMBINED,0,COMBINED,COMBINED FC 00 00 00 00 00 70 00 1CYC FC 00 00 00 00 00 70 38 1111 1100 0000 00000 000 000 0000 00000 00000 000 000 000 000 111 000 000 111 000 B0 is A1, B1 is OK #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,COMBINED, COMBINED,COMBINED,0,COMBINED FC 00 0E 00 00 00 00 00 1CYC FC 00 0E 00 00 1C 00 00 1111 1100 0000 00000 000 111 0000 00000 00000 000 000 111 000 000 000 000 000 000 C0 is OK, C1 is D0 #define G_CC_MYNEWMODE COMBINED,COMBINED,COMBINED,COMBINED, COMBINED,COMBINED,COMBINED,0 FC 00 00 00 00 00 0E 00 1CYC FC 00 00 00 00 00 0E 07 1111 1100 0000 00000 000 000 0000 00000 00000 000 000 000 000 000 111 000 000 111 D0 is C1, D1 is OK