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; } }
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; }
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()); }
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; }
private EbxDataContainers(String fileGuid, Dictionary <String, DataContainer> instances, DAIEbx correspondingEbx) { this.fileGuid = fileGuid; this.instances = instances; this.correspondingEbx = correspondingEbx; }
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); }
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); }