示例#1
0
        public static void ParseRDPSetOtherMode(F3DEX2Command cmd,
                                                out PipelineMode pm, out CycleType cyc, out TexturePersp tp, out TextureDetail td, out TextureLOD tl,
                                                out TextureLUT tt, out TextureFilter tf, out TextureConvert tc, out CombineKey ck, out ColorDither cd,
                                                out AlphaDither ad, out AlphaCompare ac, out DepthSource zs, out RenderMode rm)
        {
            rm = new RenderMode(cmd.Words & (0xFFFFFFFF & ~((ulong)AlphaCompare.Mask | (ulong)DepthSource.Mask)));

            if (!rm.Known) // Handle TCL modes by checking again with alpha compare and dither included
            {
                rm = new RenderMode(cmd.Words & (0xFFFFFFFF & ~(ulong)DepthSource.Mask));
            }

            ulong wordH = cmd.Words >> 32;

            ad  = (AlphaDither)(wordH & (ulong)AlphaDither.Mask);
            cd  = (ColorDither)(wordH & (ulong)ColorDither.Mask);
            ck  = (CombineKey)(wordH & (ulong)CombineKey.Mask);
            pm  = (PipelineMode)(wordH & (ulong)PipelineMode.Mask);
            cyc = (CycleType)(wordH & (ulong)CycleType.Mask);
            tp  = (TexturePersp)(wordH & (ulong)TexturePersp.Mask);
            td  = (TextureDetail)(wordH & (ulong)TextureDetail.Mask);
            tl  = (TextureLOD)(wordH & (ulong)TextureLOD.Mask);
            tt  = (TextureLUT)(wordH & (ulong)TextureLUT.Mask);
            tf  = (TextureFilter)(wordH & (ulong)TextureFilter.Mask);
            tc  = (TextureConvert)(wordH & (ulong)TextureConvert.Mask);

            ac = (AlphaCompare)(cmd.Words & (ulong)AlphaCompare.Mask);
            zs = (DepthSource)(cmd.Words & (ulong)DepthSource.Mask);
        }
示例#2
0
 public MaterialEntry(EndianBinaryReader er)
 {
     Name           = er.ReadString(Encoding.ASCII, 20).Replace("\0", "");
     BufferColor    = er.ReadColor8();
     ConstColors    = new Color[6];
     ConstColors[0] = er.ReadColor8();
     ConstColors[1] = er.ReadColor8();
     ConstColors[2] = er.ReadColor8();
     ConstColors[3] = er.ReadColor8();
     ConstColors[4] = er.ReadColor8();
     ConstColors[5] = er.ReadColor8();
     Flags          = er.ReadUInt32();
     //Material Flag:
     //  0-1: Nr texMap
     //  2-3: Nr texMatrix
     //  4-5: Nr texCoordGen
     //  6-8: Nr tevStage
     //    9: Has alphaCompare
     //   10: Has blendMode
     //   11: Use Texture Only
     //   12: Separate Blend Mode
     //   14: Has Indirect Parameter
     //15-16: Nr projectionTexGenParameter
     //   17: Has Font Shadow Parameter
     TexMaps = new TexMap[Flags & 3];
     for (int i = 0; i < (Flags & 3); i++)
     {
         TexMaps[i] = new TexMap(er);
     }
     TexMatrices = new TexMatrix[(Flags >> 2) & 3];
     for (int i = 0; i < ((Flags >> 2) & 3); i++)
     {
         TexMatrices[i] = new TexMatrix(er);
     }
     TexCoordGens = new TexCoordGen[(Flags >> 4) & 3];
     for (int i = 0; i < ((Flags >> 4) & 3); i++)
     {
         TexCoordGens[i] = new TexCoordGen(er);
     }
     TevStages = new TevStage[(Flags >> 6) & 7];
     for (int i = 0; i < ((Flags >> 6) & 7); i++)
     {
         TevStages[i] = new TevStage(er);
     }
     if (((Flags >> 9) & 1) == 1)
     {
         AlphaTest = new AlphaCompare(er);
     }
     if (((Flags >> 10) & 1) == 1)
     {
         ColorBlendMode = new BlendMode(er);
     }
     if (((Flags >> 12) & 1) == 1)
     {
         AlphaBlendMode = new BlendMode(er);
     }
     //Some more things
 }
