public override void WriteParams(System.Xml.XmlWriter writer, Dictionary <HavokClassNode, int> classNodes) { writer.WriteAttributeString("numelements", Children.Count.ToString(System.Globalization.CultureInfo.InvariantCulture)); writer.WriteString(" "); foreach (HavokClassNode c in Children) { //Arrays embed parameters instead of pointing to an object containing them elsewhere HavokClassNode c2 = c; if (c is cmPointerNode && c.Children.Count > 0) { c2 = c.Children[0] as HavokClassNode; } if (c2 is HavokMetaObjectNode || c2 is hkClassNode) { ResourceNode[] nodes = c2.FindChildrenByClassType(null, typeof(HavokMetaObjectNode)); if (nodes == null && nodes.Length == 0) { writer.WriteStartElement("hkobject"); c2.WriteParams(writer, classNodes); writer.WriteEndElement(); } else { writer.WriteString(HavokXML.GetObjectName(classNodes, c2)); } } else if (c2 is cmStringNode) { writer.WriteStartElement("hkstring"); c2.WriteParams(writer, classNodes); writer.WriteEndElement(); } else { c2.WriteParams(writer, classNodes); } writer.WriteString(" "); } }
public override void WriteParams(System.Xml.XmlWriter writer, Dictionary <HavokClassNode, int> classNodes) { if (Children.Count > 0) { HavokClassNode n = Children[0] as HavokClassNode; if (n is HavokMetaObjectNode || n is hkClassNode) { writer.WriteString(HavokXML.GetObjectName(classNodes, n)); } else { n.WriteParams(writer, classNodes); } } }
public static void Serialize(HavokNode node, string outFile) { using (FileStream stream = new FileStream(outFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None, 0x1000, FileOptions.SequentialScan)) { using (XmlWriter writer = XmlWriter.Create(stream, _writerSettings)) { writer.Flush(); stream.Position = 0; node.Populate(); Dictionary <HavokClassNode, int> classIDs = new Dictionary <HavokClassNode, int>(); int i = 1; foreach (HavokSectionNode s in node.Children) { foreach (HavokClassNode c in s._classCache) { if (!classIDs.ContainsKey(c)) { classIDs.Add(c, i++); } } } //RecursiveGetClassIDsData(ref classIDs, node, node._dataSection); HavokClassNode rootClass = node._dataSection.Children[0] as HavokClassNode; List <HavokSectionNode> sections = node.Children.Select(x => x as HavokSectionNode) .Where(x => x != node._dataSection).ToList(); sections.Add(node._dataSection); writer.WriteStartDocument(); { writer.WriteStartElement("hkpackfile"); writer.WriteAttributeString("classversion", "11"); writer.WriteAttributeString("contentsversion", "hk_2014.1.0-r1"); writer.WriteAttributeString("toplevelobject", GetObjectName(classIDs, rootClass)); writer.WriteAttributeString("maxpredicate", "21"); writer.WriteAttributeString("predicates", ""); { foreach (HavokSectionNode s in sections) { writer.WriteStartElement("hksection"); writer.WriteAttributeString("name", s.Name == "Classes" ? "__types__" : "__data__"); { for (int x = s._classCache.Count - 1; x >= 0; x--) { HavokClassNode c = s._classCache[x]; //HavokCommonArrayNode array = null; //if (c.Parent is cmPointerNode && c.Parent.Parent is HavokCommonArrayNode) // array = c.Parent.Parent as HavokCommonArrayNode; //else if (c.Parent is HavokCommonArrayNode) // array = c.Parent as HavokCommonArrayNode; //if (array != null) //{ // //ResourceNode[] nodes = array.FindChildrenByClassType(null, typeof(HavokMetaObjectNode)); // //if (nodes != null && nodes.Length > 0) // continue; //} writer.WriteStartElement("hkobject"); writer.WriteAttributeString("name", GetObjectName(classIDs, c)); writer.WriteAttributeString("class", SwapName(c._className)); writer.WriteAttributeString("signature", GetSignature(c._className)); { c.WriteParams(writer, classIDs); } writer.WriteEndElement(); } } writer.WriteEndElement(); } } writer.WriteEndElement(); } writer.WriteEndDocument(); } } }