From dff9c8738e068e6468dcf60e649377f7aa23b528 Mon Sep 17 00:00:00 2001 From: dexy Date: Tue, 4 Feb 2020 05:08:51 +1100 Subject: [PATCH] YPT/XML conversion progress? --- .../GameFiles/Resources/Drawable.cs | 81 +++++++++++++++---- .../GameFiles/Resources/Particle.cs | 16 ++-- .../GameFiles/Resources/ResourceFile.cs | 2 +- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index b871a9c..7ef0045 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -4446,7 +4446,7 @@ namespace CodeWalker.GameFiles // structure data public ulong NamePointer { get; set; } public ResourceSimpleList64_s LightAttributes { get; set; } - public ulong ParticlesPointer { get; set; } // pointer in YPT files! TODO: investigate what it points to! + public ulong UnkPointer { get; set; } public ulong BoundPointer { get; set; } // reference data @@ -4466,7 +4466,7 @@ namespace CodeWalker.GameFiles // read structure data this.NamePointer = reader.ReadUInt64(); this.LightAttributes = reader.ReadBlock>(); - this.ParticlesPointer = reader.ReadUInt64(); + this.UnkPointer = reader.ReadUInt64(); this.BoundPointer = reader.ReadUInt64(); try @@ -4487,12 +4487,12 @@ namespace CodeWalker.GameFiles } } - catch (Exception ex) //sometimes error here for loading particles! different drawable type? base only? + catch (Exception ex) { ErrorMessage = ex.ToString(); } - if (ParticlesPointer != 0) + if (UnkPointer != 0) { } } public override void Write(ResourceDataWriter writer, params object[] parameters) @@ -4506,7 +4506,7 @@ namespace CodeWalker.GameFiles // write structure data writer.Write(this.NamePointer); writer.WriteBlock(this.LightAttributes); - writer.Write(this.ParticlesPointer); + writer.Write(this.UnkPointer); writer.Write(this.BoundPointer); } public override void WriteXml(StringBuilder sb, int indent, string ddsfolder) @@ -4574,7 +4574,60 @@ namespace CodeWalker.GameFiles } } - [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableBaseDictionary : ResourceFileBase + [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawablePtfx : DrawableBase + { + public override long BlockLength + { + get { return 176; } + } + + // structure data + public ulong UnkPointer { get; set; } + + + public override void Read(ResourceDataReader reader, params object[] parameters) + { + base.Read(reader, parameters); + + // read structure data + this.UnkPointer = reader.ReadUInt64(); + + if (UnkPointer != 0) + { } + } + public override void Write(ResourceDataWriter writer, params object[] parameters) + { + base.Write(writer, parameters); + + // write structure data + writer.Write(this.UnkPointer); + } + public override void WriteXml(StringBuilder sb, int indent, string ddsfolder) + { + base.WriteXml(sb, indent, ddsfolder); + } + public override void ReadXml(XmlNode node, string ddsfolder) + { + base.ReadXml(node, ddsfolder); + } + public static void WriteXmlNode(DrawablePtfx d, StringBuilder sb, int indent, string ddsfolder, string name = "Drawable") + { + if (d == null) return; + YdrXml.OpenTag(sb, indent, name); + d.WriteXml(sb, indent + 1, ddsfolder); + YdrXml.CloseTag(sb, indent, name); + } + public static DrawablePtfx ReadXmlNode(XmlNode node, string ddsfolder) + { + if (node == null) return null; + var d = new DrawablePtfx(); + d.ReadXml(node, ddsfolder); + return d; + } + + } + + [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawablePtfxDictionary : ResourceFileBase { public override long BlockLength { @@ -4596,7 +4649,7 @@ namespace CodeWalker.GameFiles // reference data //public ResourceSimpleArray Hashes { get; set; } public uint[] Hashes { get; set; } - public ResourcePointerArray64 Drawables { get; set; } + public ResourcePointerArray64 Drawables { get; set; } private ResourceSystemStructBlock HashesBlock = null;//only used for saving @@ -4620,7 +4673,7 @@ namespace CodeWalker.GameFiles // read reference data this.Hashes = reader.ReadUintsAt(this.HashesPointer, this.HashesCount1); - this.Drawables = reader.ReadBlockAt>(this.DrawablesPointer, this.DrawablesCount1); + this.Drawables = reader.ReadBlockAt>(this.DrawablesPointer, this.DrawablesCount1); //if (Unknown_10h != 0) //{ } @@ -4672,7 +4725,7 @@ namespace CodeWalker.GameFiles } public void ReadXml(XmlNode node, string ddsfolder) { - var drawables = new List(); + var drawables = new List(); var drawablehashes = new List(); var inodes = node.SelectNodes("Item"); @@ -4681,7 +4734,7 @@ namespace CodeWalker.GameFiles foreach (XmlNode inode in inodes) { var h = XmlMeta.GetHash(Xml.GetChildInnerText(inode, "Name")); - var d = new DrawableBase(); + var d = new DrawablePtfx(); d.ReadXml(inode, ddsfolder); drawables.Add(d); drawablehashes.Add(h); @@ -4689,20 +4742,20 @@ namespace CodeWalker.GameFiles } Hashes = drawablehashes.ToArray(); - Drawables = new ResourcePointerArray64(); + Drawables = new ResourcePointerArray64(); Drawables.data_items = drawables.ToArray(); } - public static void WriteXmlNode(DrawableBaseDictionary d, StringBuilder sb, int indent, string ddsfolder, string name = "DrawableDictionary") + public static void WriteXmlNode(DrawablePtfxDictionary d, StringBuilder sb, int indent, string ddsfolder, string name = "DrawableDictionary") { if (d == null) return; YddXml.OpenTag(sb, indent, name); d.WriteXml(sb, indent + 1, ddsfolder); YddXml.CloseTag(sb, indent, name); } - public static DrawableBaseDictionary ReadXmlNode(XmlNode node, string ddsfolder) + public static DrawablePtfxDictionary ReadXmlNode(XmlNode node, string ddsfolder) { if (node == null) return null; - var d = new DrawableBaseDictionary(); + var d = new DrawablePtfxDictionary(); d.ReadXml(node, ddsfolder); return d; } diff --git a/CodeWalker.Core/GameFiles/Resources/Particle.cs b/CodeWalker.Core/GameFiles/Resources/Particle.cs index f87809a..9d643e4 100644 --- a/CodeWalker.Core/GameFiles/Resources/Particle.cs +++ b/CodeWalker.Core/GameFiles/Resources/Particle.cs @@ -61,7 +61,7 @@ namespace CodeWalker.GameFiles // reference data public string_r Name { get; set; } public TextureDictionary TextureDictionary { get; set; } - public DrawableBaseDictionary DrawableDictionary { get; set; } + public DrawablePtfxDictionary DrawableDictionary { get; set; } public ParticleRuleDictionary ParticleRuleDictionary { get; set; } public ParticleEffectRuleDictionary EffectRuleDictionary { get; set; } public ParticleEmitterRuleDictionary EmitterRuleDictionary { get; set; } @@ -86,7 +86,7 @@ namespace CodeWalker.GameFiles // read reference data this.Name = reader.ReadBlockAt(this.NamePointer); this.TextureDictionary = reader.ReadBlockAt(this.TextureDictionaryPointer); - this.DrawableDictionary = reader.ReadBlockAt(this.DrawableDictionaryPointer); + this.DrawableDictionary = reader.ReadBlockAt(this.DrawableDictionaryPointer); this.ParticleRuleDictionary = reader.ReadBlockAt(this.ParticleRuleDictionaryPointer); this.EffectRuleDictionary = reader.ReadBlockAt(this.EmitterRuleDictionaryPointer); this.EmitterRuleDictionary = reader.ReadBlockAt(this.EffectRuleDictionaryPointer); @@ -150,7 +150,7 @@ namespace CodeWalker.GameFiles } if (DrawableDictionary != null) { - DrawableBaseDictionary.WriteXmlNode(DrawableDictionary, sb, indent, ddsfolder, "DrawableDictionary"); + DrawablePtfxDictionary.WriteXmlNode(DrawableDictionary, sb, indent, ddsfolder, "DrawableDictionary"); } if (TextureDictionary != null) { @@ -181,7 +181,7 @@ namespace CodeWalker.GameFiles var dnode = node.SelectSingleNode("DrawableDictionary"); if (dnode != null) { - DrawableDictionary = DrawableBaseDictionary.ReadXmlNode(dnode, ddsfolder); + DrawableDictionary = DrawablePtfxDictionary.ReadXmlNode(dnode, ddsfolder); } var tnode = node.SelectSingleNode("TextureDictionary"); if (tnode != null) @@ -221,7 +221,7 @@ namespace CodeWalker.GameFiles } } - var drwdict = new Dictionary(); + var drwdict = new Dictionary(); if (DrawableDictionary?.Drawables?.data_items != null) { var max = Math.Min(DrawableDictionary.Drawables.data_items.Length, (DrawableDictionary.Hashes?.Length ?? 0)); @@ -320,7 +320,7 @@ namespace CodeWalker.GameFiles { foreach (var pdrw in ptr.Drawables.data_items) { - if (drwdict.TryGetValue(pdrw.NameHash, out DrawableBase drw)) + if (drwdict.TryGetValue(pdrw.NameHash, out DrawablePtfx drw)) { pdrw.Drawable = drw; } @@ -1762,7 +1762,7 @@ namespace CodeWalker.GameFiles // reference data public string_r Name { get; set; } - public DrawableBase Drawable { get; set; } + public DrawablePtfx Drawable { get; set; } public override void Read(ResourceDataReader reader, params object[] parameters) { @@ -1779,7 +1779,7 @@ namespace CodeWalker.GameFiles // read reference data this.Name = reader.ReadBlockAt(this.NamePointer); - this.Drawable = reader.ReadBlockAt(this.DrawablePointer); + this.Drawable = reader.ReadBlockAt(this.DrawablePointer); if (!string.IsNullOrEmpty(Name?.Value)) { diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs b/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs index 5681e2d..65d9b2d 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceFile.cs @@ -44,7 +44,7 @@ namespace CodeWalker.GameFiles // structure data public uint FileVFT { get; set; } - public uint FileUnknown { get; set; } + public uint FileUnknown { get; set; } = 1; public ulong FilePagesInfoPointer { get; set; } // reference data