示例#3
0
        private static AlphaCompare ReadAlphaCompare(EndianBinaryReader stream)
        {
            var retVal = new AlphaCompare
            {
                Comp0      = (GXCompareType)stream.ReadByte(),
                Reference0 = stream.ReadByte(),
                Operation  = (GXAlphaOp)stream.ReadByte(),
                Comp1      = (GXCompareType)stream.ReadByte(),
                Reference1 = stream.ReadByte()
            };

            Trace.Assert(stream.ReadByte() == 0xFF); // Padding
            Trace.Assert(stream.ReadByte() == 0xFF); // Padding
            Trace.Assert(stream.ReadByte() == 0xFF); // Padding
            return(retVal);
        }
示例#4
0
 public void AlphaSort()
 {
     IComparer Alpha = new AlphaCompare();
     Array.Sort(Data, Alpha);
 }
示例#5
0
        public Material(ref EndianBinaryReader reader)
        {
            base.setType(Type.Wii);

            mMaterialName = reader.ReadString(0x14).Replace("\0", "");

            mForeColor = reader.ReadRGBAColor16();
            mBackColor = reader.ReadRGBAColor16();
            mColorReg3 = reader.ReadRGBAColor16();
            mTevColor1 = reader.ReadRGBAColor8();
            mTevColor2 = reader.ReadRGBAColor8();
            mTevColor3 = reader.ReadRGBAColor8();
            mTevColor4 = reader.ReadRGBAColor8();
            mFlags     = reader.ReadUInt32();

            mHasMaterialColor  = Convert.ToBoolean(ExtractBits(mFlags, 1, 4));
            mHasChannelControl = Convert.ToBoolean(ExtractBits(mFlags, 1, 6));
            mHasBlendMode      = Convert.ToBoolean(ExtractBits(mFlags, 1, 7));
            mHasAlphaCompare   = Convert.ToBoolean(ExtractBits(mFlags, 1, 8));
            mTevStageCount     = ExtractBits(mFlags, 5, 9);
            mIndTexStageCount  = ExtractBits(mFlags, 3, 14);
            mIndTexSRTCount    = ExtractBits(mFlags, 2, 17);
            mHasTevSwapTable   = Convert.ToBoolean(ExtractBits(mFlags, 1, 19));
            mTexCoordGenCount  = ExtractBits(mFlags, 4, 20);
            mTexSRTCount       = ExtractBits(mFlags, 4, 24);
            mTexMapCount       = ExtractBits(mFlags, 4, 28);

            mTexMaps = new List <TexMap>();

            for (int i = 0; i < mTexMapCount; i++)
            {
                mTexMaps.Add(new TexMap(ref reader));
            }

            mTexSRTs = new List <TexSRT>();

            for (int i = 0; i < mTexSRTCount; i++)
            {
                mTexSRTs.Add(new TexSRT(ref reader));
            }

            mTexCoordGens = new List <TexCoordGen>();

            for (int i = 0; i < mTexCoordGenCount; i++)
            {
                mTexCoordGens.Add(new TexCoordGen(ref reader));
            }

            if (mHasChannelControl)
            {
                mChanCtrl = new ChanCtrl(ref reader);
            }

            if (mHasMaterialColor)
            {
                mMaterialColor = reader.ReadRGBAColor8();
            }

            if (mHasTevSwapTable)
            {
                mTevSwapTable = new TevSwapTable(ref reader);
            }

            mIndTexSRT = new List <IndTexSRT>();

            for (int i = 0; i < mIndTexSRTCount; i++)
            {
                mIndTexSRT.Add(new IndTexSRT(ref reader));
            }

            mIndTexStages = new List <IndTexStage>();

            for (int i = 0; i < mIndTexStageCount; i++)
            {
                mIndTexStages.Add(new IndTexStage(ref reader));
            }

            mTevStages = new List <TevStage>();

            for (int i = 0; i < mTevStageCount; i++)
            {
                mTevStages.Add(new TevStage(ref reader));
            }

            if (mHasAlphaCompare)
            {
                mAlphaCompare = new AlphaCompare(ref reader);
            }

            if (mHasBlendMode)
            {
                mBlendMode = new BlendMode(ref reader);
            }
        }
