Exemplo n.º 1
0
        /// <summary>
        /// Function that parse MDLX files
        /// </summary>
        /// <param name="entbin">byte array of the file</param>
        public Parse4Mdlx(byte[] entbin)
        {
            mdlx = new Mdlxfst(new MemoryStream(entbin, false));
            float scale = 1f;

            using (List <T31> .Enumerator enumerator = mdlx.alt31.GetEnumerator())
            {
                if (enumerator.MoveNext())
                {
                    T31      current = enumerator.Current;
                    AxBone[] array   = current.t21.alaxb.ToArray();
                    var      array2  = new Matrix[array.Length];
                    var      array3  = new Vector3[array2.Length];
                    var      array4  = new Quaternion[array2.Length];
                    for (int i = 0; i < array2.Length; i++)
                    {
                        AxBone     axBone = array[i];
                        int        parent = axBone.parent;
                        Quaternion quaternion;
                        Vector3    left;
                        if (parent < 0)
                        {
                            quaternion = Quaternion.Identity;
                            left       = Vector3.Zero;
                        }
                        else
                        {
                            quaternion = array4[parent];
                            left       = array3[parent];
                        }
                        Vector3 right = Vector3.TransformCoordinate(new Vector3(axBone.x3, axBone.y3, axBone.z3),
                                                                    Matrix.RotationQuaternion(quaternion));
                        array3[i] = left + right;
                        Quaternion left2 = Quaternion.Identity;
                        if (axBone.x2 != 0f)
                        {
                            left2 *= Quaternion.RotationAxis(new Vector3(1f, 0f, 0f), axBone.x2);
                        }
                        if (axBone.y2 != 0f)
                        {
                            left2 *= Quaternion.RotationAxis(new Vector3(0f, 1f, 0f), axBone.y2);
                        }
                        if (axBone.z2 != 0f)
                        {
                            left2 *= Quaternion.RotationAxis(new Vector3(0f, 0f, 1f), axBone.z2);
                        }
                        array4[i] = left2 * quaternion;
                    }
                    for (int j = 0; j < array2.Length; j++)
                    {
                        Matrix matrix = Matrix.RotationQuaternion(array4[j]);
                        matrix   *= Matrix.Translation(array3[j]);
                        array2[j] = matrix;
                    }
                    var    list     = new List <Body1e>();
                    Matrix identity = Matrix.Identity;
                    foreach (T13vif current2 in current.al13)
                    {
                        var vU1Mem = new VU1Mem();
                        int tops   = 64;
                        int top    = 544;
                        new ParseVIF1(vU1Mem).Parse(new MemoryStream(current2.bin, false), tops);
                        Body1e item = SimaVU1e.Sima(vU1Mem, array2, tops, top, current2.texi, current2.alaxi, identity);
                        list.Add(item);
                    }
                    var   ffMesh = new ffMesh();
                    int   num    = 0;
                    int   num2   = 0;
                    var   array5 = new ff1[4];
                    int   num3   = 0;
                    int[] array6 =
                    {
                        1,
                        3,
                        2
                    };
                    foreach (Body1e current3 in list)
                    {
                        for (int k = 0; k < current3.alvi.Length; k++)
                        {
                            var ff = new ff1(num + current3.alvi[k], num2 + k);
                            array5[num3] = ff;
                            num3         = (num3 + 1 & 3);
                            int num4 = current3.alfl[k];
                            if (num4 == 32 || num4 == 0)
                            {
                                var item2 = new ff3(current3.t, array5[num3 - array6[0] & 3],
                                                    array5[num3 - array6[1] & 3], array5[num3 - array6[2] & 3]);
                                ffMesh.al3.Add(item2);
                            }
                            if (num4 == 48 || num4 == 0)
                            {
                                var item3 = new ff3(current3.t, array5[num3 - array6[0] & 3],
                                                    array5[num3 - array6[2] & 3], array5[num3 - array6[1] & 3]);
                                ffMesh.al3.Add(item3);
                            }
                        }
                        for (int l = 0; l < current3.alvertraw.Length; l++)
                        {
                            if (current3.alalni[l] == null)
                            {
                                ffMesh.alpos.Add(Vector3.Zero);
                                ffMesh.almtxuse.Add(new MJ1[0]);
                            }
                            else
                            {
                                if (current3.alalni[l].Length == 1)
                                {
                                    MJ1 mJ = current3.alalni[l][0];
                                    mJ.factor = 1f;
                                    Vector3 item4 =
                                        Vector3.TransformCoordinate(VCUt.V4To3(current3.alvertraw[mJ.vertexIndex]),
                                                                    array2[mJ.matrixIndex]);
                                    ffMesh.alpos.Add(item4);
                                }
                                else
                                {
                                    Vector3 vector = Vector3.Zero;
                                    MJ1[]   array7 = current3.alalni[l];
                                    for (int m = 0; m < array7.Length; m++)
                                    {
                                        MJ1 mJ2 = array7[m];
                                        vector +=
                                            VCUt.V4To3(Vector4.Transform(current3.alvertraw[mJ2.vertexIndex],
                                                                         array2[mJ2.matrixIndex]));
                                    }
                                    ffMesh.alpos.Add(vector);
                                }
                                ffMesh.almtxuse.Add(current3.alalni[l]);
                            }
                        }
                        for (int n = 0; n < current3.aluv.Length; n++)
                        {
                            Vector2 item5 = current3.aluv[n];
                            item5.Y = 1f - item5.Y;
                            ffMesh.alst.Add(item5);
                        }
                        num  += current3.alvertraw.Length;
                        num2 += current3.aluv.Length;
                    }
                    int count = ffMesh.al3.Count;
                    for (int num5 = 0; num5 < count; num5++)
                    {
                        ff3   ff2 = ffMesh.al3[num5];
                        Model model;
                        if (!dictModel.TryGetValue(ff2.texi, out model))
                        {
                            model = (dictModel[ff2.texi] = new Model());
                        }
                        for (int num6 = 0; num6 < ff2.al1.Length; num6++)
                        {
                            ff1     ff3     = ff2.al1[num6];
                            Vector3 v       = ffMesh.alpos[ff3.vi] * scale;
                            Vector2 vector2 = ffMesh.alst[ff3.ti];
                            model.alv.Add(new CustomVertex.PositionColoredTextured(v, -1, vector2.X, 1f - vector2.Y));
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public AnimReader(Stream si)
        {
            var posTbl  = new PosTbl(si);
            int baseoff = 0;
            int tbloff  = posTbl.tbloff;

            cntb1 = posTbl.va0;
            cntb2 = posTbl.va2;

            var br = new BinaryReader(si);

            // min
            br.ReadSingle();
            br.ReadSingle();
            br.ReadSingle();
            br.ReadSingle();
            // max
            br.ReadSingle();
            br.ReadSingle();
            br.ReadSingle();
            br.ReadSingle();

            FrameLoop      = br.ReadSingle();
            FrameEnd       = br.ReadSingle();
            FramePerSecond = br.ReadSingle();
            FrameCount     = br.ReadSingle();

            int cnt9 = 0, cnt10 = 0, cnt12 = 0;

            if (true)
            {                                                          // cnt9
                si.Position = baseoff + tbloff + posTbl.vc0 - baseoff; // t2
                for (int i2 = 0; i2 < posTbl.vc4; i2++)
                {
                    br.ReadByte();
                    br.ReadByte();
                    br.ReadByte();
                    int tcx = br.ReadByte();
                    int tx  = br.ReadUInt16();
                    cnt9 = Math.Max(cnt9, tx + tcx);
                }
                si.Position = baseoff + tbloff + posTbl.vc8 - baseoff; // t2x
                for (int i2 = 0; i2 < posTbl.vcc; i2++)
                {
                    br.ReadByte();
                    br.ReadByte();
                    br.ReadByte();
                    int tcx = br.ReadByte();
                    int tx  = br.ReadUInt16();
                    cnt9 = Math.Max(cnt9, tx + tcx);
                }

                if (true)
                {                                                          // cnt10, cnt12
                    si.Position = baseoff + tbloff + posTbl.vd0 - baseoff; // t9
                    for (int i9 = 0; i9 < cnt9; i9++)
                    {
                        br.ReadUInt16();
                        int ti10 = br.ReadUInt16();
                        cnt10 = Math.Max(cnt10, ti10 + 1);
                        int ti12a = br.ReadUInt16();
                        cnt12 = Math.Max(cnt12, ti12a + 1);
                        int ti12b = br.ReadUInt16();
                        cnt12 = Math.Max(cnt12, ti12b + 1);
                    }
                }
            }
            int cntt8 = 0;

            if (true)
            {
                si.Position = baseoff + tbloff + posTbl.ve0 - baseoff; // t3
                for (int i3 = 0; i3 < posTbl.ve4; i3++)
                {
                    br.ReadUInt16();
                    br.ReadUInt16();
                    br.ReadUInt16();
                    int ti8 = br.ReadInt16();
                    cntt8 = Math.Max(cntt8, ti8 + 1);
                    br.ReadUInt16();
                    br.ReadUInt16();
                }
            }

            int off1 = tbloff + posTbl.vb4;
            int cnt1 = posTbl.vb8;

            si.Position = off1;
            for (int a1 = 0; a1 < cnt1; a1++)
            {
                int   c00 = br.ReadUInt16();
                int   c02 = br.ReadUInt16();
                float c04 = br.ReadSingle();
                model.t1List.Add(new T1(c00, c02, c04));
            }

            int off10 = tbloff + posTbl.vd8;

            si.Position   = off10;
            model.t10List = new float[cnt10];
            for (int a = 0; a < cnt10; a++)
            {
                model.t10List[a] = br.ReadSingle();
            }

            int off11 = tbloff + posTbl.vd4;
            int cnt11 = posTbl.vb0;

            si.Position   = off11;
            model.t11List = new float[cnt11];
            for (int a = 0; a < cnt11; a++)
            {
                model.t11List[a] = br.ReadSingle();
            }

            int off12 = tbloff + posTbl.vdc;

            si.Position   = off12;
            model.t12List = new float[cnt12];
            for (int a = 0; a < cnt12; a++)
            {
                model.t12List[a] = br.ReadSingle();
            }

            int off9 = tbloff + posTbl.vd0;

            si.Position = off9;
            for (int a = 0; a < cnt9; a++)
            {
                int c00 = br.ReadUInt16();
                int c02 = br.ReadUInt16();
                int c04 = br.ReadUInt16();
                int c06 = br.ReadUInt16();
                model.t9List.Add(new T9(c00, c02, c04, c06));
            }

            int off2 = tbloff + posTbl.vc0;
            int cnt2 = posTbl.vc4;

            si.Position = off2;
            for (int a = 0; a < cnt2; a++)
            {
                int c00 = br.ReadByte();
                int c01 = br.ReadByte();
                int c02 = br.ReadByte();
                int c03 = br.ReadByte();
                int c04 = br.ReadUInt16(); // t9_xxxx
                T2  o2  = new T2(c00, c01, c02, c03, c04);
                model.t2List.Add(o2);
            }
            for (int a = 0; a < cnt2; a++)
            {
                T2 o2 = model.t2List[a];
                for (int b = 0; b < o2.c03; b++)
                {
                    T9 o9 = model.t9List[o2.c04 + b];

                    int t9c00 = o9.c00; // t11_xxxx
                    int t9c02 = o9.c02; // t10_xxxx
                    int t9c04 = o9.c04; // t12_xxxx
                    int t9c06 = o9.c06; // t12_xxxx

                    o2.al9f.Add(new T9f(o2.c04 + b, model.t11List[t9c00 >> 2], model.t10List[t9c02], model.t12List[t9c04], model.t12List[t9c06]));
                }
            }

            int off2x = tbloff + posTbl.vc8;
            int cnt2x = posTbl.vcc;

            si.Position = off2x;
            for (int a = 0; a < cnt2x; a++)
            {
                int c00 = br.ReadByte();
                int c01 = br.ReadByte();
                int c02 = br.ReadByte();
                int c03 = br.ReadByte();
                int c04 = br.ReadUInt16(); // t9_xxxx
                T2  o2  = new T2(c00, c01, c02, c03, c04);
                model.t2xList.Add(o2);
            }
            for (int a = 0; a < cnt2x; a++)
            {
                T2 o2 = model.t2xList[a];
                for (int b = 0; b < o2.c03; b++)
                {
                    T9 o9 = model.t9List[o2.c04 + b];

                    int t9c00 = o9.c00; // t11_xxxx
                    int t9c02 = o9.c02; // t10_xxxx
                    int t9c04 = o9.c04; // t12_xxxx
                    int t9c06 = o9.c06; // t12_xxxx

                    o2.al9f.Add(new T9f(o2.c04 + b, model.t11List[t9c00 >> 2], model.t10List[t9c02], model.t12List[t9c04], model.t12List[t9c06]));
                }
            }

            int off3 = tbloff + posTbl.ve0;
            int cnt3 = posTbl.ve4;

            si.Position = off3;
            for (int a3 = 0; a3 < cnt3; a3++)
            {
                int  c00 = br.ReadByte();
                int  c01 = br.ReadByte();
                int  c02 = br.ReadUInt16();
                int  c04 = br.ReadUInt16();
                int  c06 = br.ReadUInt16();
                uint c08 = br.ReadUInt32();
                model.t3List.Add(new T3(c00, c01, c02, c04, c06, c08));
            }

            int off4 = tbloff + posTbl.vac;
            int cnt4 = posTbl.va2;

            si.Position = off4;
            for (int a4 = 0; a4 < cnt4; a4++)
            {
                int c00 = br.ReadUInt16();
                int c02 = br.ReadUInt16();
                model.t4List.Add(new T4(c00, c02));
            }

            model.off5  = tbloff + posTbl.va8;
            model.cnt5  = (posTbl.va2 - posTbl.va0);
            si.Position = model.off5;
            for (int a5 = 0; a5 < model.cnt5; a5++)
            {
                AxBone o = new AxBone();
                o.cur    = br.ReadUInt16();
                o.parent = br.ReadUInt16();
                o.v08    = br.ReadUInt16();
                o.v0c    = br.ReadUInt16();
                br.ReadUInt64();
                o.x1 = br.ReadSingle();
                o.y1 = br.ReadSingle();
                o.z1 = br.ReadSingle();
                o.w1 = br.ReadSingle();
                o.x2 = br.ReadSingle();
                o.y2 = br.ReadSingle();
                o.z2 = br.ReadSingle();
                o.w2 = br.ReadSingle();
                o.x3 = br.ReadSingle();
                o.y3 = br.ReadSingle();
                o.z3 = br.ReadSingle();
                o.w3 = br.ReadSingle();
                model.t5List.Add(o);
            }
        }
Exemplo n.º 3
0
        public Msetblk(Stream si)
        {
            var posTbl = new PosTbl(si);
            int num    = 0;
            int tbloff = posTbl.tbloff;

            cntb1 = posTbl.va0;
            cntb2 = posTbl.va2;
            var binaryReader = new BinaryReader(si);
            int num2         = 0;
            int num3         = 0;
            int num4         = 0;

            si.Position = num + tbloff + posTbl.vc0 - num;
            for (int i = 0; i < posTbl.vc4; i++)
            {
                binaryReader.ReadByte();
                binaryReader.ReadByte();
                binaryReader.ReadByte();
                int num5 = binaryReader.ReadByte();
                int num6 = binaryReader.ReadUInt16();
                num2 = Math.Max(num2, num6 + num5);
            }
            si.Position = num + tbloff + posTbl.vc8 - num;
            for (int j = 0; j < posTbl.vcc; j++)
            {
                binaryReader.ReadByte();
                binaryReader.ReadByte();
                binaryReader.ReadByte();
                int num7 = binaryReader.ReadByte();
                int num8 = binaryReader.ReadUInt16();
                num2 = Math.Max(num2, num8 + num7);
            }
            si.Position = num + tbloff + posTbl.vd0 - num;
            for (int k = 0; k < num2; k++)
            {
                binaryReader.ReadUInt16();
                int num9 = binaryReader.ReadUInt16();
                num3 = Math.Max(num3, num9 + 1);
                int num10 = binaryReader.ReadUInt16();
                num4 = Math.Max(num4, num10 + 1);
                int num11 = binaryReader.ReadUInt16();
                num4 = Math.Max(num4, num11 + 1);
            }
            int val = 0;

            si.Position = num + tbloff + posTbl.ve0 - num;
            for (int l = 0; l < posTbl.ve4; l++)
            {
                binaryReader.ReadUInt16();
                binaryReader.ReadUInt16();
                binaryReader.ReadUInt16();
                int num12 = binaryReader.ReadInt16();
                val = Math.Max(val, num12 + 1);
                binaryReader.ReadUInt16();
                binaryReader.ReadUInt16();
            }
            int num13 = tbloff + posTbl.vb4;
            int vb    = posTbl.vb8;

            si.Position = num13;
            for (int m = 0; m < vb; m++)
            {
                int   c  = binaryReader.ReadUInt16();
                int   c2 = binaryReader.ReadUInt16();
                float c3 = binaryReader.ReadSingle();
                to.al1.Add(new T1(c, c2, c3));
            }
            int num14 = tbloff + posTbl.vd8;

            si.Position = num14;
            to.al10     = new float[num3];
            for (int n = 0; n < num3; n++)
            {
                to.al10[n] = binaryReader.ReadSingle();
            }
            int num15 = tbloff + posTbl.vd4;
            int vb2   = posTbl.vb0;

            si.Position = num15;
            to.al11     = new float[vb2];
            for (int num16 = 0; num16 < vb2; num16++)
            {
                to.al11[num16] = binaryReader.ReadSingle();
            }
            int num17 = tbloff + posTbl.vdc;

            si.Position = num17;
            to.al12     = new float[num4];
            for (int num18 = 0; num18 < num4; num18++)
            {
                to.al12[num18] = binaryReader.ReadSingle();
            }
            int num19 = tbloff + posTbl.vd0;

            si.Position = num19;
            for (int num20 = 0; num20 < num2; num20++)
            {
                int c4 = binaryReader.ReadUInt16();
                int c5 = binaryReader.ReadUInt16();
                int c6 = binaryReader.ReadUInt16();
                int c7 = binaryReader.ReadUInt16();
                to.al9.Add(new T9(c4, c5, c6, c7));
            }
            int num21 = tbloff + posTbl.vc0;
            int vc    = posTbl.vc4;

            si.Position = num21;
            for (int num22 = 0; num22 < vc; num22++)
            {
                int c8   = binaryReader.ReadByte();
                int c9   = binaryReader.ReadByte();
                int c10  = binaryReader.ReadByte();
                int c11  = binaryReader.ReadByte();
                int c12  = binaryReader.ReadUInt16();
                var item = new T2(c8, c9, c10, c11, c12);
                to.al2.Add(item);
            }
            for (int num23 = 0; num23 < vc; num23++)
            {
                T2 t = to.al2[num23];
                for (int num24 = 0; num24 < t.c03; num24++)
                {
                    T9  t2  = to.al9[t.c04 + num24];
                    int c13 = t2.c00;
                    int c14 = t2.c02;
                    int c15 = t2.c04;
                    int c16 = t2.c06;
                    t.al9f.Add(new T9f(t.c04 + num24, to.al11[c13 >> 2], to.al10[c14], to.al12[c15], to.al12[c16]));
                }
            }
            int num25 = tbloff + posTbl.vc8;
            int vcc   = posTbl.vcc;

            si.Position = num25;
            for (int num26 = 0; num26 < vcc; num26++)
            {
                int c17   = binaryReader.ReadByte();
                int c18   = binaryReader.ReadByte();
                int c19   = binaryReader.ReadByte();
                int c20   = binaryReader.ReadByte();
                int c21   = binaryReader.ReadUInt16();
                var item2 = new T2(c17, c18, c19, c20, c21);
                to.al2x.Add(item2);
            }
            for (int num27 = 0; num27 < vcc; num27++)
            {
                T2 t3 = to.al2x[num27];
                for (int num28 = 0; num28 < t3.c03; num28++)
                {
                    T9  t4  = to.al9[t3.c04 + num28];
                    int c22 = t4.c00;
                    int c23 = t4.c02;
                    int c24 = t4.c04;
                    int c25 = t4.c06;
                    t3.al9f.Add(new T9f(t3.c04 + num28, to.al11[c22 >> 2], to.al10[c23], to.al12[c24], to.al12[c25]));
                }
            }
            int num29 = tbloff + posTbl.ve0;
            int ve    = posTbl.ve4;

            si.Position = num29;
            for (int num30 = 0; num30 < ve; num30++)
            {
                int  c26 = binaryReader.ReadByte();
                int  c27 = binaryReader.ReadByte();
                int  c28 = binaryReader.ReadUInt16();
                int  c29 = binaryReader.ReadUInt16();
                int  c30 = binaryReader.ReadUInt16();
                uint c31 = binaryReader.ReadUInt32();
                to.al3.Add(new T3(c26, c27, c28, c29, c30, c31));
            }
            int num31 = tbloff + posTbl.vac;
            int va    = posTbl.va2;

            si.Position = num31;
            for (int num32 = 0; num32 < va; num32++)
            {
                int c32 = binaryReader.ReadUInt16();
                int c33 = binaryReader.ReadUInt16();
                to.al4.Add(new T4(c32, c33));
            }
            to.off5     = tbloff + posTbl.va8;
            to.cnt5     = posTbl.va2 - posTbl.va0;
            si.Position = to.off5;
            for (int num33 = 0; num33 < to.cnt5; num33++)
            {
                var axBone = new AxBone();
                axBone.cur    = binaryReader.ReadUInt16();
                axBone.parent = binaryReader.ReadUInt16();
                axBone.v08    = binaryReader.ReadUInt16();
                axBone.v0c    = binaryReader.ReadUInt16();
                binaryReader.ReadUInt64();
                axBone.x1 = binaryReader.ReadSingle();
                axBone.y1 = binaryReader.ReadSingle();
                axBone.z1 = binaryReader.ReadSingle();
                axBone.w1 = binaryReader.ReadSingle();
                axBone.x2 = binaryReader.ReadSingle();
                axBone.y2 = binaryReader.ReadSingle();
                axBone.z2 = binaryReader.ReadSingle();
                axBone.w2 = binaryReader.ReadSingle();
                axBone.x3 = binaryReader.ReadSingle();
                axBone.y3 = binaryReader.ReadSingle();
                axBone.z3 = binaryReader.ReadSingle();
                axBone.w3 = binaryReader.ReadSingle();
                to.al5.Add(axBone);
            }
        }