public ArbCombineProgram(uint m0, uint m1, bool tex) { Mux0 = m0; Mux1 = m1; Unpacked = new UnpackedCombinerMux(m0, m1); Textured = tex; int gl = 0; string pstring = "!!ARBfp1.0\n" + "\n" + "TEMP Tex0; TEMP Tex1;\n" + "TEMP R0; TEMP R1;\n" + "TEMP aR0; TEMP aR1;\n" + "TEMP Comb; TEMP aComb;\n" + "\n" + "PARAM PrimColor = program.env[0];\n" + "PARAM EnvColor = program.env[1];\n" + "PARAM PrimColorLOD = program.env[2];\n" + "ATTRIB Shade = fragment.color;\n" + "\n" + "OUTPUT Out = result.color;\n" + "\n" + "TEX Tex0, fragment.texcoord[0], texture[0], 2D;\n" + "TEX Tex1, fragment.texcoord[1], texture[1], 2D;\n" + "\n"; for (int i = 0; i < 2; i++) { switch (Unpacked.cA[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: pstring += "MOV R0.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: if (Textured) pstring += "MOV R0.rgb, Tex0;\n"; else pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: if (Textured) pstring += "MOV R0.rgb, Tex1;\n"; else pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: pstring += "MOV R0.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: pstring += "MOV R0.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: pstring += "MOV R0.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: pstring += "MOV R0.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: if (Textured) pstring += "MOV R0.rgb, Tex0.a;\n"; else pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: if (Textured) pstring += "MOV R0.rgb, Tex1.a;\n"; else pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R0.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: pstring += "MOV R0.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: pstring += "MOV R0.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R0.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } switch (Unpacked.cB[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: if (Textured) pstring += "MOV R1.rgb, Tex0;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: if (Textured) pstring += "MOV R1.rgb, Tex1;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: pstring += "MOV R1.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: if (Textured) pstring += "MOV R1.rgb, Tex0.a;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: if (Textured) pstring += "MOV R1.rgb, Tex1.a;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R1.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: pstring += "MOV R1.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: pstring += "MOV R1.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R1.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "SUB R0, R0, R1;\n\n"; switch (Unpacked.cC[i]) { case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0: if (Textured) pstring += "MOV R1.rgb, Tex0;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1: if (Textured) pstring += "MOV R1.rgb, Tex1;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED_ALPHA: pstring += "MOV R1.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0_ALPHA: if (Textured) pstring += "MOV R1.rgb, Tex0.a;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1_ALPHA: if (Textured) pstring += "MOV R1.rgb, Tex1.a;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R1.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE_ALPHA: pstring += "MOV R1.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENV_ALPHA: pstring += "MOV R1.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_LOD_FRACTION: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R1.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_K5: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC32.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "MUL R0, R0, R1;\n\n"; switch (Unpacked.cD[i]) { case UnpackedCombinerMux.ComponentsC8.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL0: if (Textured) pstring += "MOV R1.rgb, Tex0;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL1: if (Textured) pstring += "MOV R1.rgb, Tex1;\n"; else pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "ADD R0, R0, R1;\n\n"; switch (Unpacked.aA[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR0.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) pstring += "MOV aR0.a, Tex0.a;\n"; else pstring += "MOV aR0.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) pstring += "MOV aR0.a, Tex1.a;\n"; else pstring += "MOV aR0.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR0.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR0.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR0.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR0.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR0.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR0.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } switch (Unpacked.aB[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) pstring += "MOV aR1.a, Tex0.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) pstring += "MOV aR1.a, Tex1.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "SUB aR0.a, aR0.a, aR1.a;\n\n"; switch (Unpacked.aC[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) pstring += "MOV aR1.a, Tex0.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) pstring += "MOV aR1.a, Tex1.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; //TODO check this! //case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIM_LOD_FRAC: //pstring += "MOV aR1.a, PrimColorLOD.a;\n"; //break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "MUL aR0.a, aR0.a, aR1.a;\n\n"; switch (Unpacked.aD[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) pstring += "MOV aR1.a, Tex0.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) pstring += "MOV aR1.a, Tex1.a;\n"; else pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "ADD aR0.a, aR0.a, aR1.a;\n\n"; pstring += "MOV Comb.rgb, R0;\n"; pstring += "MOV aComb.a, aR0;\n\n"; } pstring += "MOV Comb.a, aComb.a;\n" + "MOV Out, Comb;\n" + "END\n"; byte[] bytes = Encoding.ASCII.GetBytes(pstring); GL.Arb.GenProgram(1, out gl); GL.Arb.BindProgram(AssemblyProgramTargetArb.FragmentProgram, gl); GL.Arb.ProgramString(AssemblyProgramTargetArb.FragmentProgram, All.ProgramFormatAsciiArb, bytes.Length, bytes); GLID = gl; }
public ArbCombineProgram(uint m0, uint m1, bool tex) { Mux0 = m0; Mux1 = m1; Unpacked = new UnpackedCombinerMux(m0, m1); Textured = tex; string pstring = "!!ARBfp1.0\n" + "\n" + "TEMP Tex0; TEMP Tex1;\n" + "TEMP R0; TEMP R1;\n" + "TEMP aR0; TEMP aR1;\n" + "TEMP Comb; TEMP aComb;\n" + "\n" + "PARAM PrimColor = program.env[0];\n" + "PARAM EnvColor = program.env[1];\n" + "PARAM PrimColorLOD = program.env[2];\n" + "ATTRIB Shade = fragment.color;\n" + "\n" + "OUTPUT Out = result.color;\n" + "\n" + "TEX Tex0, fragment.texcoord[0], texture[0], 2D;\n" + "TEX Tex1, fragment.texcoord[1], texture[1], 2D;\n" + "\n"; for (int i = 0; i < 2; i++) { switch (Unpacked.cA[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: pstring += "MOV R0.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: if (Textured) { pstring += "MOV R0.rgb, Tex0;\n"; } else { pstring += "MOV R0.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: if (Textured) { pstring += "MOV R0.rgb, Tex1;\n"; } else { pstring += "MOV R0.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: pstring += "MOV R0.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: pstring += "MOV R0.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: pstring += "MOV R0.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: pstring += "MOV R0.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: pstring += "MOV R0.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: if (Textured) { pstring += "MOV R0.rgb, Tex0.a;\n"; } else { pstring += "MOV R0.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: if (Textured) { pstring += "MOV R0.rgb, Tex1.a;\n"; } else { pstring += "MOV R0.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R0.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: pstring += "MOV R0.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: pstring += "MOV R0.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R0.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R0.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } switch (Unpacked.cB[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: if (Textured) { pstring += "MOV R1.rgb, Tex0;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: if (Textured) { pstring += "MOV R1.rgb, Tex1;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: pstring += "MOV R1.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: if (Textured) { pstring += "MOV R1.rgb, Tex0.a;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: if (Textured) { pstring += "MOV R1.rgb, Tex1.a;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R1.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: pstring += "MOV R1.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: pstring += "MOV R1.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R1.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "SUB R0, R0, R1;\n\n"; switch (Unpacked.cC[i]) { case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0: if (Textured) { pstring += "MOV R1.rgb, Tex0;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1: if (Textured) { pstring += "MOV R1.rgb, Tex1;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED_ALPHA: pstring += "MOV R1.rgb, Comb.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0_ALPHA: if (Textured) { pstring += "MOV R1.rgb, Tex0.a;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1_ALPHA: if (Textured) { pstring += "MOV R1.rgb, Tex1.a;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE_ALPHA: pstring += "MOV R1.rgb, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE_ALPHA: pstring += "MOV R1.rgb, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENV_ALPHA: pstring += "MOV R1.rgb, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_LOD_FRACTION: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIM_LOD_FRAC: pstring += "MOV R1.rgb, PrimColorLOD;\n"; break; case UnpackedCombinerMux.ComponentsC32.CCMUX_K5: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; // unemulated break; case UnpackedCombinerMux.ComponentsC32.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "MUL R0, R0, R1;\n\n"; switch (Unpacked.cD[i]) { case UnpackedCombinerMux.ComponentsC8.CCMUX_COMBINED: pstring += "MOV R1.rgb, Comb;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL0: if (Textured) { pstring += "MOV R1.rgb, Tex0;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL1: if (Textured) { pstring += "MOV R1.rgb, Tex1;\n"; } else { pstring += "MOV R1.rgb, Shade;\n"; } break; case UnpackedCombinerMux.ComponentsC8.CCMUX_PRIMITIVE: pstring += "MOV R1.rgb, PrimColor;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_SHADE: pstring += "MOV R1.rgb, Shade;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_ENVIRONMENT: pstring += "MOV R1.rgb, EnvColor;\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_1: pstring += "MOV R1.rgb, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsC8.CCMUX_0: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV R1.rgb, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "ADD R0, R0, R1;\n\n"; switch (Unpacked.aA[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR0.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) { pstring += "MOV aR0.a, Tex0.a;\n"; } else { pstring += "MOV aR0.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) { pstring += "MOV aR0.a, Tex1.a;\n"; } else { pstring += "MOV aR0.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR0.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR0.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR0.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR0.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR0.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR0.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } switch (Unpacked.aB[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) { pstring += "MOV aR1.a, Tex0.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) { pstring += "MOV aR1.a, Tex1.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "SUB aR0.a, aR0.a, aR1.a;\n\n"; switch (Unpacked.aC[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) { pstring += "MOV aR1.a, Tex0.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) { pstring += "MOV aR1.a, Tex1.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; //TODO check this! //case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIM_LOD_FRAC: //pstring += "MOV aR1.a, PrimColorLOD.a;\n"; //break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "MUL aR0.a, aR0.a, aR1.a;\n\n"; switch (Unpacked.aD[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: pstring += "MOV aR1.a, aComb.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: if (Textured) { pstring += "MOV aR1.a, Tex0.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: if (Textured) { pstring += "MOV aR1.a, Tex1.a;\n"; } else { pstring += "MOV aR1.a, Shade.a;\n"; } break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: pstring += "MOV aR1.a, PrimColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: pstring += "MOV aR1.a, Shade.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: pstring += "MOV aR1.a, EnvColor.a;\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: pstring += "MOV aR1.a, {1.0, 1.0, 1.0, 1.0};\n"; break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; default: pstring += "MOV aR1.a, {0.0, 0.0, 0.0, 0.0};\n"; break; } pstring += "ADD aR0.a, aR0.a, aR1.a;\n\n"; pstring += "MOV Comb.rgb, R0;\n"; pstring += "MOV aComb.a, aR0;\n\n"; } pstring += "MOV Comb.a, aComb.a;\n" + "MOV Out, Comb;\n" + "END\n"; byte[] bytes = Encoding.ASCII.GetBytes(pstring); GL.Arb.GenProgram(1, out int gl); GL.Arb.BindProgram(AssemblyProgramTargetArb.FragmentProgram, gl); GL.Arb.ProgramString(AssemblyProgramTargetArb.FragmentProgram, All.ProgramFormatAsciiArb, bytes.Length, bytes); GLID = gl; }
public GLSLShaders(uint m0, uint m1, F3DEX2Interpreter f3dex2, bool tex) { F3DEX2 = f3dex2; Mux0 = m0; Mux1 = m1; HasLightingEnabled = Convert.ToBoolean(f3dex2.GeometryMode & (uint)General.GeometryMode.LIGHTING); Unpacked = new UnpackedCombinerMux(m0, m1); Textured = tex; StringBuilder vs = new StringBuilder(), fs = new StringBuilder(); vs.AppendFormat(shaderPrefix, Program.AppNameVer, "Vertex", m0, m1, HasLightingEnabled); vs.AppendLine(shaderVersion); vs.AppendLine(vertexShaderVariables); vs.AppendLine(shaderMainPrefix); vs.AppendLine(vertexShaderCommon); fs.AppendFormat(shaderPrefix, Program.AppNameVer, "Fragment", m0, m1, HasLightingEnabled); fs.AppendLine(shaderVersion); fs.AppendLine(fragmentShaderVariables); fs.AppendLine(shaderMainPrefix); // TODO can this be made nicer? texturing and lighting? if (Textured) fs.AppendLine(fragmentShaderCommon); fs.AppendLine(fragmentShaderLighting); if (!HasLightingEnabled) { fs.AppendLine("vec4 lightColor = gl_Color;"); vs.AppendLine("gl_FrontColor = gl_Color;"); } else fs.AppendLine("vec4 lightColor = gl_Color + Iamb + Idiff + Ispec;"); if (!Textured) fs.AppendLine("vec4 tex0color = lightColor;\nvec4 tex1color = lightColor;"); fs.AppendLine(); for (int i = 0; i < 2; i++) { StringBuilder calc = new StringBuilder(); calc.AppendFormat("{0} = vec4((", (i == 0 ? "combColor" : "outColor")); switch (Unpacked.cA[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" - "); switch (Unpacked.cB[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(") * "); switch (Unpacked.cC[i]) { case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_LOD_FRACTION: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_K5: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" + "); switch (Unpacked.cD[i]) { case UnpackedCombinerMux.ComponentsC8.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.AppendLine(");"); calc.AppendFormat("{0} = vec4((", (i == 0 ? "combAlpha" : "outAlpha")); switch (Unpacked.aA[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" - "); switch (Unpacked.aB[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(") * "); switch (Unpacked.aC[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" + "); switch (Unpacked.aD[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.AppendLine(");"); calc.AppendLine("gl_FragColor.rgb = outColor.rgb;"); calc.AppendLine("gl_FragColor.a = outAlpha.a;"); fs.AppendLine(calc.ToString()); //fs.AppendLine("gl_FragColor = lightColor;"); } vs.AppendLine(shaderMainSuffix); fs.AppendLine(shaderMainSuffix); /*System.IO.StreamWriter sw = new System.IO.StreamWriter(string.Format(@"C:\Temp\{0:X8}_{1:X8}_{2}.txt", m0, m1, HasLightingEnabled ? "light" : "nolight")); sw.Write(vs.ToString()); sw.Write(fs.ToString()); sw.Close(); */ int vo = -1, fo = -1, p = -1; CreateShaders(vs.ToString(), fs.ToString(), ref vo, ref fo, ref p); VertexObject = vo; FragmentObject = fo; ProgramID = p; }
public GLSLShaders(uint m0, uint m1, F3DEX2Interpreter f3dex2, bool tex) { F3DEX2 = f3dex2; Mux0 = m0; Mux1 = m1; HasLightingEnabled = Convert.ToBoolean(f3dex2.GeometryMode & (uint)General.GeometryMode.LIGHTING); Unpacked = new UnpackedCombinerMux(m0, m1); Textured = tex; StringBuilder vs = new StringBuilder(), fs = new StringBuilder(); vs.AppendFormat(shaderPrefix, Program.AppNameVer, "Vertex", m0, m1, HasLightingEnabled); vs.AppendLine(shaderVersion); vs.AppendLine(vertexShaderVariables); vs.AppendLine(shaderMainPrefix); vs.AppendLine(vertexShaderCommon); fs.AppendFormat(shaderPrefix, Program.AppNameVer, "Fragment", m0, m1, HasLightingEnabled); fs.AppendLine(shaderVersion); fs.AppendLine(fragmentShaderVariables); fs.AppendLine(shaderMainPrefix); // TODO can this be made nicer? texturing and lighting? if (Textured) { fs.AppendLine(fragmentShaderCommon); } fs.AppendLine(fragmentShaderLighting); if (!HasLightingEnabled) { fs.AppendLine("vec4 lightColor = gl_Color;"); vs.AppendLine("gl_FrontColor = gl_Color;"); } else { fs.AppendLine("vec4 lightColor = gl_Color + Iamb + Idiff + Ispec;"); } if (!Textured) { fs.AppendLine("vec4 tex0color = lightColor;\nvec4 tex1color = lightColor;"); } fs.AppendLine(); for (int i = 0; i < 2; i++) { StringBuilder calc = new StringBuilder(); calc.AppendFormat("{0} = vec4((", (i == 0 ? "combColor" : "outColor")); switch (Unpacked.cA[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" - "); switch (Unpacked.cB[i]) { case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_LOD_FRACTION: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; case UnpackedCombinerMux.ComponentsC16.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC16.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(") * "); switch (Unpacked.cC[i]) { case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_COMBINED_ALPHA: calc.Append("comb.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL0_ALPHA: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_TEXEL1_ALPHA: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIMITIVE_ALPHA: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_SHADE_ALPHA: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_ENV_ALPHA: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsC32.CCMUX_LOD_FRACTION: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_PRIM_LOD_FRAC: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_K5: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); //unemulated for now break; case UnpackedCombinerMux.ComponentsC32.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" + "); switch (Unpacked.cD[i]) { case UnpackedCombinerMux.ComponentsC8.CCMUX_COMBINED: calc.Append("combColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL0: calc.Append("tex0color"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_TEXEL1: calc.Append("tex1color"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_PRIMITIVE: calc.Append("primColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_SHADE: calc.Append("lightColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_ENVIRONMENT: calc.Append("envColor"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsC8.CCMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.AppendLine(");"); calc.AppendFormat("{0} = vec4((", (i == 0 ? "combAlpha" : "outAlpha")); switch (Unpacked.aA[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" - "); switch (Unpacked.aB[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(") * "); switch (Unpacked.aC[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.Append(" + "); switch (Unpacked.aD[i]) { case UnpackedCombinerMux.ComponentsA8.ACMUX_COMBINED: calc.Append("combAlpha.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL0: calc.Append("tex0color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_TEXEL1: calc.Append("tex1color.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_PRIMITIVE: calc.Append("primColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_SHADE: calc.Append("lightColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_ENVIRONMENT: calc.Append("envColor.a"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_1: calc.Append("vec4(1.0, 1.0, 1.0, 1.0)"); break; case UnpackedCombinerMux.ComponentsA8.ACMUX_0: calc.Append("vec4(0.0, 0.0, 0.0, 0.0)"); break; } calc.AppendLine(");"); calc.AppendLine("gl_FragColor.rgb = outColor.rgb;"); calc.AppendLine("gl_FragColor.a = outAlpha.a;"); fs.AppendLine(calc.ToString()); //fs.AppendLine("gl_FragColor = lightColor;"); } vs.AppendLine(shaderMainSuffix); fs.AppendLine(shaderMainSuffix); /*System.IO.StreamWriter sw = new System.IO.StreamWriter(string.Format(@"C:\Temp\{0:X8}_{1:X8}_{2}.txt", m0, m1, HasLightingEnabled ? "light" : "nolight")); * sw.Write(vs.ToString()); * sw.Write(fs.ToString()); * sw.Close(); */ int vo = -1, fo = -1, p = -1; CreateShaders(vs.ToString(), fs.ToString(), ref vo, ref fo, ref p); VertexObject = vo; FragmentObject = fo; ProgramID = p; }