示例#6
0
 public MaterialEntry(EndianBinaryReader er)
 {
     Name = er.ReadString(Encoding.ASCII, 20).Replace("\0", "");
     BufferColor = er.ReadColor8();
     ConstColors = new Color[6];
     ConstColors[0] = er.ReadColor8();
     ConstColors[1] = er.ReadColor8();
     ConstColors[2] = er.ReadColor8();
     ConstColors[3] = er.ReadColor8();
     ConstColors[4] = er.ReadColor8();
     ConstColors[5] = er.ReadColor8();
     Flags = er.ReadUInt32();
     //Material Flag:
     //  0-1: Nr texMap
     //  2-3: Nr texMatrix
     //  4-5: Nr texCoordGen
     //  6-8: Nr tevStage
     //    9: Has alphaCompare
     //   10: Has blendMode
     //   11: Use Texture Only
     //   12: Separate Blend Mode
     //   14: Has Indirect Parameter
     //15-16: Nr projectionTexGenParameter
     //   17: Has Font Shadow Parameter
     TexMaps = new TexMap[Flags & 3];
     for (int i = 0; i < (Flags & 3); i++)
     {
         TexMaps[i] = new TexMap(er);
     }
     TexMatrices = new TexMatrix[(Flags >> 2) & 3];
     for (int i = 0; i < ((Flags >> 2) & 3); i++)
     {
         TexMatrices[i] = new TexMatrix(er);
     }
     TexCoordGens = new TexCoordGen[(Flags >> 4) & 3];
     for (int i = 0; i < ((Flags >> 4) & 3); i++)
     {
         TexCoordGens[i] = new TexCoordGen(er);
     }
     TevStages = new TevStage[(Flags >> 6) & 7];
     for (int i = 0; i < ((Flags >> 6) & 7); i++)
     {
         TevStages[i] = new TevStage(er);
     }
     if (((Flags >> 9) & 1) == 1) AlphaTest = new AlphaCompare(er);
     if (((Flags >> 10) & 1) == 1) ColorBlendMode = new BlendMode(er);
     if (((Flags >> 12) & 1) == 1) AlphaBlendMode = new BlendMode(er);
     //Some more things
 }
