/// <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)); } } } } }
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); } }
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); } }