public GLSLCombineManager(F3DEX2Interpreter f3dex2) { supported = ((GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress("glCreateShader") != IntPtr.Zero); F3DEX2 = f3dex2; shaderCache = new List <GLSLShaders>(); /*foreach (uint[] knownMux in KnownCombinerMuxes.Muxes) * { * BindCombiner(knownMux[0], knownMux[1], true); * BindCombiner(knownMux[0], knownMux[1], false); * }*/ }
public GLSLCombineManager(F3DEX2Interpreter f3dex2) { supported = ((GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress("glCreateShader") != IntPtr.Zero); F3DEX2 = f3dex2; shaderCache = new List<GLSLShaders>(); /*foreach (uint[] knownMux in KnownCombinerMuxes.Muxes) { BindCombiner(knownMux[0], knownMux[1], true); BindCombiner(knownMux[0], knownMux[1], false); }*/ }
public GLSLCombineManager(F3DEX2Interpreter f3dex2) { supported = (GraphicsContext.CurrentContext as IGraphicsContextInternal).GetAddress("glCreateShader") != IntPtr.Zero; F3DEX2 = f3dex2; if (supported) { var vs = ReadEmbeddedTextResource("VertexShader.glsl"); var fs = ReadEmbeddedTextResource("FragmentShader.glsl"); CreateShaders(vs, fs, ref vertexObject, ref fragmentObject, ref program); locInputTexel0 = GL.GetUniformLocation(program, "combinerInputTexel[0]"); locInputTexel1 = GL.GetUniformLocation(program, "combinerInputTexel[1]"); locInputPrim = GL.GetUniformLocation(program, "combinerInputPrimitive"); locInputPrimLODFrac = GL.GetUniformLocation(program, "combinerInputPrimitiveLODFrac"); locInputEnv = GL.GetUniformLocation(program, "combinerInputEnvironment"); locCombinerIsTwoCycleMode = GL.GetUniformLocation(program, "combinerIsTwoCycleMode"); locCombinerColorParams = new int[8]; for (var i = 0; i < locCombinerColorParams.Length; i++) { locCombinerColorParams[i] = GL.GetUniformLocation(program, $"combinerColorParam[{i}]"); } locCombinerAlphaParams = new int[8]; for (var i = 0; i < locCombinerAlphaParams.Length; i++) { locCombinerAlphaParams[i] = GL.GetUniformLocation(program, $"combinerAlphaParam[{i}]"); } GL.UseProgram(program); GL.Uniform1(locInputTexel0, 0); GL.Uniform1(locInputTexel1, 1); GL.Uniform4(locInputPrim, new Vector4(1.0f)); GL.Uniform1(locInputPrimLODFrac, 0.5f); GL.Uniform4(locInputEnv, new Vector4(0.5f)); GL.Uniform1(locCombinerIsTwoCycleMode, 1); } }
public ROMHandler(string fn) { #if !DEBUG try #endif { reload: DMATableAddress = FileNameTableAddress = SceneTableAddress = -1; Filename = fn; /* Initialize segment and rendering systems */ SegmentMapping = new Hashtable(); Renderer = new F3DEX2Interpreter(this); /* Read ROM */ BinaryReader br = new BinaryReader(File.Open(fn, FileMode.Open, FileAccess.Read, FileShare.Read)); if (br.BaseStream.Length < MinROMSize) { throw new ROMHandlerException(string.Format("File size is less than {0}MB; ROM appears to be invalid.", MinROMSize / 0x100000)); } Data = new byte[br.BaseStream.Length]; br.Read(Data, 0, (int)br.BaseStream.Length); br.Close(); /* Detect byte order */ DetectByteOrder(); if (DetectedByteOrder != ByteOrder.BigEndian) { if (MessageBox.Show("The ROM file you have selected uses an incompatible byte order, and needs to be converted to Big Endian format to be used." + Environment.NewLine + Environment.NewLine + "Convert the ROM now? (You will be asked for the target filename; the converted ROM will also be reloaded.)", "Byte Order Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { /* Ask for new filename */ string fnnew = GUIHelpers.ShowSaveFileDialog("Nintendo 64 ROMs (*.z64;*.bin)|*.z64;*.bin|All Files (*.*)|*.*"); if (fnnew != string.Empty) { fn = fnnew; /* Perform byte order conversion */ byte[] datanew = new byte[Data.Length]; byte[] conv = null; for (int i = 0, j = 0; i < Data.Length; i += 4, j += 4) { if (DetectedByteOrder == ByteOrder.MiddleEndian) { conv = new byte[4] { Data[i + 1], Data[i], Data[i + 3], Data[i + 2] } } ; else if (DetectedByteOrder == ByteOrder.LittleEndian) { conv = new byte[4] { Data[i + 3], Data[i + 2], Data[i + 1], Data[i] } } ; Buffer.BlockCopy(conv, 0, datanew, j, conv.Length); } /* Save converted ROM, then reload it */ BinaryWriter bw = new BinaryWriter(File.Create(fn)); bw.Write(datanew); bw.Close(); goto reload; } } else { /* Wrong byte order, no conversion performed */ throw new ByteOrderException(string.Format("Incompatible byte order {0} detected; ROM cannot be used.", DetectedByteOrder)); } } else { /* Read header */ ReadROMHeader(); /* Create XML actor definition reader */ XMLActorDefReader = new XMLActorDefinitionReader(Path.Combine("XML", "ActorDefinitions", GameID.Substring(1, 2))); if (XMLActorDefReader.Definitions.Count > 0) { /* Create remaining XML-related objects */ XMLActorNames = new XMLHashTableReader(Path.Combine("XML", "GameDataGeneric", GameID.Substring(1, 2)), "ActorNames.xml"); XMLObjectNames = new XMLHashTableReader(Path.Combine("XML", "GameDataGeneric", GameID.Substring(1, 2)), "ObjectNames.xml"); XMLSongNames = new XMLHashTableReader(Path.Combine("XML", "GameDataGeneric", GameID.Substring(1, 2)), "SongNames.xml"); XMLSceneNames = new XMLHashTableReader(Path.Combine("XML", "GameDataSpecific", string.Format("{0}{1:X1}", GameID, Version)), "SceneNames.xml"); XMLRoomNames = new XMLHashTableReader(Path.Combine("XML", "GameDataSpecific", string.Format("{0}{1:X1}", GameID, Version)), "RoomNames.xml"); XMLStageDescriptions = new XMLHashTableReader(Path.Combine("XML", "GameDataSpecific", string.Format("{0}{1:X1}", GameID, Version)), "StageDescriptions.xml"); /* Determine if ROM uses z64tables hack */ HasZ64TablesHack = (Version == 15 && Endian.SwapUInt32(BitConverter.ToUInt32(Data, 0x1238)) != 0x0C00084C); /* Find and read build information, DMA table, etc. */ FindBuildInfo(); FindDMATable(); FindFileNameTable(); ReadDMATable(); ReadFileNameTable(); /* Try to identify files */ foreach (DMATableEntry dte in Files) { dte.Identify(this); } /* Find the code file */ FindCodeFile(); /* Find other Zelda-specific stuff */ FindActorTable(); FindObjectTable(); FindSceneTable(); ReadEntranceTable(); /* Some sanity checking & exception handling*/ if (Scenes == null || Scenes.Count == 0) { throw new ROMHandlerException("No valid scenes could be recognized in the ROM."); } /* Done */ Loaded = true; } } } #if !DEBUG catch (Exception ex) { Loaded = false; if (MessageBox.Show(ex.Message + "\n\n" + "Show detailed information?", "Exception", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes) { MessageBox.Show(ex.ToString(), "Exception Details", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } #endif }
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; }