示例#1
0
        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);
             * }*/
        }
示例#2
0
        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);
            }*/
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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
        }
示例#5
0
        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;
        }
示例#6
0
        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;
        }