示例#7
0
        private static bool GenerateFragmentShader(Shader shader, Material mat)
        {
            StringBuilder stream = new StringBuilder();

            // Shader Header
            stream.AppendLine("#version 330 core");
            stream.AppendLine();

            // Configure inputs to match our outputs from VS
            if (mat.VtxDesc.AttributeIsEnabled(ShaderAttributeIds.Position))
            {
                stream.AppendLine("in vec3 Position;");
            }

            if (mat.VtxDesc.AttributeIsEnabled(ShaderAttributeIds.Normal))
            {
                stream.AppendLine("in vec3 Normal;");
            }

            for (int i = 0; i < mat.NumChannelControls; i++)
            {
                stream.AppendLine(string.Format("in vec4 Color{0};", i));
            }

            for (int texGen = 0; texGen < mat.NumTexGens; texGen++)
            {
                stream.AppendLine(string.Format("in vec3 Tex{0};", texGen));
            }

            stream.AppendLine();

            // Final Output
            stream.AppendLine("// Final Output");
            stream.AppendLine("out vec4 PixelColor;");

            // Texture Inputs
            for (int i = 0; i < 8; i++)
            {
                if (mat.Textures[i] == null)
                {
                    continue;
                }

                stream.AppendLine(string.Format("uniform sampler2D Texture{0};", i));
            }

            // Main Function
            stream.AppendLine("void main()");
            stream.AppendLine("{");

            // Default initial values of the TEV registers.
            // ToDo: Does this need swizzling? themikelester has it marked as mat.registerColor[i==0?3:i-1]]
            stream.AppendLine("    // Initial TEV Register Values");
            for (int i = 0; i < 4; i++)
            {
                stream.AppendLine(string.Format("    vec4 {0} = vec4({1}, {2}, {3}, {4});", m_tevOutputRegs[i], mat.TevColor[i].R, mat.TevColor[i].G, mat.TevColor[i].B, mat.TevColor[i].A));
            }
            stream.AppendLine();

            // Constant Color Registers
            stream.AppendLine("    // Konst TEV Colors");
            for (int i = 0; i < 4; i++)
            {
                stream.AppendLine(string.Format("    vec4 konst{0} = vec4({1}, {2}, {3}, {4});", i, mat.TevKonstColors[i].R, mat.TevKonstColors[i].G, mat.TevKonstColors[i].B, mat.TevKonstColors[i].A));
            }
            stream.AppendLine();

            // Texture Samples
            bool[] oldCombos = new bool[256];
            for (int i = 0; i < mat.NumTevStages; i++)
            {
                TevOrder       order = mat.TevOrderInfos[i];
                int            tex   = order.TexMap;
                GXTexCoordSlot coord = order.TexCoordId;

                // This TEV probably doesn't use textures.
                if (tex == 0xFF || coord == GXTexCoordSlot.Null)
                {
                    continue;
                }

                if (IsNewTexCombo(tex, (int)coord, oldCombos))
                {
                    string swizzle = ""; // Uhh I don't know if we need to swizzle since everyone's been converted into ARGB
                    stream.AppendLine(string.Format("    vec4 texCol{0} = texture(Texture{0}, Tex{1}.xy){2};", tex, (int)coord, swizzle));
                }
            }
            stream.AppendLine();

            // ToDo: Implement indirect texturing.
            stream.AppendLine("    // TEV Stages");
            stream.AppendLine();
            stream.AppendLine();

            for (int i = 0; i < mat.NumTevStages; i++)
            {
                stream.AppendLine(string.Format("    // TEV Stage {0}", i));
                TevOrder order = mat.TevOrderInfos[i];
                TevStage stage = mat.TevStageInfos[i];

                TevSwapMode      swap     = mat.TevSwapModes[i];
                TevSwapModeTable rasTable = mat.TevSwapModeTables[swap.RasSel];
                TevSwapModeTable texTable = mat.TevSwapModeTables[swap.TexSel];

                // There's swapping involved in the ras table.
                stream.AppendLine(string.Format("    // Rasterization Swap Table: {0}", rasTable));
                if (!(rasTable.R == 0 && rasTable.G == 1 && rasTable.B == 2 && rasTable.A == 3))
                {
                    stream.AppendLine(string.Format("    {0} = {1}{2};", GetVertColorString(order), GetVertColorString(order), GetSwapModeSwizzleString(rasTable)));
                }
                stream.AppendLine();


                // There's swapping involved in the texture table.
                stream.AppendLine(string.Format("    // Texture Swap Table: {0}", texTable));
                if (!(texTable.R == 0 && texTable.G == 1 && texTable.B == 2 && texTable.A == 3))
                {
                    stream.AppendLine(string.Format("    {0} = {1}{2};", GetTexTapString(order), GetTexTapString(order), GetSwapModeSwizzleString(rasTable)));
                }
                stream.AppendLine();

                string[] colorInputs = new string[4];
                colorInputs[0] = GetColorInString(stage.ColorIn[0], mat.KonstColorSels[i], order);
                colorInputs[1] = GetColorInString(stage.ColorIn[1], mat.KonstColorSels[i], order);
                colorInputs[2] = GetColorInString(stage.ColorIn[2], mat.KonstColorSels[i], order);
                colorInputs[3] = GetColorInString(stage.ColorIn[3], mat.KonstColorSels[i], order);

                stream.AppendLine("    // Color and Alpha Operations");
                stream.AppendLine(string.Format("    {0}", GetColorOpString(stage.ColorOp, stage.ColorBias, stage.ColorScale, stage.ColorClamp, stage.ColorRegId, colorInputs)));

                string[] alphaInputs = new string[4];
                alphaInputs[0] = GetAlphaInString(stage.AlphaIn[0], mat.KonstAlphaSels[i], order);
                alphaInputs[1] = GetAlphaInString(stage.AlphaIn[1], mat.KonstAlphaSels[i], order);
                alphaInputs[2] = GetAlphaInString(stage.AlphaIn[2], mat.KonstAlphaSels[i], order);
                alphaInputs[3] = GetAlphaInString(stage.AlphaIn[3], mat.KonstAlphaSels[i], order);

                stream.AppendLine(string.Format("    {0}", GetAlphaOpString(stage.AlphaOp, stage.AlphaBias, stage.AlphaScale, stage.AlphaClamp, stage.AlphaRegId, alphaInputs)));
                stream.AppendLine();
            }
            stream.AppendLine();

            // Alpha Compare
            stream.AppendLine("    // Alpha Compare Test");
            AlphaCompare alphaCompare = mat.AlphaCompare;
            string       alphaOp;

            switch (alphaCompare.Operation)
            {
            case GXAlphaOp.And: alphaOp = "&&"; break;

            case GXAlphaOp.Or: alphaOp = "||"; break;

            case GXAlphaOp.XOR: alphaOp = "^"; break;     // Not really tested, unsupported in some examples but I don't see why.

            case GXAlphaOp.XNOR: alphaOp = "=="; break;   // Not really tested. ^

            default:
                WLog.Warning(LogCategory.TEVShaderGenerator, null, "Unsupported alpha compare operation: {0}", alphaCompare.Operation);
                alphaOp = "||";
                break;
            }

            // clip(result.a < 0.5 && result a > 0.2 ? -1 : 1)
            string ifContents = string.Format("(!({0} {1} {2}))",
                                              GetCompareString(alphaCompare.Comp0, m_tevOutputRegs[0] + ".a", alphaCompare.Reference0),
                                              alphaOp,
                                              GetCompareString(alphaCompare.Comp1, m_tevOutputRegs[0] + ".a", alphaCompare.Reference1));

            // clip equivelent
            stream.AppendLine("    // Alpha Compare (Clip)");
            stream.AppendLine(string.Format("    if{0}\n\t\tdiscard;", ifContents));

            //string output = "PixelColor = texCol0" + (mat.VtxDesc.AttributeIsEnabled(ShaderAttributeIds.Color0) ? " * Color0;" : ";");
            //stream.AppendLine(output);
            stream.AppendLine(string.Format("    PixelColor = {0};", m_tevOutputRegs[0]));

            stream.AppendLine("}");
            stream.AppendLine();

            // Compile the Fragment Shader and return whether it compiled sucesfully or not.
            Directory.CreateDirectory("ShaderDump");
            System.IO.File.WriteAllText("ShaderDump/" + mat.Name + "_frag_output", stream.ToString());
            return(shader.CompileSource(stream.ToString(), OpenTK.Graphics.OpenGL.ShaderType.FragmentShader));
        }
