public TreeNode ToNode(EBX ebx, Dictionary <FBGuid, FBGuid> imports, Dictionary <FBGuid, string> importNames) { TreeNode result = new TreeNode(ebx.keywords[typeDesc.nameHash]); foreach (EBXNodeField field in fields) { result.Nodes.Add(field.ToNode(ebx, imports, importNames)); } return(result); }
public EBXTypeDesc(Stream s, EBX ebx) { parent = ebx; nameHash = Helpers.ReadInt(s); layoutDescIndex = Helpers.ReadInt(s); fieldCount = (byte)s.ReadByte(); alignment = (byte)s.ReadByte(); flags = Helpers.ReadUShort(s); instanceSize = Helpers.ReadUShort(s); secondaryInstanceSize = Helpers.ReadUShort(s); }
public EBXLayoutDesc(Stream s, EBX ebx) { parent = ebx; nameHash = Helpers.ReadInt(s); flags = Helpers.ReadUShort(s); typeIndex = Helpers.ReadUShort(s); fieldOffset = Helpers.ReadInt(s); if (ebx.keywords[nameHash] == "$") { fieldOffset -= 8; } secondaryOffset = Helpers.ReadInt(s); }
public TreeNode ToNode(EBX ebx, Dictionary <FBGuid, FBGuid> imports, Dictionary <FBGuid, string> importNames) { TreeNode result = new TreeNode(ebx.keywords[layout.nameHash]); byte t = layout.GetFieldType(); switch (t) { case 3: if ((uint)data - 1 < ebx.nodelist.Count && (int)(uint)data > 0) { result.Text = "ref " + ebx.nodelist[(int)(uint)data - 1].Text; } else { int idx = (int)((uint)data & 0x7FFFFFFF); string importname = ""; if (idx >= 0 && idx < imports.Count) { FBGuid guid = imports.Keys.ElementAt <FBGuid>(idx); if (importNames.ContainsKey(guid)) { importname = importNames[guid]; } } result.Nodes.Add("import ref " + idx + "(" + importname + ")"); } break; case 0: case 2: result.Nodes.Add(((EBXNodeType)data).ToNode(ebx, imports, importNames)); break; case 4: List <EBXNodeField> list = (List <EBXNodeField>)data; foreach (EBXNodeField field in list) { result.Nodes.Add(field.ToNode(ebx, imports, importNames)); } break; case 7: case 8: result.Nodes.Add((string)data); break; case 0xA: case 0xB: case 0xC: result.Nodes.Add(((byte)data).ToString("X")); break; case 0xD: case 0xE: result.Nodes.Add(((ushort)data).ToString("X")); break; case 0xF: case 0x10: result.Nodes.Add(((uint)data).ToString("X")); break; case 0x13: result.Nodes.Add(((float)data).ToString()); break; case 0x09: case 0x19: case 0x11: case 0x12: case 0x14: case 0x17: result.Nodes.Add(((ulong)data).ToString("X")); break; case 0x15: case 0x16: string s = ""; foreach (byte b in (byte[])data) { s += b.ToString("X2"); } result.Nodes.Add(s); break; default: result.Nodes.Add("unknown field type 0x" + t.ToString("X")); break; } return(result); }
public SkeletonAsset(EBX Ebx, string PoseNodeName) { LocalTransform = (PoseNodeName == "LocalPose"); Bones = new List <FBBone>(); ModelBones = new Dictionary <string, FBBone>(); string ebxXml = Ebx.ToXML().Replace("&", "_and_").Replace("$", "_dollar_"); XDocument doc = XDocument.Parse(ebxXml); var skel = doc.Root.Descendants("SkeletonAsset"); var skel2 = doc.Root.Element("SkeletonAsset"); var boneNames = from bn in doc.Root.Descendants("BoneNames").Descendants("member") select bn.Value; var hierarchy = from h in doc.Root.Descendants("Hierarchy").Descendants("member") select h.Value; var localPoses = from lp in doc.Root.Descendants(PoseNodeName).Descendants("member").Descendants("LinearTransform") select new { right = new Vector( float.Parse(lp.Element("right").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("right").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("right").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), up = new Vector( float.Parse(lp.Element("up").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("up").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("up").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), forward = new Vector( float.Parse(lp.Element("forward").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("forward").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("forward").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), trans = new Vector( float.Parse(lp.Element("trans").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("trans").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("trans").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))) }; var modelPoses = from lp in doc.Root.Descendants("ModelPose").Descendants("member").Descendants("LinearTransform") select new { right = new Vector( float.Parse(lp.Element("right").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("right").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("right").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), up = new Vector( float.Parse(lp.Element("up").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("up").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("up").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), forward = new Vector( float.Parse(lp.Element("forward").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("forward").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("forward").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))), trans = new Vector( float.Parse(lp.Element("trans").Element("Vec3").Element("x").Value.Trim().Replace("f", "")), float.Parse(lp.Element("trans").Element("Vec3").Element("y").Value.Trim().Replace("f", "")), float.Parse(lp.Element("trans").Element("Vec3").Element("z").Value.Trim().Replace("f", ""))) }; var zipped = boneNames.Zip(hierarchy, (b, p) => new { bn = b.Trim(), pi = p.Trim() }) .Zip(localPoses, (z, l) => new { bn = z.bn, pi = z.pi, lp = l }) .Zip(modelPoses, (z, m) => new { bn = z.bn, pi = z.pi, lp = z.lp, mp = m }); foreach (var z in zipped) { FBBone bone = new FBBone(z.bn); bone.ParentIndex = Convert.ToInt32(z.pi, 16); bone.Right = z.lp.right; bone.Forward = z.lp.forward; bone.Up = z.lp.up; bone.Location = z.lp.trans; Bones.Add(bone); FBBone mbone = new FBBone(z.bn); mbone.ParentIndex = Convert.ToInt32(z.pi, 16); mbone.Right = z.mp.right; mbone.Forward = z.mp.forward; mbone.Up = z.mp.up; mbone.Location = z.mp.trans; ModelBones.Add(z.bn, mbone); } for (int i = 0; i < Bones.Count; i++) { Bones[i].Children = new List <FBBone>(); for (int j = 0; j < Bones.Count; j++) { if (Bones[j].ParentIndex == i) { Bones[i].Children.Add(Bones[j]); } } if (Bones[i].ParentIndex == -1 && RootBone == null) { RootBone = Bones[i]; } } }
public SkeletonAsset(EBX Ebx) : this(Ebx, "LocalPose") { }
public FBSkeleton(EBX Ebx) : this(Ebx, "LocalPose") { }