public void ToXml(DAIEbx EbxFile, ref StringBuilder sb, bool bPrintDescriptor = true)
        {
            if (Descriptor.FieldName != "array")
            {
                if (bPrintDescriptor)
                {
                    DAIEbx.TabCount++;
                    sb.Append(DAIEbx.Tabs() + "<" + Descriptor.FieldName + ">\n");
                    DAIEbx.TabCount++;
                }
            }
            else
            {
                DAIEbx.TabCount++;
            }

            foreach (DAIField CurField in Fields)
            {
                CurField.ToXml(EbxFile, ref sb);
            }

            if (Descriptor.FieldName != "array")
            {
                if (bPrintDescriptor)
                {
                    DAIEbx.TabCount--;
                    sb.Append(DAIEbx.Tabs() + "</" + Descriptor.FieldName + ">\n");
                    DAIEbx.TabCount--;
                }
            }
            else
            {
                DAIEbx.TabCount--;
            }
        }
        public static DAIEbx ReadFromFile(String Filename)
        {
            FileStream file = new FileStream(Filename, FileMode.Open);
            DAIEbx     ebx  = new DAIEbx();

            ebx.Serialize(file);
            file.Close();

            return(ebx);
        }
 public void Serialize(Stream s, DAIEbx EbxFile)
 {
     FieldName       = EbxFile.KeywordDict[Tools.ReadInt(s)];
     FieldStartIndex = Tools.ReadInt(s);
     FieldCount      = s.ReadByte();
     Alignment       = s.ReadByte();
     FieldType       = Tools.ReadShort(s);
     FieldSize       = Tools.ReadShort(s);
     SecondarySize   = Tools.ReadShort(s);
 }
        public void Serialize(Stream s, DAIEbx EbxFile)
        {
            FieldName        = EbxFile.KeywordDict[Tools.ReadInt(s)];
            FieldType        = Tools.ReadShort(s);
            ComplexReference = Tools.ReadShort(s);
            PayloadOffset    = Tools.ReadInt(s);
            SecondaryOffset  = Tools.ReadInt(s);

            if (FieldName == "$")
            {
                PayloadOffset -= 8;
            }
        }
Exemple #5
0
        public static void ExtractEbxGuidAndType(MemoryStream EbxBuffer, out string type, out string guid)
        {
            DAIEbx EbxFile = new DAIEbx();

            EbxFile.Serialize(EbxBuffer);

            guid = "";
            for (int i = 0; i < EbxFile.FileGuid.Length; i++)
            {
                guid += EbxFile.FileGuid[i].ToString("X2");
            }
            type = EbxFile.RootInstance.Descriptor.FieldName;
        }
Exemple #6
0
        public static byte[] ExtractEbx(MemoryStream EbxBuffer)
        {
            MemoryStream OutputStream = new MemoryStream();

            DAIEbx EbxFile = new DAIEbx();

            EbxFile.Serialize(EbxBuffer);

            StreamWriter Writer = new StreamWriter(OutputStream);

            Writer.Write(EbxFile.ToXml());
            Writer.Close();

            return(OutputStream.ToArray());
        }
        public string ToXml()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("<EbxFile Guid=\"");
            for (int i = 0; i < 16; i++)
            {
                sb.Append(FileGuid[i].ToString("X2"));
            }
            sb.Append("\">\n");
            DAIEbx.TabCount++;

            for (int i = 0; i < Instances.Count; i++)
            {
                byte[]     Guid         = Instances.Keys.ElementAt(i);
                DAIComplex ComplexValue = Instances.Values.ElementAt(i);

                String GuidString = "";
                for (int j = 0; j < Guid.Length; j++)
                {
                    GuidString += Guid[j].ToString("X2");
                }

                sb.Append(DAIEbx.Tabs() + "<" + ComplexValue.Descriptor.FieldName + " Guid=\"");
                for (int j = 0; j < 16; j++)
                {
                    sb.Append(Guid[j].ToString("X2"));
                }
                sb.Append("\">\n");
                DAIEbx.TabCount++;

                ComplexValue.ToXml(this, ref sb, false);

                DAIEbx.TabCount--;
                sb.Append(DAIEbx.Tabs() + "</" + ComplexValue.Descriptor.FieldName + ">\n");
            }

            DAIEbx.TabCount--;
            sb.Append("</EbxFile>\n");

            return(sb.ToString());
        }