示例#8
0
        public void Write(FileWriter writer, LayoutHeader header)
        {
            writer.WriteString(Name, 20);
            writer.Write(BlackColor);
            writer.Write(WhiteColor);
            writer.Write(TevConstantColors);
            long flagPos = writer.Position;

            writer.Write(flags);

            if (TextureMaps?.Length > 0 && TexCoordGens?.Length == 0)
            {
                TexCoordGens = new BxlytTexCoordGen[TextureMaps.Length];
                for (int i = 0; i < TextureMaps?.Length; i++)
                {
                    TexCoordGens[i] = new TexCoordGen();
                }
            }

            flags = 0;
            for (int i = 0; i < TextureMaps?.Length; i++)
            {
                flags += Bit.BitInsert(1, 1, 2, 30);
                ((TextureRef)TextureMaps[i]).Write(writer);
            }

            for (int i = 0; i < TextureTransforms?.Length; i++)
            {
                flags += Bit.BitInsert(1, 1, 2, 28);
                ((BxlytTextureTransform)TextureTransforms[i]).Write(writer);
            }

            for (int i = 0; i < TexCoordGens?.Length; i++)
            {
                flags += Bit.BitInsert(1, 1, 2, 26);
                ((TexCoordGen)TexCoordGens[i]).Write(writer);
            }

            for (int i = 0; i < TevStages?.Length; i++)
            {
                flags += Bit.BitInsert(1, 1, 2, 24);
                ((TevStage)TevStages[i]).Write(writer);
            }
            if (AlphaCompare != null && EnableAlphaCompare)
            {
                flags += Bit.BitInsert(1, 1, 1, 22);
                AlphaCompare.Write(writer);
            }
            if (BlendMode != null && EnableBlend)
            {
                flags += Bit.BitInsert(1, 1, 2, 20);
                BlendMode.Write(writer);
            }
            if (BlendModeLogic != null && EnableBlendLogic)
            {
                flags += Bit.BitInsert(1, 1, 2, 18);
                BlendModeLogic.Write(writer);
            }
            if (IndParameter != null && EnableIndParams)
            {
                flags += Bit.BitInsert(1, 1, 1, 17);
                IndParameter.Write(writer);
            }

            for (int i = 0; i < ProjTexGenParams.Length; i++)
            {
                flags += Bit.BitInsert(1, 1, 2, 15);
                ProjTexGenParams[i].Write(writer);
            }

            if (FontShadowParameter != null && EnableFontShadowParams)
            {
                flags += Bit.BitInsert(1, 1, 1, 14);
                FontShadowParameter.Write(writer);
            }

            if (AlphaInterpolation)
            {
                flags += Bit.BitInsert(1, 1, 1, 13);
            }

            using (writer.TemporarySeek(flagPos, System.IO.SeekOrigin.Begin)) {
                writer.Write(flags);
            }
        }
