Esempio n. 1
0
            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);
            }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
        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];
                }
            }
        }
Esempio n. 6
0
 public SkeletonAsset(EBX Ebx)
     : this(Ebx, "LocalPose")
 {
 }
Esempio n. 7
0
 public FBSkeleton(EBX Ebx)
     : this(Ebx, "LocalPose")
 {
 }