From 1f516a87b35e1820edcd680e87708a44e9f5e8d3 Mon Sep 17 00:00:00 2001 From: dexy Date: Sat, 14 Mar 2020 22:23:40 +1100 Subject: [PATCH] Changed DrawableModels into arrays and added DrawableModelsBlock --- .../GameFiles/Resources/Drawable.cs | 432 +++++++++++++----- .../GameFiles/Resources/ResourceBaseTypes.cs | 8 +- .../GameFiles/Resources/ResourceData.cs | 10 + CodeWalker.Core/Utils/FbxConverter.cs | 14 +- CodeWalker/Forms/ModelForm.cs | 35 +- CodeWalker/Forms/ModelMatForm.cs | 31 +- CodeWalker/PedsForm.cs | 10 +- CodeWalker/Rendering/Renderable.cs | 8 +- CodeWalker/VehicleForm.cs | 35 +- CodeWalker/World/WorldInfoForm.cs | 17 +- CodeWalker/WorldForm.cs | 29 +- 11 files changed, 422 insertions(+), 207 deletions(-) diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index 20f9e06..602c2b7 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -2035,7 +2035,233 @@ namespace CodeWalker.GameFiles + [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModelsBlock : ResourceSystemBlock + { + public override long BlockLength + { + get + { + long len = 0; + len += ListLength(High, len); + len += ListLength(Med, len); + len += ListLength(Low, len); + len += ListLength(VLow, len); + len += ListLength(Extra, len); + return len; + } + } + public DrawableBase Owner; + + public DrawableModel[] High { get; set; } + public DrawableModel[] Med { get; set; } + public DrawableModel[] Low { get; set; } + public DrawableModel[] VLow { get; set; } + public DrawableModel[] Extra { get; set; } //shouldn't be used + + public ResourcePointerListHeader HighHeader { get; set; } + public ResourcePointerListHeader MedHeader { get; set; } + public ResourcePointerListHeader LowHeader { get; set; } + public ResourcePointerListHeader VLowHeader { get; set; } + public ResourcePointerListHeader ExtraHeader { get; set; } + + public ulong[] HighPointers { get; set; } + public ulong[] MedPointers { get; set; } + public ulong[] LowPointers { get; set; } + public ulong[] VLowPointers { get; set; } + public ulong[] ExtraPointers { get; set; } + + + public override void Read(ResourceDataReader reader, params object[] parameters) + { + Owner = parameters[0] as DrawableBase; + var pos = (ulong)reader.Position; + var highPointer = (Owner?.DrawableModelsHighPointer ?? 0); + var medPointer = (Owner?.DrawableModelsMediumPointer ?? 0); + var lowPointer = (Owner?.DrawableModelsLowPointer ?? 0); + var vlowPointer = (Owner?.DrawableModelsVeryLowPointer ?? 0); + var extraPointer = (pos != highPointer) ? pos : 0; + + if (highPointer != 0) + { + HighHeader = reader.ReadStructAt((long)highPointer); + HighPointers = reader.ReadUlongsAt(HighHeader.Pointer, HighHeader.Capacity, false); + High = reader.ReadBlocks(HighPointers); + } + if (medPointer != 0) + { + MedHeader = reader.ReadStructAt((long)medPointer); + MedPointers = reader.ReadUlongsAt(MedHeader.Pointer, MedHeader.Capacity, false); + Med = reader.ReadBlocks(MedPointers); + } + if (lowPointer != 0) + { + LowHeader = reader.ReadStructAt((long)lowPointer); + LowPointers = reader.ReadUlongsAt(LowHeader.Pointer, LowHeader.Capacity, false); + Low = reader.ReadBlocks(LowPointers); + } + if (vlowPointer != 0) + { + VLowHeader = reader.ReadStructAt((long)vlowPointer); + VLowPointers = reader.ReadUlongsAt(VLowHeader.Pointer, VLowHeader.Capacity, false); + VLow = reader.ReadBlocks(VLowPointers); + } + if (extraPointer != 0) + { + ExtraHeader = reader.ReadStructAt((long)extraPointer); + ExtraPointers = reader.ReadUlongsAt(ExtraHeader.Pointer, ExtraHeader.Capacity, false); + Extra = reader.ReadBlocks(ExtraPointers); + } + } + + public override void Write(ResourceDataWriter writer, params object[] parameters) + { + + ResourcePointerListHeader makeHeader(ref long p, int c) + { + p += Pad(p); + var h = new ResourcePointerListHeader() { Pointer = (ulong)(p + 16), Count = (ushort)c, Capacity = (ushort)c }; + p += HeaderLength(c); + return h; + } + ulong[] makePointers(ref long p, DrawableModel[] a) + { + var ptrs = new ulong[a.Length]; + for (int i = 0; i < a.Length; i++) + { + p += Pad(p); + ptrs[i] = (ulong)p; + p += a[i].BlockLength; + } + return ptrs; + } + void write(ResourcePointerListHeader h, ulong[] p, DrawableModel[] a) + { + writer.WritePadding(16); + writer.WriteStruct(h); + writer.WriteUlongs(p); + for (int i = 0; i < a.Length; i++) + { + writer.WritePadding(16); + writer.WriteBlock(a[i]); + } + } + + var ptr = writer.Position; + if (High != null) + { + HighHeader = makeHeader(ref ptr, High.Length); + HighPointers = makePointers(ref ptr, High); + write(HighHeader, HighPointers, High); + } + if (Med != null) + { + MedHeader = makeHeader(ref ptr, Med.Length); + MedPointers = makePointers(ref ptr, Med); + write(MedHeader, MedPointers, Med); + } + if (Low != null) + { + LowHeader = makeHeader(ref ptr, Low.Length); + LowPointers = makePointers(ref ptr, Low); + write(LowHeader, LowPointers, Low); + } + if (VLow != null) + { + VLowHeader = makeHeader(ref ptr, VLow.Length); + VLowPointers = makePointers(ref ptr, VLow); + write(VLowHeader, VLowPointers, VLow); + } + if (Extra != null) + { + ExtraHeader = makeHeader(ref ptr, Extra.Length); + ExtraPointers = makePointers(ref ptr, Extra); + write(ExtraHeader, ExtraPointers, Extra); + } + + } + + + private long Pad(long o) => ((16 - (o % 16)) % 16); + private long HeaderLength(int listlength) => 16 + ((listlength) * 8); + private long ListLength(DrawableModel[] list, long o) + { + if (list == null) return 0; + long l = 0; + l += HeaderLength(list.Length); + foreach (var m in list) l += Pad(l) + m.BlockLength; + return Pad(o) + l; + } + + + public override Tuple[] GetParts() + { + var parts = new List>(); + parts.AddRange(base.GetParts()); + + void addParts(ref long p, DrawableModel[] a) + { + if (a == null) return; + p += Pad(p); + p += HeaderLength(a.Length); + foreach (var m in a) + { + p += Pad(p); + parts.Add(new Tuple(p, m)); + p += m.BlockLength; + } + } + + var ptr = (long)0; + addParts(ref ptr, High); + addParts(ref ptr, Med); + addParts(ref ptr, Low); + addParts(ref ptr, VLow); + addParts(ref ptr, Extra); + + return parts.ToArray(); + } + + + public long GetHighPointer() + { + if (High == null) return 0; + return FilePosition; + } + public long GetMedPointer() + { + if (Med == null) return 0; + var p = FilePosition; + p += ListLength(High, p); + p += Pad(p); + return p; + } + public long GetLowPointer() + { + if (Low == null) return 0; + var p = GetMedPointer(); + p += ListLength(Med, p); + p += Pad(p); + return p; + } + public long GetVLowPointer() + { + if (VLow == null) return 0; + var p = GetLowPointer(); + p += ListLength(Low, p); + p += Pad(p); + return p; + } + public long GetExtraPointer() + { + if (Extra == null) return 0; + var p = GetVLowPointer(); + p += ListLength(VLow, p); + p += Pad(p); + return p; + } + + } [TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModel : ResourceSystemBlock, IMetaXmlItem { @@ -2191,27 +2417,27 @@ namespace CodeWalker.GameFiles ////just testing! - + //var pos = (ulong)reader.Position; //var off = (ulong)0; - //if (ShaderMappingPointer != (pos+off)) + //if (ShaderMappingPointer != (pos + off)) //{ }//no hit //off += (ulong)(GeometriesCount1 * 2); //ShaderMapping //if (GeometriesCount1 == 1) off += 6; //else off += ((16 - (off % 16)) % 16); - //if (GeometriesPointer != (pos+off)) + //if (GeometriesPointer != (pos + off)) //{ }//no hit //off += (ulong)(GeometriesCount1 * 8); //Geometries pointers //off += ((16 - (off % 16)) % 16); - //if (BoundsPointer != (pos+off)) + //if (BoundsPointer != (pos + off)) //{ }//no hit //off += (ulong)((GeometriesCount1 + ((GeometriesCount1 > 1) ? 1 : 0)) * 32); //BoundsData - //if ((Geometries?.data_pointers != null) && (Geometries?.data_items != null)) + //if ((GeometryPointers != null) && (Geometries != null)) //{ // for (int i = 0; i < GeometriesCount1; i++) // { - // var geomptr = Geometries.data_pointers[i]; - // var geom = Geometries.data_items[i]; + // var geomptr = GeometryPointers[i]; + // var geom = Geometries[i]; // if (geom != null) // { // off += ((16 - (off % 16)) % 16); @@ -3902,7 +4128,7 @@ namespace CodeWalker.GameFiles public ushort Unknown_98h { get; set; } // 0x0000 public ushort Unknown_9Ah { get; set; } public uint Unknown_9Ch { get; set; } // 0x00000000 - public ulong DrawableModelsXPointer { get; set; } + public ulong DrawableModelsPointer { get; set; } public byte FlagsHigh { @@ -3949,12 +4175,9 @@ namespace CodeWalker.GameFiles // reference data public ShaderGroup ShaderGroup { get; set; } public Skeleton Skeleton { get; set; } - public ResourcePointerList64 DrawableModelsHigh { get; set; } - public ResourcePointerList64 DrawableModelsMedium { get; set; } - public ResourcePointerList64 DrawableModelsLow { get; set; } - public ResourcePointerList64 DrawableModelsVeryLow { get; set; } public Joints Joints { get; set; } - public ResourcePointerList64 DrawableModelsX { get; set; } + public DrawableModelsBlock DrawableModels { get; set; } + public DrawableModel[] AllModels { get; set; } public Dictionary VertexDecls { get; set; } @@ -4014,45 +4237,60 @@ namespace CodeWalker.GameFiles this.Unknown_98h = reader.ReadUInt16(); this.Unknown_9Ah = reader.ReadUInt16(); this.Unknown_9Ch = reader.ReadUInt32(); - this.DrawableModelsXPointer = reader.ReadUInt64(); + this.DrawableModelsPointer = reader.ReadUInt64(); // read reference data - this.ShaderGroup = reader.ReadBlockAt( - this.ShaderGroupPointer // offset - ); - this.Skeleton = reader.ReadBlockAt( - this.SkeletonPointer // offset - ); - this.DrawableModelsHigh = reader.ReadBlockAt>( - this.DrawableModelsHighPointer // offset - ); - this.DrawableModelsMedium = reader.ReadBlockAt>( - this.DrawableModelsMediumPointer // offset - ); - this.DrawableModelsLow = reader.ReadBlockAt>( - this.DrawableModelsLowPointer // offset - ); - this.DrawableModelsVeryLow = reader.ReadBlockAt>( - this.DrawableModelsVeryLowPointer // offset - ); - this.Joints = reader.ReadBlockAt( - this.JointsPointer // offset - ); - this.DrawableModelsX = reader.ReadBlockAt>( - this.DrawableModelsXPointer // offset - ); + this.ShaderGroup = reader.ReadBlockAt(this.ShaderGroupPointer); + this.Skeleton = reader.ReadBlockAt(this.SkeletonPointer); + this.Joints = reader.ReadBlockAt(this.JointsPointer); + this.DrawableModels = reader.ReadBlockAt(this.DrawableModelsPointer, this); BuildAllModels(); BuildVertexDecls(); - AssignGeometryShaders(ShaderGroup); - - - ////just testing!!! + + //long pad(long o) => ((16 - (o % 16)) % 16); + //long listlength(DrawableModel[] list) + //{ + // long l = 16; + // l += (list.Length) * 8; + // foreach (var m in list) l += pad(l) + m.BlockLength; + // return l; + //} + //var ptr = (long)DrawableModelsPointer; + //if (DrawableModels?.High != null) + //{ + // if (ptr != (long)DrawableModelsHighPointer) + // { }//no hit + // ptr += listlength(DrawableModels?.High); + //} + //if (DrawableModels?.Med != null) + //{ + // ptr += pad(ptr); + // if (ptr != (long)DrawableModelsMediumPointer) + // { }//no hit + // ptr += listlength(DrawableModels?.Med); + //} + //if (DrawableModels?.Low != null) + //{ + // ptr += pad(ptr); + // if (ptr != (long)DrawableModelsLowPointer) + // { }//no hit + // ptr += listlength(DrawableModels?.Low); + //} + //if (DrawableModels?.VLow != null) + //{ + // ptr += pad(ptr); + // if (ptr != (long)DrawableModelsVeryLowPointer) + // { }//no hit + // ptr += listlength(DrawableModels?.VLow); + //} + + //switch (Unknown_3Ch) //{ // case 0x7f800001: @@ -4242,12 +4480,12 @@ namespace CodeWalker.GameFiles // update structure data this.ShaderGroupPointer = (ulong)(this.ShaderGroup != null ? this.ShaderGroup.FilePosition : 0); this.SkeletonPointer = (ulong)(this.Skeleton != null ? this.Skeleton.FilePosition : 0); - this.DrawableModelsHighPointer = (ulong)(this.DrawableModelsHigh != null ? this.DrawableModelsHigh.FilePosition : 0); - this.DrawableModelsMediumPointer = (ulong)(this.DrawableModelsMedium != null ? this.DrawableModelsMedium.FilePosition : 0); - this.DrawableModelsLowPointer = (ulong)(this.DrawableModelsLow != null ? this.DrawableModelsLow.FilePosition : 0); - this.DrawableModelsVeryLowPointer = (ulong)(this.DrawableModelsVeryLow != null ? this.DrawableModelsVeryLow.FilePosition : 0); + this.DrawableModelsHighPointer = (ulong)(DrawableModels?.GetHighPointer() ?? 0); + this.DrawableModelsMediumPointer = (ulong)(DrawableModels?.GetMedPointer() ?? 0); + this.DrawableModelsLowPointer = (ulong)(DrawableModels?.GetLowPointer() ?? 0); + this.DrawableModelsVeryLowPointer = (ulong)(DrawableModels?.GetVLowPointer() ?? 0); this.JointsPointer = (ulong)(this.Joints != null ? this.Joints.FilePosition : 0); - this.DrawableModelsXPointer = (ulong)(this.DrawableModelsX != null ? this.DrawableModelsX.FilePosition : 0); + this.DrawableModelsPointer = (ulong)(DrawableModels?.FilePosition ?? 0); // write structure data writer.Write(this.ShaderGroupPointer); @@ -4274,7 +4512,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_98h); writer.Write(this.Unknown_9Ah); writer.Write(this.Unknown_9Ch); - writer.Write(this.DrawableModelsXPointer); + writer.Write(this.DrawableModelsPointer); } public virtual void WriteXml(StringBuilder sb, int indent, string ddsfolder) { @@ -4309,25 +4547,25 @@ namespace CodeWalker.GameFiles Joints.WriteXml(sb, indent + 1); YdrXml.CloseTag(sb, indent, "Joints"); } - if (DrawableModelsHigh?.data_items != null) + if (DrawableModels?.High != null) { - YdrXml.WriteItemArray(sb, DrawableModelsHigh.data_items, indent, "DrawableModelsHigh"); + YdrXml.WriteItemArray(sb, DrawableModels.High, indent, "DrawableModelsHigh"); } - if (DrawableModelsMedium?.data_items != null) + if (DrawableModels?.Med != null) { - YdrXml.WriteItemArray(sb, DrawableModelsMedium.data_items, indent, "DrawableModelsMedium"); + YdrXml.WriteItemArray(sb, DrawableModels.Med, indent, "DrawableModelsMedium"); } - if (DrawableModelsLow?.data_items != null) + if (DrawableModels?.Low != null) { - YdrXml.WriteItemArray(sb, DrawableModelsLow.data_items, indent, "DrawableModelsLow"); + YdrXml.WriteItemArray(sb, DrawableModels.Low, indent, "DrawableModelsLow"); } - if (DrawableModelsVeryLow?.data_items != null) + if (DrawableModels?.VLow != null) { - YdrXml.WriteItemArray(sb, DrawableModelsVeryLow.data_items, indent, "DrawableModelsVeryLow"); + YdrXml.WriteItemArray(sb, DrawableModels.VLow, indent, "DrawableModelsVeryLow"); } - if ((DrawableModelsX?.data_items != null) && (DrawableModelsX != DrawableModelsHigh))//is this right? duplicates..? + if (DrawableModels?.Extra != null)//is this right? duplicates..? { - YdrXml.WriteItemArray(sb, DrawableModelsX.data_items, indent, "DrawableModelsX"); + YdrXml.WriteItemArray(sb, DrawableModels.Extra, indent, "DrawableModelsX"); } } public virtual void ReadXml(XmlNode node, string ddsfolder) @@ -4363,39 +4601,15 @@ namespace CodeWalker.GameFiles Joints = new Joints(); Joints.ReadXml(jnode); } - var dmhigh = XmlMeta.ReadItemArray(node, "DrawableModelsHigh"); - if (dmhigh != null) + this.DrawableModels = new DrawableModelsBlock(); + this.DrawableModels.High = XmlMeta.ReadItemArray(node, "DrawableModelsHigh"); + this.DrawableModels.Med = XmlMeta.ReadItemArray(node, "DrawableModelsMedium"); + this.DrawableModels.Low = XmlMeta.ReadItemArray(node, "DrawableModelsLow"); + this.DrawableModels.VLow = XmlMeta.ReadItemArray(node, "DrawableModelsVeryLow"); + this.DrawableModels.Extra = XmlMeta.ReadItemArray(node, "DrawableModelsX"); + if (DrawableModels.BlockLength == 0) { - DrawableModelsHigh = new ResourcePointerList64(); - DrawableModelsHigh.data_items = dmhigh; - } - var dmmed = XmlMeta.ReadItemArray(node, "DrawableModelsMedium"); - if (dmmed != null) - { - DrawableModelsMedium = new ResourcePointerList64(); - DrawableModelsMedium.data_items = dmmed; - } - var dmlow = XmlMeta.ReadItemArray(node, "DrawableModelsLow"); - if (dmlow != null) - { - DrawableModelsLow = new ResourcePointerList64(); - DrawableModelsLow.data_items = dmlow; - } - var dmvlow = XmlMeta.ReadItemArray(node, "DrawableModelsVeryLow"); - if (dmvlow != null) - { - DrawableModelsVeryLow = new ResourcePointerList64(); - DrawableModelsVeryLow.data_items = dmvlow; - } - var dmx = XmlMeta.ReadItemArray(node, "DrawableModelsX"); - if (dmx != null) - { - DrawableModelsX = new ResourcePointerList64(); - DrawableModelsX.data_items = dmx; - } - else - { - DrawableModelsX = DrawableModelsHigh; + DrawableModels = null; } BuildRenderMasks(); @@ -4410,12 +4624,8 @@ namespace CodeWalker.GameFiles var list = new List(base.GetReferences()); if (ShaderGroup != null) list.Add(ShaderGroup); if (Skeleton != null) list.Add(Skeleton); - if (DrawableModelsHigh != null) list.Add(DrawableModelsHigh); - if (DrawableModelsMedium != null) list.Add(DrawableModelsMedium); - if (DrawableModelsLow != null) list.Add(DrawableModelsLow); - if (DrawableModelsVeryLow != null) list.Add(DrawableModelsVeryLow); if (Joints != null) list.Add(Joints); - if (DrawableModelsX != null) list.Add(DrawableModelsX); + if (DrawableModels != null) list.Add(DrawableModels); return list.ToArray(); } @@ -4455,14 +4665,11 @@ namespace CodeWalker.GameFiles public void BuildAllModels() { var allModels = new List(); - if (DrawableModelsHigh != null) allModels.AddRange(DrawableModelsHigh.data_items); - if (DrawableModelsMedium != null) allModels.AddRange(DrawableModelsMedium.data_items); - if (DrawableModelsLow != null) allModels.AddRange(DrawableModelsLow.data_items); - if (DrawableModelsVeryLow != null) allModels.AddRange(DrawableModelsVeryLow.data_items); - if ((DrawableModelsX != null) && (DrawableModelsX != DrawableModelsHigh)) - { - allModels.AddRange(DrawableModelsX.data_items); - } + if (DrawableModels?.High != null) allModels.AddRange(DrawableModels.High); + if (DrawableModels?.Med != null) allModels.AddRange(DrawableModels.Med); + if (DrawableModels?.Low != null) allModels.AddRange(DrawableModels.Low); + if (DrawableModels?.VLow != null) allModels.AddRange(DrawableModels.VLow); + if (DrawableModels?.Extra != null) allModels.AddRange(DrawableModels.Extra); AllModels = allModels.ToArray(); } @@ -4495,10 +4702,10 @@ namespace CodeWalker.GameFiles public void BuildRenderMasks() { - var hmask = BuildRenderMask(DrawableModelsHigh?.data_items); - var mmask = BuildRenderMask(DrawableModelsMedium?.data_items); - var lmask = BuildRenderMask(DrawableModelsLow?.data_items); - var vmask = BuildRenderMask(DrawableModelsVeryLow?.data_items); + var hmask = BuildRenderMask(DrawableModels?.High); + var mmask = BuildRenderMask(DrawableModels?.Med); + var lmask = BuildRenderMask(DrawableModels?.Low); + var vmask = BuildRenderMask(DrawableModels?.VLow); ////just testing //if (hmask != RenderMaskHigh) @@ -4574,11 +4781,12 @@ namespace CodeWalker.GameFiles r.Unknown_9Ah = Unknown_9Ah; r.ShaderGroup = ShaderGroup; r.Skeleton = Skeleton?.Clone(); - r.DrawableModelsHigh = DrawableModelsHigh; - r.DrawableModelsMedium = DrawableModelsMedium; - r.DrawableModelsLow = DrawableModelsLow; - r.DrawableModelsVeryLow = DrawableModelsVeryLow; - r.DrawableModelsX = DrawableModelsX; + r.DrawableModels = new DrawableModelsBlock(); + r.DrawableModels.High = DrawableModels?.High; + r.DrawableModels.Med = DrawableModels?.Med; + r.DrawableModels.Low = DrawableModels?.Low; + r.DrawableModels.VLow = DrawableModels?.VLow; + r.DrawableModels.Extra = DrawableModels?.Extra; r.Joints = Joints; r.AllModels = AllModels; r.VertexDecls = VertexDecls; diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs b/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs index cd062b3..22e3d63 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceBaseTypes.cs @@ -1722,7 +1722,13 @@ namespace CodeWalker.GameFiles } - + [TypeConverter(typeof(ExpandableObjectConverter))] public struct ResourcePointerListHeader + { + public ulong Pointer { get; set; } + public ushort Count { get; set; } + public ushort Capacity { get; set; } + public uint Unknown { get; set; } + } diff --git a/CodeWalker.Core/GameFiles/Resources/ResourceData.cs b/CodeWalker.Core/GameFiles/Resources/ResourceData.cs index b239708..4449427 100644 --- a/CodeWalker.Core/GameFiles/Resources/ResourceData.cs +++ b/CodeWalker.Core/GameFiles/Resources/ResourceData.cs @@ -572,6 +572,16 @@ namespace CodeWalker.GameFiles if (pad > 0) Write(new byte[pad]); } + public void WriteUlongs(ulong[] val) + { + if (val == null) return; + foreach (var v in val) + { + Write(v); + } + } + + } diff --git a/CodeWalker.Core/Utils/FbxConverter.cs b/CodeWalker.Core/Utils/FbxConverter.cs index 8aeb369..af51266 100644 --- a/CodeWalker.Core/Utils/FbxConverter.cs +++ b/CodeWalker.Core/Utils/FbxConverter.cs @@ -167,34 +167,30 @@ namespace CodeWalker d.Unknown_9Ah = 33;//WTF is this??? d.FileVFT = 1079446584; d.FileUnknown = 1; + d.DrawableModels = new DrawableModelsBlock(); if (mlHigh.Count > 0) { - d.DrawableModelsHigh = new ResourcePointerList64(); - d.DrawableModelsHigh.data_items = mlHigh.ToArray(); + d.DrawableModels.High = mlHigh.ToArray(); d.FlagsHigh = 1;//what flags should be used?? } if (mlMed.Count > 0) { - d.DrawableModelsMedium = new ResourcePointerList64(); - d.DrawableModelsMedium.data_items = mlMed.ToArray(); + d.DrawableModels.Med = mlMed.ToArray(); d.LodDistHigh = bsRad * 2.0f; //when med models present, generate a high lod dist.. d.FlagsMed = 1; } if (mlLow.Count > 0) { - d.DrawableModelsLow = new ResourcePointerList64(); - d.DrawableModelsLow.data_items = mlLow.ToArray(); + d.DrawableModels.Low = mlLow.ToArray(); d.LodDistMed = bsRad * 8.0f; //when low models present, generate a med lod dist.. d.FlagsLow = 1; } if (mlVlow.Count > 0) { - d.DrawableModelsVeryLow = new ResourcePointerList64(); - d.DrawableModelsVeryLow.data_items = mlVlow.ToArray(); + d.DrawableModels.VLow = mlVlow.ToArray(); d.LodDistLow = bsRad * 32.0f; //when vlow models present, generate a low lod dist.. d.FlagsVlow = 1; } - d.DrawableModelsX = d.DrawableModelsHigh; d.BuildRenderMasks(); diff --git a/CodeWalker/Forms/ModelForm.cs b/CodeWalker/Forms/ModelForm.cs index e7da035..006bc0f 100644 --- a/CodeWalker/Forms/ModelForm.cs +++ b/CodeWalker/Forms/ModelForm.cs @@ -964,11 +964,11 @@ namespace CodeWalker.Forms TexturesTreeView.Nodes.Clear(); if (drawable != null) { - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false); + //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false); var fdrawable = drawable as FragDrawable; if (fdrawable != null) @@ -984,10 +984,10 @@ namespace CodeWalker.Forms if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel var dname = child.GroupName; - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail", true); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail", false); } } } @@ -1070,23 +1070,22 @@ namespace CodeWalker.Forms dnode.Tag = drawable; dnode.Checked = check; - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false, dnode); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode); + //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode); } - private void AddDrawableModelsTreeNodes(ResourcePointerList64 models, string prefix, bool check, TreeNode parentDrawableNode = null) + private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null) { if (models == null) return; - if (models.data_items == null) return; - for (int mi = 0; mi < models.data_items.Length; mi++) + for (int mi = 0; mi < models.Length; mi++) { var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes; - var model = models.data_items[mi]; + var model = models[mi]; string mprefix = prefix + " " + (mi + 1).ToString(); var mnode = tnc.Add(mprefix + " " + model.ToString()); mnode.Tag = model; diff --git a/CodeWalker/Forms/ModelMatForm.cs b/CodeWalker/Forms/ModelMatForm.cs index 2c83c32..2241927 100644 --- a/CodeWalker/Forms/ModelMatForm.cs +++ b/CodeWalker/Forms/ModelMatForm.cs @@ -36,10 +36,10 @@ namespace CodeWalker.Forms ModelsTreeView.ShowRootLines = false; if (drawable != null) { - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail"); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail"); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail"); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail"); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail"); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail"); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail"); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail"); var fdrawable = drawable as FragDrawable; if (fdrawable != null) @@ -55,10 +55,10 @@ namespace CodeWalker.Forms if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel var dname = child.GroupName; - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail"); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail"); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail"); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail"); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail"); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail"); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail"); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail"); } } } @@ -82,26 +82,25 @@ namespace CodeWalker.Forms var dnode = ModelsTreeView.Nodes.Add(mhash.ToString()); dnode.Tag = drawable; - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", dnode); dnode.Expand(); } } } - private void AddDrawableModelsTreeNodes(ResourcePointerList64 models, string prefix, TreeNode parentDrawableNode = null) + private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, TreeNode parentDrawableNode = null) { if (models == null) return; - if (models.data_items == null) return; - for (int mi = 0; mi < models.data_items.Length; mi++) + for (int mi = 0; mi < models.Length; mi++) { var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes; - var model = models.data_items[mi]; + var model = models[mi]; string mprefix = prefix + " " + (mi + 1).ToString(); var mnode = tnc.Add(mprefix + " " + model.ToString()); mnode.Tag = model; diff --git a/CodeWalker/PedsForm.cs b/CodeWalker/PedsForm.cs index b7c417c..af8959b 100644 --- a/CodeWalker/PedsForm.cs +++ b/CodeWalker/PedsForm.cs @@ -515,11 +515,11 @@ namespace CodeWalker dnode.Tag = drawable; dnode.Checked = check; - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh?.data_items, "High Detail", true, dnode, tnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium?.data_items, "Medium Detail", false, dnode, tnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow?.data_items, "Low Detail", false, dnode, tnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow?.data_items, "Very Low Detail", false, dnode, tnode); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode, tnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode, tnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode, tnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode, tnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode, tnode); + //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode, tnode); } private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null, TreeNode parentTextureNode = null) diff --git a/CodeWalker/Rendering/Renderable.cs b/CodeWalker/Rendering/Renderable.cs index f5ed7cd..ae732c7 100644 --- a/CodeWalker/Rendering/Renderable.cs +++ b/CodeWalker/Rendering/Renderable.cs @@ -101,10 +101,10 @@ namespace CodeWalker.Rendering DataSize = 0; - var hd = Key.DrawableModelsHigh?.data_items ?? Key.AllModels; - var med = Key.DrawableModelsMedium?.data_items; - var low = Key.DrawableModelsLow?.data_items; - var vlow = Key.DrawableModelsVeryLow?.data_items; + var hd = Key.DrawableModels?.High ?? Key.AllModels; + var med = Key.DrawableModels?.Med; + var low = Key.DrawableModels?.Low; + var vlow = Key.DrawableModels?.VLow; int totmodels = (hd?.Length ?? 0) + (med?.Length ?? 0) + (low?.Length ?? 0) + (vlow?.Length ?? 0); int curmodel = hd?.Length ?? 0; AllModels = new RenderableModel[totmodels]; diff --git a/CodeWalker/VehicleForm.cs b/CodeWalker/VehicleForm.cs index 3ebfffb..0762739 100644 --- a/CodeWalker/VehicleForm.cs +++ b/CodeWalker/VehicleForm.cs @@ -461,23 +461,22 @@ namespace CodeWalker dnode.Tag = drawable; dnode.Checked = check; - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false, dnode); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false, dnode); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode); + //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode); } - private void AddDrawableModelsTreeNodes(ResourcePointerList64 models, string prefix, bool check, TreeNode parentDrawableNode = null) + private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null) { if (models == null) return; - if (models.data_items == null) return; - for (int mi = 0; mi < models.data_items.Length; mi++) + for (int mi = 0; mi < models.Length; mi++) { var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes; - var model = models.data_items[mi]; + var model = models[mi]; string mprefix = prefix + " " + (mi + 1).ToString(); var mnode = tnc.Add(mprefix + " " + model.ToString()); mnode.Tag = model; @@ -632,11 +631,11 @@ namespace CodeWalker TexturesTreeView.Nodes.Clear(); if (drawable != null) { - AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true); - AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false); - AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false); - AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false); + AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false); + //AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false); var fdrawable = drawable as FragDrawable; @@ -653,10 +652,10 @@ namespace CodeWalker if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel var dname = child.GroupName; - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false); - AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail", true); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail", false); + AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail", false); } } } diff --git a/CodeWalker/World/WorldInfoForm.cs b/CodeWalker/World/WorldInfoForm.cs index 024f94f..bf31491 100644 --- a/CodeWalker/World/WorldInfoForm.cs +++ b/CodeWalker/World/WorldInfoForm.cs @@ -75,11 +75,11 @@ namespace CodeWalker.World HierarchyTreeView.Nodes.Clear(); if (item.Drawable != null) { - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsHigh, "High Detail", true); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsMedium, "Medium Detail", false); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsLow, "Low Detail", false); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsVeryLow, "Very Low Detail", false); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.High, "High Detail", true); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Med, "Medium Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Low, "Low Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.VLow, "Very Low Detail", false); + //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Extra, "X Detail", false); } if (item.EntityDef != null) @@ -201,14 +201,13 @@ namespace CodeWalker.World } } - private void AddSelectionDrawableModelsTreeNodes(ResourcePointerList64 models, string prefix, bool check) + private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check) { if (models == null) return; - if (models.data_items == null) return; - for (int mi = 0; mi < models.data_items.Length; mi++) + for (int mi = 0; mi < models.Length; mi++) { - var model = models.data_items[mi]; + var model = models[mi]; string mprefix = prefix + " " + (mi + 1).ToString(); var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString()); mnode.Tag = model; diff --git a/CodeWalker/WorldForm.cs b/CodeWalker/WorldForm.cs index efacb9d..5ef0602 100644 --- a/CodeWalker/WorldForm.cs +++ b/CodeWalker/WorldForm.cs @@ -2401,14 +2401,14 @@ namespace CodeWalker bool usegeomboxes = SelectByGeometry; - var dmodels = drawable.DrawableModelsHigh; - if((dmodels==null)||(dmodels.data_items==null)) + var dmodels = drawable.DrawableModels?.High; + if (dmodels == null) { usegeomboxes = false; } if (usegeomboxes) { - for (int i = 0; i < dmodels.data_items.Length; i++) + for (int i = 0; i < dmodels.Length; i++) { - var m = dmodels.data_items[i]; + var m = dmodels[i]; if (m.BoundsData == null) { usegeomboxes = false; break; } } @@ -2428,9 +2428,9 @@ namespace CodeWalker { //geometry bounding boxes version float ghitdist = float.MaxValue; - for (int i = 0; i < dmodels.data_items.Length; i++) + for (int i = 0; i < dmodels.Length; i++) { - var m = dmodels.data_items[i]; + var m = dmodels[i]; int gbbcount = m.BoundsData.Length; for (int j = 0; j < gbbcount; j++) //first box seems to be whole model { @@ -3538,11 +3538,11 @@ namespace CodeWalker SelDrawableTexturesTreeView.Nodes.Clear(); if (item.Drawable != null) { - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsHigh, "High Detail", true); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsMedium, "Medium Detail", false); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsLow, "Low Detail", false); - AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsVeryLow, "Very Low Detail", false); - //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.High, "High Detail", true); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Med, "Medium Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Low, "Low Detail", false); + AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.VLow, "Very Low Detail", false); + //AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Extra, "X Detail", false); } @@ -3765,14 +3765,13 @@ namespace CodeWalker } } } - private void AddSelectionDrawableModelsTreeNodes(ResourcePointerList64 models, string prefix, bool check) + private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check) { if (models == null) return; - if (models.data_items == null) return; - for (int mi = 0; mi < models.data_items.Length; mi++) + for (int mi = 0; mi < models.Length; mi++) { - var model = models.data_items[mi]; + var model = models[mi]; string mprefix = prefix + " " + (mi + 1).ToString(); var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString()); mnode.Tag = model;