示例#9
0
文件: LSLList.cs 项目: vinzenz/phlox
        public void AlphaSort()
        {
            IComparer Alpha = new AlphaCompare();

            Array.Sort(Data, Alpha);
        }
示例#10
0
 public BMDShader(
     BMD.MAT3Section.TevStageProps[] Tevs,
     int[] textures,
     System.Drawing.Color[] S10,
     System.Drawing.Color[] Const,
     byte color_matsrc,
     byte alpha_matsrc,
     System.Drawing.Color MatColor,
     AlphaCompare alpha)
 {
     this.color_matsrc = color_matsrc;
     this.alpha_matsrc = alpha_matsrc;
     this.AlphaCompare = alpha;
     this.MatColor     = new float[4]
     {
         (float)MatColor.R / (float)byte.MaxValue,
         (float)MatColor.G / (float)byte.MaxValue,
         (float)MatColor.B / (float)byte.MaxValue,
         (float)MatColor.A / (float)byte.MaxValue
     };
     this.TevStages            = Tevs;
     this.Textures             = textures;
     this.g_color_registers    = new float[3][];
     this.g_color_registers[0] = new float[4]
     {
         (float)S10[0].R / (float)byte.MaxValue,
         (float)S10[0].G / (float)byte.MaxValue,
         (float)S10[0].B / (float)byte.MaxValue,
         (float)S10[0].A / (float)byte.MaxValue
     };
     this.g_color_registers[1] = new float[4]
     {
         (float)S10[1].R / (float)byte.MaxValue,
         (float)S10[1].G / (float)byte.MaxValue,
         (float)S10[1].B / (float)byte.MaxValue,
         (float)S10[1].A / (float)byte.MaxValue
     };
     this.g_color_registers[2] = new float[4]
     {
         (float)S10[2].R / (float)byte.MaxValue,
         (float)S10[2].G / (float)byte.MaxValue,
         (float)S10[2].B / (float)byte.MaxValue,
         (float)S10[2].A / (float)byte.MaxValue
     };
     this.g_color_consts    = new float[4][];
     this.g_color_consts[0] = new float[4]
     {
         (float)Const[0].R / (float)byte.MaxValue,
         (float)Const[0].G / (float)byte.MaxValue,
         (float)Const[0].B / (float)byte.MaxValue,
         (float)Const[0].A / (float)byte.MaxValue
     };
     this.g_color_consts[1] = new float[4]
     {
         (float)Const[1].R / (float)byte.MaxValue,
         (float)Const[1].G / (float)byte.MaxValue,
         (float)Const[1].B / (float)byte.MaxValue,
         (float)Const[1].A / (float)byte.MaxValue
     };
     this.g_color_consts[2] = new float[4]
     {
         (float)Const[2].R / (float)byte.MaxValue,
         (float)Const[2].G / (float)byte.MaxValue,
         (float)Const[2].B / (float)byte.MaxValue,
         (float)Const[2].A / (float)byte.MaxValue
     };
     this.g_color_consts[3] = new float[4]
     {
         (float)Const[3].R / (float)byte.MaxValue,
         (float)Const[3].G / (float)byte.MaxValue,
         (float)Const[3].B / (float)byte.MaxValue,
         (float)Const[3].A / (float)byte.MaxValue
     };
 }