Exemple #8
0
        public DAISkeleton(DAIEbx Ebx)
        {
            Bones = new List <DAIBone>();

            DAIComplex BoneNamesArray = Ebx.RootInstance.GetFieldByName("BoneNames").GetComplexValue();

            foreach (DAIField BoneNameArrayMember in BoneNamesArray.Fields)
            {
                string BoneName = BoneNameArrayMember.GetStringValue();
                Bones.Add(new DAIBone(BoneName));
            }

            int        BoneIdx        = 0;
            DAIComplex HierarchyArray = Ebx.RootInstance.GetFieldByName("Hierarchy").GetComplexValue();

            foreach (DAIField HierarchyMember in HierarchyArray.Fields)
            {
                DAIBone Bone = Bones[BoneIdx];
                Bone.ParentIndex = HierarchyMember.GetIntValue();
                BoneIdx++;
            }

            BoneIdx = 0;
            DAIComplex LocalPoseArray = Ebx.RootInstance.GetFieldByName("LocalPose").GetComplexValue();

            foreach (DAIField LocalPoseMember in LocalPoseArray.Fields)
            {
                DAIBone    Bone            = Bones[BoneIdx];
                DAIComplex LinearTransform = LocalPoseMember.GetComplexValue();
                DAIComplex Right           = LinearTransform.GetFieldByName("right").GetComplexValue();
                DAIComplex Up      = LinearTransform.GetFieldByName("up").GetComplexValue();
                DAIComplex Forward = LinearTransform.GetFieldByName("forward").GetComplexValue();
                DAIComplex Trans   = LinearTransform.GetFieldByName("trans").GetComplexValue();

                Bone.Right   = new Vector3();
                Bone.Right.X = Right.GetFieldByName("x").GetFloatValue();
                Bone.Right.Y = Right.GetFieldByName("y").GetFloatValue();
                Bone.Right.Z = Right.GetFieldByName("z").GetFloatValue();

                Bone.Up   = new Vector3();
                Bone.Up.X = Up.GetFieldByName("x").GetFloatValue();
                Bone.Up.Y = Up.GetFieldByName("y").GetFloatValue();
                Bone.Up.Z = Up.GetFieldByName("z").GetFloatValue();

                Bone.Forward   = new Vector3();
                Bone.Forward.X = Forward.GetFieldByName("x").GetFloatValue();
                Bone.Forward.Y = Forward.GetFieldByName("y").GetFloatValue();
                Bone.Forward.Z = Forward.GetFieldByName("z").GetFloatValue();

                Bone.Location   = new Vector3();
                Bone.Location.X = Trans.GetFieldByName("x").GetFloatValue();
                Bone.Location.Y = Trans.GetFieldByName("y").GetFloatValue();
                Bone.Location.Z = Trans.GetFieldByName("z").GetFloatValue();

                BoneIdx++;
            }

            DAIComplex ModelPoseArray = Ebx.RootInstance.GetFieldByName("ModelPose").GetComplexValue();

            for (int i = 0; i < Bones.Count; i++)
            {
                Bones[i].Children = new List <DAIBone>();
                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 void Serialize(Stream s, DAIEbx EbxFile)
 {
     Offset = Tools.ReadInt(s);
     Count  = Tools.ReadInt(s);
     ComplexDescriptorIndex = Tools.ReadInt(s);
 }
        public void ToXml(DAIEbx EbxFile, ref StringBuilder sb)
        {
            if (Descriptor.FieldName == "$")
            {
                DAIEbx.TabCount--;
                ComplexValue.ToXml(EbxFile, ref sb);
                DAIEbx.TabCount++;
                return;
            }

            sb.Append(DAIEbx.Tabs() + "<" + Descriptor.FieldName + ">");

            switch (ValueType)
            {
            case DAIFieldType.DAI_Complex:
            case DAIFieldType.DAI_Array:
                sb.Append("\n");
                if (ComplexValue != null)
                {
                    ComplexValue.ToXml(EbxFile, ref sb);
                }
                else
                {
                    sb.Append("[null]\n");
                }
                sb.Append(DAIEbx.Tabs() + "</" + Descriptor.FieldName + ">\n");
                return;

            case DAIFieldType.DAI_String:
                sb.Append(GetStringValue());
                break;

            case DAIFieldType.DAI_Int:
                sb.Append(GetIntValue().ToString("X8"));
                break;

            case DAIFieldType.DAI_UInt:
                sb.Append(GetUIntValue().ToString("X8"));
                break;

            case DAIFieldType.DAI_Float:
                sb.Append(GetFloatValue().ToString("F3"));
                break;

            case DAIFieldType.DAI_Short:
                sb.Append(GetShortValue().ToString("X4"));
                break;

            case DAIFieldType.DAI_UShort:
                sb.Append(GetUShortValue().ToString("X4"));
                break;

            case DAIFieldType.DAI_Byte:
                sb.Append(GetByteValue().ToString("X2"));
                break;

            case DAIFieldType.DAI_UByte:
                sb.Append(GetByteValue().ToString("X2"));
                break;

            case DAIFieldType.DAI_Long:
                sb.Append(GetLongValue().ToString("X16"));
                break;

            case DAIFieldType.DAI_LongLong:
                for (int i = 0; i < Value.Length; i++)
                {
                    sb.Append(Value[i].ToString("X2"));
                }
                break;

            case DAIFieldType.DAI_Bool:
                sb.Append(GetBoolValue().ToString());
                break;

            case DAIFieldType.DAI_Enum:
                sb.Append(GetEnumValue());
                break;

            case DAIFieldType.DAI_Guid:
            {
                uint UIntValue = GetUIntValue();
                if ((UIntValue >> 31) == 1)
                {
                    /* External Guid */
                    DAIExternalGuid Guid = EbxFile.ExternalGuids.ElementAt((int)(UIntValue & 0x7fffffff));
                    System.Data.SQLite.SQLiteConnection con = Database.GetConnection();
                    con.Open();
                    System.Data.SQLite.SQLiteDataReader reader = new System.Data.SQLite.SQLiteCommand("SELECT name,type FROM ebx WHERE guid = '" + Guid.FileGuidString() + "'", con).ExecuteReader();
                    reader.Read();
                    sb.Append("[" + reader.GetString(1) + "] " + reader.GetString(0));
                }
                else if (UIntValue == 0)
                {
                    /* NULL Guid */
                    sb.Append("[null]");
                }
                else
                {
                    /* Internal Guid */
                    byte[] Guid = EbxFile.InternalGuids[(int)(UIntValue - 1)];
                    sb.Append("[" + EbxFile.Instances[Guid].Descriptor.FieldName + "] ");
                    for (int i = 0; i < Guid.Length; i++)
                    {
                        sb.Append(Guid[i].ToString("X2"));
                    }
                }
            }
            break;
            }

            sb.Append("</" + Descriptor.FieldName + ">\n");
            return;
        }
Exemple #11
0
 private EbxDataContainers(String fileGuid, Dictionary <String, DataContainer> instances, DAIEbx correspondingEbx)
 {
     this.fileGuid         = fileGuid;
     this.instances        = instances;
     this.correspondingEbx = correspondingEbx;
 }
Exemple #12
0
        private static AValue convert(DAIField field, ConverterContext ctx)
        {
            AValue result;

            if (field.ValueType == DAIFieldType.DAI_Complex)
            {
                var value = field.GetComplexValue();

                if (value == null)
                {
                    result = new ASimpleValue("{null}");
                }
                else
                {
                    var astruct = new AStruct();
                    astruct.name = value.GetName();

                    foreach (var childField in value.Fields)
                    {
                        AValue convertedChild = convert(childField, ctx);
                        var    childFieldName = childField.Descriptor.FieldName;
                        astruct.fields.Add(childFieldName, convertedChild);
                        astruct.correspondingDaiFields.Add(childFieldName, childField);
                    }

                    result = astruct;
                }
            }
            else if (field.ValueType == DAIFieldType.DAI_Array)
            {
                var value  = field.GetArrayValue();
                var aarray = new AArray();

                foreach (var memberField in value.Fields)
                {
                    AValue convertedMember = convert(memberField, ctx);
                    aarray.elements.Add(convertedMember);
                    aarray.correspondingDaiFields.Add(memberField);
                }

                result = aarray;
            }
            else if (field.ValueType == DAIFieldType.DAI_Guid)
            {
                var guid = ctx.file.GetDaiGuidFieldValue(field);

                if (guid.instanceGuid.Equals("null"))
                {
                    result = new ANullRef();
                }
                else
                {
                    if (guid.external)
                    {
                        var aexref = new AExRef(guid.fileGuid, guid.instanceGuid);
                        ctx.extRefs.Add(new Tuple <AExRef, string>(aexref, ctx.instanceGuid));
                        result = aexref;
                    }
                    else
                    {
                        var ainref = new AIntRef(guid.instanceGuid);
                        ctx.intReferences.Add(new Tuple <AIntRef, string>(ainref, ctx.instanceGuid));
                        result = ainref;
                    }
                }
            }
            else
            {
                String strValue;

                switch (field.ValueType)
                {
                case DAIFieldType.DAI_String:
                    strValue = field.GetStringValue();
                    break;

                case DAIFieldType.DAI_Enum:
                    strValue = field.GetEnumValue();
                    break;

                case DAIFieldType.DAI_Int:
                    strValue = field.GetIntValue().ToString();
                    break;

                case DAIFieldType.DAI_UInt:
                    strValue = field.GetUIntValue().ToString();
                    break;

                case DAIFieldType.DAI_Double:
                case DAIFieldType.DAI_Float:
                    strValue = field.GetFloatValue().ToString();
                    break;

                case DAIFieldType.DAI_Short:
                    strValue = field.GetShortValue().ToString();
                    break;

                case DAIFieldType.DAI_UShort:
                    strValue = field.GetUShortValue().ToString();
                    break;

                case DAIFieldType.DAI_Byte:
                case DAIFieldType.DAI_UByte:
                    strValue = field.GetByteValue().ToString();
                    break;

                case DAIFieldType.DAI_Long:
                    strValue = field.GetLongValue().ToString();
                    break;

                case DAIFieldType.DAI_LongLong:
                    strValue = "LL " + DAIEbx.GuidToString(field.GetLongLongValue());
                    break;

                case DAIFieldType.DAI_Bool:
                    strValue = field.GetBoolValue().ToString();
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                result = new ASimpleValue(strValue, tryUnhash(strValue));
            }

            return(result);
        }
Exemple #13
0
        public static EbxDataContainers fromDAIEbx(DAIEbx file, Action <string> statusConsumer, bool resolveExternalRefs = true)
        {
            Dictionary <String, DataContainer> instances = new Dictionary <string, DataContainer>();

            var ctx = new ConverterContext();

            ctx.file = file;

            statusConsumer("Converting instances...");
            foreach (var instance in file.Instances)
            {
                var instanceGuid = DAIEbx.GuidToString(instance.Key);
                statusConsumer($"Converting {instanceGuid}...");
                ctx.instanceGuid = instanceGuid;
                var    rootFakeField     = wrapWithFakeField(instance.Value);
                AValue convertedTreeRoot = convert(rootFakeField, ctx);

                Debug.Assert(convertedTreeRoot.Type == ValueTypes.STRUCT);
                AStruct treeRoot = (AStruct)convertedTreeRoot;
                instances.Add(instanceGuid, new DataContainer(instanceGuid, treeRoot));
            }

            statusConsumer("Processing IntRefs...");
            foreach (var refEntry in ctx.intReferences)
            {
                var refObj     = refEntry.Item1;
                var targetGuid = refObj.instanceGuid;

                if (instances.ContainsKey(targetGuid))
                {
                    var target = instances[targetGuid];
                    target.internalRefCount += 1;
                    refObj.refStatus         = RefStatus.RESOLVED_SUCCESS;
                }
                else
                {
                    refObj.refStatus = RefStatus.RESOLVED_FAILURE;
                }

                var refObjTreeRootGuid = refEntry.Item2;
                instances[refObjTreeRootGuid].addIntRef(targetGuid);
            }

            if (resolveExternalRefs)
            {
                statusConsumer("Processing ExRefs...");
                using (var dbconn = Database.GetConnection())
                {
                    dbconn.Open();
                    using (var dbtrans = dbconn.BeginTransaction())
                    {
                        int processedCount = 0;
                        foreach (var exRefEntry in ctx.extRefs)
                        {
                            var exref      = exRefEntry.Item1;
                            var sqlCmdText = $"select name, type from ebx where guid = \"{exref.fileGuid}\"";
                            using (var reader = new SQLiteCommand(sqlCmdText, dbconn).ExecuteReader())
                            {
                                if (!reader.HasRows)
                                {
                                    exref.refStatus = RefStatus.RESOLVED_FAILURE;
                                }
                                else
                                {
                                    reader.Read();
                                    var values = new object[2];
                                    reader.GetValues(values);

                                    exref.refName   = (string)values[0];
                                    exref.refType   = (string)values[1];
                                    exref.refStatus = RefStatus.RESOLVED_SUCCESS;
                                }
                            }
                            processedCount += 1;
                            statusConsumer($"Processed ExtRefs: {processedCount}/{ctx.extRefs.Count}");
                        }
                        dbtrans.Commit();
                    }
                }
            }

            statusConsumer("Populating partials...");
            var fileGuid = DAIEbx.GuidToString(file.FileGuid);
            var edc      = new EbxDataContainers(fileGuid, instances, file);

            edc.populatePartials();

            statusConsumer("DAIEbx -> EbxDataContainers done.");
            return(edc);
        }