示例#11
0
        public Material(ref EndianBinaryReader reader)
        {
            base.setType(Type._3DS);

            mName     = reader.ReadString(0x14).Replace("\0", "");
            mTevColor = reader.ReadRGBAColor8();

            mTevConstantColors = new RGBAColor8[0x6];

            for (int i = 0; i < 6; i++)
            {
                mTevConstantColors[i] = reader.ReadRGBAColor8();
            }

            mFlags = reader.ReadUInt32();

            mTexMapCount          = ExtractBits(mFlags, 2, 0);
            mTexMtxCount          = ExtractBits(mFlags, 2, 2);
            mTexCoordGenCount     = ExtractBits(mFlags, 2, 4);
            mTevStageCount        = ExtractBits(mFlags, 2, 6);
            mHasAlphaCompare      = Convert.ToBoolean(ExtractBits(mFlags, 1, 9));
            mHasBlendMode         = Convert.ToBoolean(ExtractBits(mFlags, 1, 10));
            mUseTextureOnly       = Convert.ToBoolean(ExtractBits(mFlags, 1, 11));
            mSeperateBlendMode    = Convert.ToBoolean(ExtractBits(mFlags, 1, 12));
            mHasIndParam          = Convert.ToBoolean(ExtractBits(mFlags, 1, 14));
            mProjTexGenParamCount = ExtractBits(mFlags, 2, 15);
            mHasFontShadowParam   = Convert.ToBoolean(ExtractBits(mFlags, 1, 17));

            mTexMaps = new List <TexMap>();

            for (int i = 0; i < mTexMapCount; i++)
            {
                mTexMaps.Add(new TexMap(ref reader));
            }

            mTexSRTs = new List <TexSRT>();

            for (int i = 0; i < mTexMtxCount; i++)
            {
                mTexSRTs.Add(new TexSRT(ref reader));
            }

            mTexCoords = new List <TexCoordGen>();

            for (int i = 0; i < mTexCoordGenCount; i++)
            {
                mTexCoords.Add(new TexCoordGen(ref reader));
            }

            mTevStages = new List <TevStage>();

            for (int i = 0; i < mTevStageCount; i++)
            {
                mTevStages.Add(new TevStage(ref reader));
            }

            if (mHasAlphaCompare)
            {
                mAlphaCompare = new AlphaCompare(ref reader);
            }
            if (mHasBlendMode)
            {
                mBlendMode_Blend = new BlendMode(ref reader);
            }
            if (mSeperateBlendMode)
            {
                mBlendMode_Logic = new BlendMode(ref reader);
            }
            if (mHasIndParam)
            {
                mIndParameter = new IndirectParameter(ref reader);
            }

            mProjTexGenParams = new List <ProjectionTexGenParam>();

            for (int i = 0; i < mProjTexGenParamCount; i++)
            {
                mProjTexGenParams.Add(new ProjectionTexGenParam(ref reader));
            }

            if (mHasFontShadowParam)
            {
                mFontShadowParam = new FontShadowParameter(ref reader);
            }
        }
示例#12
0
文件: BFLYT.cs 项目: xnqdev/Lyzon
                public Material(ref BinaryStream s)
                {
                    name = Encoding.ASCII.GetString(s.ReadBytes(28)).Replace("\0", "");

                    flag    = s.ReadUInt32();
                    unknown = s.ReadUInt32();

                    byte[] black = s.ReadBytes(4), white = s.ReadBytes(4);
                    blackColor = Color.FromArgb(black[3], black[0], black[1], black[2]);
                    whiteColor = Color.FromArgb(white[3], white[0], black[1], black[2]);

                    texMapCount                    = (uint)(flag & 0x03);
                    texSRTCount                    = (uint)((flag >> 2) & 0x03);
                    texCoordGenCount               = (uint)((flag >> 4) & 0x03);
                    tevStageCount                  = (uint)((flag >> 6) & 0x07);
                    hasAlphaCompare                = ((flag >> 9) & 0x01) == 1;
                    hasBlendMode                   = ((flag >> 10) & 0x01) == 1;
                    useTextureOnly                 = ((flag >> 11) & 0x01) == 1;
                    seperateBlendMode              = ((flag >> 12) & 0x01) == 1;
                    hasIndirectParameter           = ((flag >> 14) & 0x01) == 1;
                    projectionTexGenParameterCount = (uint)((flag >> 15) & 0x03);
                    hasFontShadowParameter         = ((flag >> 17) & 0x01) == 1;
                    thresholingAlphaInterpolation  = ((flag >> 18) & 0x01) == 1;

                    texMaps = new TexMap[texMapCount];
                    for (int i = 0; i < texMapCount; i++)
                    {
                        texMaps[i] = new TexMap(ref s);
                    }

                    texSRTs = new TexSRT[texSRTCount];
                    for (int i = 0; i < texSRTCount; i++)
                    {
                        texSRTs[i] = new TexSRT(ref s);
                    }

                    texCoords = new TexCoordGen[texCoordGenCount];
                    for (int i = 0; i < texCoordGenCount; i++)
                    {
                        texCoords[i] = new TexCoordGen(ref s);
                    }

                    tevStages = new TevStage[tevStageCount];
                    for (int i = 0; i < tevStageCount; i++)
                    {
                        tevStages[i] = new TevStage(ref s);
                    }

                    if (hasAlphaCompare)
                    {
                        alphaCompare = new AlphaCompare(ref s);
                    }

                    if (hasBlendMode)
                    {
                        blendMode = new BlendMode(ref s);
                    }

                    if (seperateBlendMode)
                    {
                        blendAlpha = new BlendMode(ref s);
                    }

                    if (hasIndirectParameter)
                    {
                        indirectParameter = new IndirectParameter(ref s);
                    }

                    projectionTexGenParameters = new ProjectionTexGenParameters[projectionTexGenParameterCount];
                    for (int i = 0; i < projectionTexGenParameterCount; i++)
                    {
                        projectionTexGenParameters[i] = new ProjectionTexGenParameters(ref s);
                    }

                    if (hasFontShadowParameter)
                    {
                        fontShadowParameter = new FontShadowParameter(ref s);
                    }

                    //System.Windows.Forms.MessageBox.Show($"[{s.BaseStream.Position}] mat end");
                }
示例#13
0
        public Material(ref EndianBinaryReader reader, uint version)
        {
            base.setType(Type.WiiU_Switch);

            mName = reader.ReadString(0x1C).Replace("\0", "");

            // Switch BFLYT
            if (version == 0x8030000)
            {
                mFlags = reader.ReadUInt32();
                mUnk   = reader.ReadUInt32();

                mBlackColor = reader.ReadRGBAColor8();
                mWhiteColor = reader.ReadRGBAColor8();
            }
            // WiiU BFLYT
            else
            {
                mBlackColor = reader.ReadRGBAColor8();
                mWhiteColor = reader.ReadRGBAColor8();
                mFlags      = reader.ReadUInt32();
            }

            mTexMapCount                    = Convert.ToUInt32(mFlags & 0x3);
            mTexMtxCount                    = Convert.ToUInt32((mFlags >> 2) & 0x3);
            mTexCoordGenCount               = Convert.ToUInt32((mFlags >> 4) & 0x3);
            mTevStageCount                  = Convert.ToUInt32((mFlags >> 6) & 0x7);
            mHasAlphaCompare                = Convert.ToBoolean((mFlags >> 9) & 0x1);
            mHasBlendMode                   = Convert.ToBoolean((mFlags >> 10) & 0x1);
            mUseTextureOnly                 = Convert.ToBoolean((mFlags >> 11) & 0x1);
            mSeperateBlendMode              = Convert.ToBoolean((mFlags >> 12) & 0x1);
            mHasIndParam                    = Convert.ToBoolean((mFlags >> 14) & 0x1);
            mProjTexGenParamCount           = Convert.ToUInt32((mFlags >> 15) & 0x3);
            mHasFontShadowParam             = Convert.ToBoolean((mFlags >> 17) & 0x1);
            mThresholdingAlphaInterpolation = Convert.ToBoolean((mFlags >> 18) & 0x1);

            mTexMaps = new List <TexMap>();

            for (int i = 0; i < mTexMapCount; i++)
            {
                mTexMaps.Add(new TexMap(ref reader));
            }

            mTexSRTs = new List <TexSRT>();

            for (int i = 0; i < mTexMtxCount; i++)
            {
                mTexSRTs.Add(new TexSRT(ref reader));
            }

            mTexCoords = new List <TexCoordGen>();

            for (int i = 0; i < mTexCoordGenCount; i++)
            {
                mTexCoords.Add(new TexCoordGen(ref reader));
            }

            mTevStages = new List <TevStage>();

            for (int i = 0; i < mTevStageCount; i++)
            {
                mTevStages.Add(new TevStage(ref reader));
            }

            if (mHasAlphaCompare)
            {
                mAlphaCompare = new AlphaCompare(ref reader);
            }
            if (mHasBlendMode)
            {
                mBlendMode_Blend = new BlendMode(ref reader);
            }
            if (mSeperateBlendMode)
            {
                mBlendMode_Logic = new BlendMode(ref reader);
            }
            if (mHasIndParam)
            {
                mIndParameter = new IndirectParameter(ref reader);
            }

            mProjTexGenParams = new List <ProjectionTexGenParam>();

            for (int i = 0; i < mProjTexGenParamCount; i++)
            {
                mProjTexGenParams.Add(new ProjectionTexGenParam(ref reader));
            }

            if (mHasFontShadowParam)
            {
                mFontShadowParam = new FontShadowParameter(ref reader);
            }
        }