From f0128223efc98ac5f2300ae14b07bfab2bcfb0c0 Mon Sep 17 00:00:00 2001 From: dexy Date: Mon, 28 Jan 2019 13:13:45 +1100 Subject: [PATCH] Added Save methods to YdrFile and YddFile --- .../GameFiles/FileTypes/YddFile.cs | 7 + .../GameFiles/FileTypes/YdrFile.cs | 7 + CodeWalker.Core/GameFiles/GameFileCache.cs | 109 +++++ .../GameFiles/Resources/Drawable.cs | 421 ++++++++++-------- 4 files changed, 364 insertions(+), 180 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs index 6987892..ebd63e2 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YddFile.cs @@ -85,5 +85,12 @@ namespace CodeWalker.GameFiles } + public byte[] Save() + { + byte[] data = ResourceBuilder.Build(DrawableDict, 165); //ydd is type/version 165... + + return data; + } + } } diff --git a/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs index 900646d..f472085 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YdrFile.cs @@ -49,6 +49,13 @@ namespace CodeWalker.GameFiles } + public byte[] Save() + { + byte[] data = ResourceBuilder.Build(Drawable, 165); //ydr is type/version 165... + + return data; + } + } diff --git a/CodeWalker.Core/GameFiles/GameFileCache.cs b/CodeWalker.Core/GameFiles/GameFileCache.cs index 1ad9ec5..4316a2a 100644 --- a/CodeWalker.Core/GameFiles/GameFileCache.cs +++ b/CodeWalker.Core/GameFiles/GameFileCache.cs @@ -179,6 +179,8 @@ namespace CodeWalker.GameFiles //TestYcds(); //TestYtds(); //TestYbns(); + //TestYdrs(); + //TestYdds(); //TestYmaps(); //TestPlacements(); //TestDrawables(); @@ -3062,6 +3064,113 @@ namespace CodeWalker.GameFiles + } + } + } + //catch (Exception ex) + //{ + // UpdateStatus("Error! " + ex.ToString()); + //} + } + } + if (errorfiles.Count > 0) + { } + } + public void TestYdrs() + { + var errorfiles = new List(); + foreach (RpfFile file in AllRpfs) + { + foreach (RpfEntry entry in file.AllEntries) + { + //try + { + if (entry.NameLower.EndsWith(".ydr")) + { + UpdateStatus(string.Format(entry.Path)); + YdrFile ydr = null; + try + { + ydr = RpfMan.GetFile(entry); + } + catch (Exception ex) + { + UpdateStatus("Error! " + ex.ToString()); + errorfiles.Add(entry); + } + if ((ydr != null) && (ydr.Drawable != null)) + { + var fentry = entry as RpfFileEntry; + if (fentry == null) + { continue; } //shouldn't happen + + var bytes = ydr.Save(); + + string origlen = TextUtil.GetBytesReadable(fentry.FileSize); + string bytelen = TextUtil.GetBytesReadable(bytes.Length); + + var ydr2 = new YdrFile(); + RpfFile.LoadResourceFile(ydr2, bytes, 165); + + if (ydr2.Drawable == null) + { continue; } + if (ydr2.Drawable.AllModels?.Length != ydr.Drawable.AllModels?.Length) + { continue; } + + } + } + } + //catch (Exception ex) + //{ + // UpdateStatus("Error! " + ex.ToString()); + //} + } + } + if (errorfiles.Count > 0) + { } + } + public void TestYdds() + { + var errorfiles = new List(); + foreach (RpfFile file in AllRpfs) + { + foreach (RpfEntry entry in file.AllEntries) + { + //try + { + if (entry.NameLower.EndsWith(".ydd")) + { + UpdateStatus(string.Format(entry.Path)); + YddFile ydd = null; + try + { + ydd = RpfMan.GetFile(entry); + } + catch (Exception ex) + { + UpdateStatus("Error! " + ex.ToString()); + errorfiles.Add(entry); + } + if ((ydd != null) && (ydd.DrawableDict != null)) + { + var fentry = entry as RpfFileEntry; + if (fentry == null) + { continue; } //shouldn't happen + + var bytes = ydd.Save(); + + string origlen = TextUtil.GetBytesReadable(fentry.FileSize); + string bytelen = TextUtil.GetBytesReadable(bytes.Length); + + + var ydd2 = new YddFile(); + RpfFile.LoadResourceFile(ydd2, bytes, 165); + + if (ydd2.DrawableDict == null) + { continue; } + if (ydd2.DrawableDict.Drawables?.Count != ydd.DrawableDict.Drawables?.Count) + { continue; } + } } } diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index 32f945a..49d9848 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -77,7 +77,8 @@ namespace CodeWalker.GameFiles // update structure data this.TextureDictionaryPointer = (ulong)(this.TextureDictionary != null ? this.TextureDictionary.FilePosition : 0); this.ShadersPointer = (ulong)(this.Shaders != null ? this.Shaders.FilePosition : 0); - // this.ShadersCount1 = (ushort)(this.Shaders != null ? this.Shaders.Count : 0); + this.ShadersCount1 = (ushort)(this.Shaders != null ? this.Shaders.Count : 0); + this.ShadersCount2 = this.ShadersCount1; // write structure data writer.Write(this.VFT); @@ -161,17 +162,6 @@ namespace CodeWalker.GameFiles this.Unknown_2Ch = reader.ReadUInt32(); // read reference data - //this.Parameters = reader.ReadBlockAt>( - // this.ParametersPointer, // offset - // this.ParameterCount - //); - //this.ParameterHashes = reader.ReadBlockAt>( - // this.ParametersPointer, // offset - // this.ParameterCount, - // this.TextureParametersCount - //); - - this.ParametersList = reader.ReadBlockAt( this.ParametersPointer, // offset this.ParameterCount @@ -185,8 +175,7 @@ namespace CodeWalker.GameFiles { // update structure data this.ParametersPointer = (ulong)(this.ParametersList != null ? this.ParametersList.FilePosition : 0); - //this.ParametersPointer = (ulong)(this.Parameters != null ? this.Parameters.Position : 0); - //this.ParameterCount = (byte)(this.Parameters != null ? this.Parameters.Count : 0); + this.ParameterCount = (byte)(this.ParametersList != null ? this.ParametersList.Count : 0); // write structure data writer.Write(this.ParametersPointer); @@ -213,7 +202,6 @@ namespace CodeWalker.GameFiles { var list = new List(); if (ParametersList != null) list.Add(ParametersList); - // if (ParameterHashes != null) list.Add(ParameterHashes); return list.ToArray(); } @@ -313,19 +301,22 @@ namespace CodeWalker.GameFiles public ShaderParameter[] Parameters { get; set; } public MetaName[] Hashes { get; set; } + public int Count { get; set; } + + private ResourceSystemStructBlock[] ParameterDataBlocks = null; public override void Read(ResourceDataReader reader, params object[] parameters) { - int cnt = Convert.ToInt32(parameters[0]); + Count = Convert.ToInt32(parameters[0]); var paras = new List(); - for (int i = 0; i < cnt; i++) + for (int i = 0; i < Count; i++) { paras.Add(reader.ReadBlock()); } int offset = 0; - for (int i = 0; i < cnt; i++) + for (int i = 0; i < Count; i++) { var p = paras[i]; @@ -334,50 +325,24 @@ namespace CodeWalker.GameFiles { case 0: offset += 0; - p.Data = reader.ReadBlockAt( - p.DataPointer // offset - ); + p.Data = reader.ReadBlockAt(p.DataPointer); break; case 1: offset += 16; - //p.Data = reader.ReadBlockAt( - // p.DataPointer // offset - //); - p.Data = reader.ReadStructAt( - (long)p.DataPointer // offset - ); - + p.Data = reader.ReadStructAt((long)p.DataPointer); break; - //case 2: - // offset += 32; - // p.Data = reader.ReadBlockAt>( - // p.DataPointer, // offset - // 2 - // ); - // break; - //case 4: - // offset += 64; - // p.Data = reader.ReadBlockAt>( - // p.DataPointer, // offset - // 4 - // ); - // break; - default: offset += 16 * p.DataType; - //p.Data = reader.ReadBlockAt>( - // p.DataPointer, // offset - // p.DataType - // ); p.Data = reader.ReadStructsAt(p.DataPointer, p.DataType); - break; } } - reader.Position += offset; + + reader.Position += offset; //Vector4 data gets embedded here... but why pointers in params also??? + var hashes = new List(); - for (int i = 0; i < cnt; i++) + for (int i = 0; i < Count; i++) { hashes.Add((MetaName)reader.ReadUInt32()); } @@ -389,7 +354,6 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { - //TODO: fix all this // update pointers... //foreach (var f in Parameters) @@ -397,6 +361,27 @@ namespace CodeWalker.GameFiles // f.DataPointer = (ulong)f.Data.Position; // else // f.DataPointer = 0; + for (int i = 0; i < Parameters.Length; i++) + { + var param = Parameters[i]; + if (param.DataType == 0) + { + param.DataPointer = (ulong)((param.Data as TextureBase)?.FilePosition ?? 0); + } + else + { + var block = (i < ParameterDataBlocks?.Length) ? ParameterDataBlocks[i] : null; + if (block != null) + { + param.DataPointer = (ulong)block.FilePosition; + } + else + { + param.DataPointer = 0;//shouldn't happen! + } + } + } + // write parameter infos @@ -409,6 +394,20 @@ namespace CodeWalker.GameFiles // if (f.DataType != 0) // writer.WriteBlock(f.Data); //} + for (int i = 0; i < Parameters.Length; i++) + { + var param = Parameters[i]; + if (param.DataType != 0) + { + var block = (i < ParameterDataBlocks?.Length) ? ParameterDataBlocks[i] : null; + if (block != null) + { + writer.WriteBlock(block); + } + else + { } //shouldn't happen! + } + } // write hashes foreach (var h in Hashes) @@ -423,10 +422,9 @@ namespace CodeWalker.GameFiles var list = new List(); list.AddRange(base.GetReferences()); - //TODO: fix this - //foreach (var x in Parameters) - // if (x.DataType == 0) - // list.Add(x.Data); + foreach (var x in Parameters) + if (x.DataType == 0) + list.Add(x.Data as TextureBase); return list.ToArray(); } @@ -443,13 +441,30 @@ namespace CodeWalker.GameFiles offset += 16; } - //TODO: fix this - //foreach (var x in Parameters) - //{ - // if (x.DataType != 0) - // list.Add(new Tuple(offset, x.Data)); - // offset += 16 * x.DataType; - //} + + var blist = new List>(); + foreach (var x in Parameters) + { + if (x.DataType != 0) + { + var vecs = x.Data as Vector4[]; + if (vecs == null) + { + vecs = new[] { (Vector4)x.Data }; + } + if (vecs == null) + { } + var block = new ResourceSystemStructBlock(vecs); + list.Add(new Tuple(offset, block)); + blist.Add(block); + } + else + { + blist.Add(null); + } + offset += 16 * x.DataType; + } + ParameterDataBlocks = blist.ToArray(); return list.ToArray(); } @@ -494,16 +509,17 @@ namespace CodeWalker.GameFiles // reference data public ResourcePointerArray64 Unknown_10h_Data { get; set; } public ResourceSimpleArray Bones { get; set; } - //public ResourceSimpleArray TransformationsInverted { get; set; } - //public ResourceSimpleArray Transformations { get; set; } - //public ResourceSimpleArray ParentIndices { get; set; } - //public ResourceSimpleArray Unknown_40h_Data { get; set; } public Matrix[] TransformationsInverted { get; set; } public Matrix[] Transformations { get; set; } public ushort[] ParentIndices { get; set; } public ushort[] Unknown_40h_Data { get; set; } + private ResourceSystemStructBlock TransformationsInvertedBlock = null;//for saving only + private ResourceSystemStructBlock TransformationsBlock = null; + private ResourceSystemStructBlock ParentIndicesBlock = null; + private ResourceSystemStructBlock Unknown_40h_DataBlock = null; + /// /// Reads the data-block from a stream. @@ -546,22 +562,6 @@ namespace CodeWalker.GameFiles this.BonesPointer, // offset this.BonesCount ); - //this.TransformationsInverted = reader.ReadBlockAt>( - // this.TransformationsInvertedPointer, // offset - // this.BonesCount - //); - //this.Transformations = reader.ReadBlockAt>( - // this.TransformationsPointer, // offset - // this.BonesCount - //); - //this.ParentIndices = reader.ReadBlockAt>( - // this.ParentIndicesPointer, // offset - // this.BonesCount - //); - //this.Unknown_40h_Data = reader.ReadBlockAt>( - // this.Unknown_40h_Pointer, // offset - // this.Count4 - //); this.TransformationsInverted = reader.ReadStructsAt(this.TransformationsInvertedPointer, this.BonesCount); this.Transformations = reader.ReadStructsAt(this.TransformationsPointer, this.BonesCount); this.ParentIndices = reader.ReadUshortsAt(this.ParentIndicesPointer, this.BonesCount); @@ -591,15 +591,16 @@ namespace CodeWalker.GameFiles { // update structure data this.Unknown_10h_Pointer = (ulong)(this.Unknown_10h_Data != null ? this.Unknown_10h_Data.FilePosition : 0); - // this.c1 = (ushort)(this.arr1 != null ? this.arr1.Count : 0); + this.Count1 = (ushort)(this.Unknown_10h_Data != null ? this.Unknown_10h_Data.Count : 0); this.BonesPointer = (ulong)(this.Bones != null ? this.Bones.FilePosition : 0); - //this.TransformationsInvertedPointer = (ulong)(this.TransformationsInverted != null ? this.TransformationsInverted.Position : 0); - //this.TransformationsPointer = (ulong)(this.Transformations != null ? this.Transformations.Position : 0); - //this.ParentIndicesPointer = (ulong)(this.ParentIndices != null ? this.ParentIndices.Position : 0); - //this.Unknown_40h_Pointer = (ulong)(this.Unknown_40h_Data != null ? this.Unknown_40h_Data.Position : 0); - ///// this.c3 = (ushort)(this.Bones != null ? this.Bones.Count : 0); - //this.Count4 = (ushort)(this.Unknown_40h_Data != null ? this.Unknown_40h_Data.Count : 0); - //TODO: fix/update + this.TransformationsInvertedPointer = (ulong)(this.TransformationsInvertedBlock != null ? this.TransformationsInvertedBlock.FilePosition : 0); + this.TransformationsPointer = (ulong)(this.TransformationsBlock != null ? this.TransformationsBlock.FilePosition : 0); + this.ParentIndicesPointer = (ulong)(this.ParentIndicesBlock != null ? this.ParentIndicesBlock.FilePosition : 0); + this.Unknown_40h_Pointer = (ulong)(this.Unknown_40h_DataBlock != null ? this.Unknown_40h_DataBlock.FilePosition : 0); + this.BonesCount = (ushort)(this.Bones != null ? this.Bones.Count : 0); + this.Count4 = (ushort)(this.Unknown_40h_DataBlock != null ? this.Unknown_40h_DataBlock.ItemCount : 0); + //this.Count2 = BonesCount;//? + // write structure data writer.Write(this.VFT); @@ -637,10 +638,26 @@ namespace CodeWalker.GameFiles var list = new List(); if (Unknown_10h_Data != null) list.Add(Unknown_10h_Data); if (Bones != null) list.Add(Bones); - //if (TransformationsInverted != null) list.Add(TransformationsInverted); - //if (Transformations != null) list.Add(Transformations); - //if (ParentIndices != null) list.Add(ParentIndices); - //if (Unknown_40h_Data != null) list.Add(Unknown_40h_Data); //TODO: fix + if (TransformationsInverted != null) + { + TransformationsInvertedBlock = new ResourceSystemStructBlock(TransformationsInverted); + list.Add(TransformationsInvertedBlock); + } + if (Transformations != null) + { + TransformationsBlock = new ResourceSystemStructBlock(Transformations); + list.Add(TransformationsBlock); + } + if (ParentIndices != null) + { + ParentIndicesBlock = new ResourceSystemStructBlock(ParentIndices); + list.Add(ParentIndicesBlock); + } + if (Unknown_40h_Data != null) + { + Unknown_40h_DataBlock = new ResourceSystemStructBlock(Unknown_40h_Data); + list.Add(Unknown_40h_DataBlock); + } return list.ToArray(); } } @@ -715,9 +732,6 @@ namespace CodeWalker.GameFiles //public float RotationW { get; set; } public Quaternion Rotation { get; set; } public Vector3 Translation { get; set; } - //public float TranslationX { get; set; } - //public float TranslationY { get; set; } - //public float TranslationZ { get; set; } public uint Unknown_1Ch { get; set; } // 0x00000000 RHW? public float ScaleX { get; set; } // 1.0 public float ScaleY { get; set; } // 1.0 @@ -739,6 +753,7 @@ namespace CodeWalker.GameFiles public Bone Parent { get; set; } + private string_r NameBlock = null; /// /// Reads the data-block from a stream. @@ -783,18 +798,11 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - //this.NamePointer = (ulong)(this.Name != null ? this.Name.Position : 0); //TODO: fix + this.NamePointer = (ulong)(this.NameBlock != null ? this.NameBlock.FilePosition : 0); // write structure data - //writer.Write(this.RotationX); - //writer.Write(this.RotationY); - //writer.Write(this.RotationZ); - //writer.Write(this.RotationW); writer.Write(this.Rotation.ToVector4()); writer.Write(this.Translation); - //writer.Write(this.TranslationX); - //writer.Write(this.TranslationY); - //writer.Write(this.TranslationZ); writer.Write(this.Unknown_1Ch); writer.Write(this.ScaleX); writer.Write(this.ScaleY); @@ -818,7 +826,11 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - //if (Name != null) list.Add(Name); //TODO: fix + if (Name != null) + { + NameBlock = (string_r)Name; + list.Add(NameBlock); + } return list.ToArray(); } @@ -854,11 +866,12 @@ namespace CodeWalker.GameFiles public uint Unknown_3Ch { get; set; } // 0x00000000 // reference data - //public ResourceSimpleArray RotationLimits { get; set; } - //public ResourceSimpleArray TranslationLimits { get; set; } public JointRotationLimit_s[] RotationLimits { get; set; } public JointTranslationLimit_s[] TranslationLimits { get; set; } + private ResourceSystemStructBlock RotationLimitsBlock = null; //for saving only + private ResourceSystemStructBlock TranslationLimitsBlock = null; + /// /// Reads the data-block from a stream. @@ -903,11 +916,11 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - //this.RotationLimitsPointer = (ulong)(this.RotationLimits != null ? this.RotationLimits.Position : 0); - //this.TranslationLimitsPointer = (ulong)(this.TranslationLimits != null ? this.TranslationLimits.Position : 0); - //this.RotationLimitsCount = (ushort)(this.RotationLimits != null ? this.RotationLimits.Count : 0); - //this.TranslationLimitsCount = (ushort)(this.TranslationLimits != null ? this.TranslationLimits.Count : 0); - //TODO: fix this + this.RotationLimitsPointer = (ulong)(this.RotationLimitsBlock != null ? this.RotationLimitsBlock.FilePosition : 0); + this.TranslationLimitsPointer = (ulong)(this.TranslationLimitsBlock != null ? this.TranslationLimitsBlock.FilePosition : 0); + this.RotationLimitsCount = (ushort)(this.RotationLimitsBlock != null ? this.RotationLimitsBlock.ItemCount : 0); + this.TranslationLimitsCount = (ushort)(this.TranslationLimitsBlock != null ? this.TranslationLimitsBlock.ItemCount : 0); + // write structure data writer.Write(this.VFT); @@ -934,9 +947,16 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - //if (RotationLimits != null) list.Add(RotationLimits); - //if (TranslationLimits != null) list.Add(TranslationLimits); - //TODO: fix this + if (RotationLimits != null) + { + RotationLimitsBlock = new ResourceSystemStructBlock(RotationLimits); + list.Add(RotationLimitsBlock); + } + if (TranslationLimits != null) + { + TranslationLimitsBlock = new ResourceSystemStructBlock(TranslationLimits); + list.Add(TranslationLimitsBlock); + } return list.ToArray(); } } @@ -1034,11 +1054,15 @@ namespace CodeWalker.GameFiles // reference data public ResourcePointerArray64 Geometries { get; set; } - //public ResourceSimpleArray Unknown_18h_Data; - //public ResourceSimpleArray ShaderMapping; public AABB_s[] BoundsData { get; set; } public ushort[] ShaderMapping { get; set; } + + private ResourceSystemStructBlock BoundsDataBlock = null; //for saving only + private ResourceSystemStructBlock ShaderMappingBlock = null; + + + public long MemoryUsage { get @@ -1100,14 +1124,6 @@ namespace CodeWalker.GameFiles this.GeometriesPointer, // offset this.GeometriesCount1 ); - //this.Unknown_18h_Data = reader.ReadBlockAt>( - // this.Unknown_18h_Pointer, // offset - // this.GeometriesCount1 > 1 ? this.GeometriesCount1 + 1 : this.GeometriesCount1 - //); - //this.ShaderMapping = reader.ReadBlockAt>( - // this.ShaderMappingPointer, // offset - // this.GeometriesCount1 - //); this.BoundsData = reader.ReadStructsAt(this.BoundsPointer, (uint)(this.GeometriesCount1 > 1 ? this.GeometriesCount1 + 1 : this.GeometriesCount1)); this.ShaderMapping = reader.ReadUshortsAt(this.ShaderMappingPointer, this.GeometriesCount1); @@ -1120,10 +1136,11 @@ namespace CodeWalker.GameFiles { // update structure data this.GeometriesPointer = (ulong)(this.Geometries != null ? this.Geometries.FilePosition : 0); - // this.GeometriesCount1 = (ushort)(this.Geometries != null ? this.Geometries.Count : 0); - //this.Unknown_18h_Pointer = (ulong)(this.Unknown_18h_Data != null ? this.Unknown_18h_Data.Position : 0); - //this.ShaderMappingPointer = (ulong)(this.ShaderMapping != null ? this.ShaderMapping.Position : 0); - //TODO: fix + this.GeometriesCount1 = (ushort)(this.Geometries != null ? this.Geometries.Count : 0); + this.GeometriesCount2 = this.GeometriesCount1;//is this correct? + this.BoundsPointer = (ulong)(this.BoundsDataBlock != null ? this.BoundsDataBlock.FilePosition : 0); + this.ShaderMappingPointer = (ulong)(this.ShaderMappingBlock != null ? this.ShaderMappingBlock.FilePosition : 0); + // write structure data writer.Write(this.VFT); @@ -1145,8 +1162,16 @@ namespace CodeWalker.GameFiles { var list = new List(); if (Geometries != null) list.Add(Geometries); - //if (Unknown_18h_Data != null) list.Add(Unknown_18h_Data); - //if (ShaderMapping != null) list.Add(ShaderMapping); //TODO: fix + if (BoundsData != null) + { + BoundsDataBlock = new ResourceSystemStructBlock(BoundsData); + list.Add(BoundsDataBlock); + } + if (ShaderMapping != null) + { + ShaderMappingBlock = new ResourceSystemStructBlock(ShaderMapping); + list.Add(ShaderMappingBlock); + } return list.ToArray(); } @@ -1191,7 +1216,7 @@ namespace CodeWalker.GameFiles public uint Unknown_64h { get; set; } // 0x00000000 public ulong BoneIdsPointer { get; set; } public ushort VertexStride { get; set; } - public ushort Count1 { get; set; } + public ushort BoneIdsCount { get; set; } public uint Unknown_74h { get; set; } // 0x00000000 public ulong VertexDataPointer { get; set; } public uint Unknown_80h { get; set; } // 0x00000000 @@ -1208,6 +1233,9 @@ namespace CodeWalker.GameFiles public VertexData VertexData { get; set; } public ShaderFX Shader { get; set; } + private ResourceSystemStructBlock BoneIdsBlock = null;//for saving only + + /// /// Reads the data-block from a stream. /// @@ -1241,7 +1269,7 @@ namespace CodeWalker.GameFiles this.Unknown_64h = reader.ReadUInt32(); this.BoneIdsPointer = reader.ReadUInt64(); this.VertexStride = reader.ReadUInt16(); - this.Count1 = reader.ReadUInt16(); + this.BoneIdsCount = reader.ReadUInt16(); this.Unknown_74h = reader.ReadUInt32(); this.VertexDataPointer = reader.ReadUInt64(); this.Unknown_80h = reader.ReadUInt32(); @@ -1258,11 +1286,7 @@ namespace CodeWalker.GameFiles this.IndexBuffer = reader.ReadBlockAt( this.IndexBufferPointer // offset ); - //this.Unknown_68h_Data = reader.ReadBlockAt>( - // this.Unknown_68h_Pointer, // offset - // this.Count1 - //); - this.BoneIds = reader.ReadUshortsAt(this.BoneIdsPointer, this.Count1); + this.BoneIds = reader.ReadUshortsAt(this.BoneIdsPointer, this.BoneIdsCount); if (this.BoneIds != null) //skinned mesh bones to use? peds, also yft props... { } @@ -1302,9 +1326,9 @@ namespace CodeWalker.GameFiles // update structure data this.VertexBufferPointer = (ulong)(this.VertexBuffer != null ? this.VertexBuffer.FilePosition : 0); this.IndexBufferPointer = (ulong)(this.IndexBuffer != null ? this.IndexBuffer.FilePosition : 0); - //this.Unknown_68h_Pointer = (ulong)(this.Unknown_68h_Data != null ? this.Unknown_68h_Data.Position : 0); - //this.VertexStride = (ushort)(this.VertexData != null ? this.VertexData.Count : 0); //TODO: fix - //this.c1 = (ushort)(this.p1data != null ? this.p1data.Count : 0); + this.BoneIdsPointer = (ulong)(this.BoneIdsBlock != null ? this.BoneIdsBlock.FilePosition : 0); + this.VerticesCount = (ushort)(this.VertexData != null ? this.VertexData.VertexCount : 0); //TODO: fix? + this.BoneIdsCount = (ushort)(this.BoneIdsBlock != null ? this.BoneIdsBlock.ItemCount : 0); this.VertexDataPointer = (ulong)(this.VertexData != null ? this.VertexData.FilePosition : 0); // write structure data @@ -1335,7 +1359,7 @@ namespace CodeWalker.GameFiles writer.Write(this.Unknown_64h); writer.Write(this.BoneIdsPointer); writer.Write(this.VertexStride); - writer.Write(this.Count1); + writer.Write(this.BoneIdsCount); writer.Write(this.Unknown_74h); writer.Write(this.VertexDataPointer); writer.Write(this.Unknown_80h); @@ -1354,7 +1378,11 @@ namespace CodeWalker.GameFiles var list = new List(); if (VertexBuffer != null) list.Add(VertexBuffer); if (IndexBuffer != null) list.Add(IndexBuffer); - //if (Unknown_68h_Data != null) list.Add(Unknown_68h_Data); //TODO: fix + if (BoneIds != null) + { + BoneIdsBlock = new ResourceSystemStructBlock(BoneIds); + list.Add(BoneIdsBlock); + } if (VertexData != null) list.Add(VertexData); return list.ToArray(); } @@ -1470,7 +1498,7 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - //this.VertexStride = (uint)(this.Data1 != null ? this.Data1.Count : 0); + this.VertexCount = (uint)(this.Data1 != null ? this.Data1.VertexCount : 0); this.DataPointer1 = (ulong)(this.Data1 != null ? this.Data1.FilePosition : 0); this.DataPointer2 = (ulong)(this.Data2 != null ? this.Data2.FilePosition : 0); this.InfoPointer = (ulong)(this.Info != null ? this.Info.FilePosition : 0); @@ -1525,18 +1553,17 @@ namespace CodeWalker.GameFiles { - private int length = 0; + //private int length = 0; public override long BlockLength { get { - return this.length; + return VertexBytes?.Length ?? 0; //this.length; } } - public int cnt { get; set; } public VertexDeclaration info { get; set; } public object[] Data { get; set; } public uint[] Types { get; set; } @@ -1560,9 +1587,7 @@ namespace CodeWalker.GameFiles { VertexStride = Convert.ToInt32(parameters[0]); VertexCount = Convert.ToInt32(parameters[1]); - var info = (VertexDeclaration)parameters[2]; - this.cnt = VertexCount; - this.info = info; + info = (VertexDeclaration)parameters[2]; VertexType = (VertexType)info.Flags; @@ -1598,7 +1623,7 @@ namespace CodeWalker.GameFiles int stride = Convert.ToInt32(parameters[0]); int count = Convert.ToInt32(parameters[1]); var info = (VertexDeclaration)parameters[2]; - this.cnt = count; + this.VertexCount = count; this.info = info; @@ -1731,14 +1756,14 @@ namespace CodeWalker.GameFiles } - this.length = stride * count; + //this.length = stride * count; } - public override void Write(ResourceDataWriter writer, params object[] parameters) + public /*override*/ void WriteOrig(ResourceDataWriter writer, params object[] parameters) { // write... - for (int i = 0; i < cnt; i++) + for (int i = 0; i < VertexCount; i++) { for (int k = 0; k < 16; k++) @@ -1830,9 +1855,17 @@ namespace CodeWalker.GameFiles } + public override void Write(ResourceDataWriter writer, params object[] parameters) + { + if (VertexBytes != null) + { + writer.Write(VertexBytes); //not dealing with individual vertex data here any more! + } + } + public override string ToString() { - return "Type: " + VertexType.ToString() + ", Count: " + cnt.ToString(); + return "Type: " + VertexType.ToString() + ", Count: " + VertexCount.ToString(); } } @@ -1931,6 +1964,10 @@ namespace CodeWalker.GameFiles //public ResourceSimpleArray Indices; public ushort[] Indices { get; set; } + + private ResourceSystemStructBlock IndicesBlock = null; //only used when saving + + /// /// Reads the data-block from a stream. /// @@ -1975,8 +2012,8 @@ namespace CodeWalker.GameFiles public override void Write(ResourceDataWriter writer, params object[] parameters) { // update structure data - //this.IndicesCount = (uint)(this.Indices != null ? this.Indices.Count : 0); - //this.IndicesPointer = (ulong)(this.Indices != null ? this.Indices.Position : 0); + this.IndicesCount = (uint)(this.IndicesBlock != null ? this.IndicesBlock.ItemCount : 0); + this.IndicesPointer = (ulong)(this.IndicesBlock != null ? this.IndicesBlock.FilePosition : 0); // write structure data writer.Write(this.VFT); @@ -2010,7 +2047,11 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(); - //if (Indices != null) list.Add(Indices); //TODO: fix.. + if (Indices != null) + { + IndicesBlock = new ResourceSystemStructBlock(Indices); + list.Add(IndicesBlock); + } return list.ToArray(); } } @@ -2296,10 +2337,10 @@ namespace CodeWalker.GameFiles // write structure data writer.Write(this.ShaderGroupPointer); writer.Write(this.SkeletonPointer); - //writer.WriteBlock(this.BoundingCenter); //TODO: fix! + writer.Write(this.BoundingCenter); writer.Write(this.BoundingSphereRadius); - //writer.WriteBlock(this.BoundingBoxMin); //TODO: fix! - //writer.WriteBlock(this.BoundingBoxMax); + writer.Write(this.BoundingBoxMin); + writer.Write(this.BoundingBoxMax); writer.Write(this.DrawableModelsHighPointer); writer.Write(this.DrawableModelsMediumPointer); writer.Write(this.DrawableModelsLowPointer); @@ -2356,6 +2397,10 @@ namespace CodeWalker.GameFiles public string ErrorMessage { get; set; } + + private string_r NameBlock = null;//only used when saving.. + + /// /// Reads the data-block from a stream. /// @@ -2396,7 +2441,7 @@ namespace CodeWalker.GameFiles base.Write(writer, parameters); // update structure data - //this.NamePointer = (ulong)(this.Name != null ? this.Name.Position : 0); //TODO: fix + this.NamePointer = (ulong)(this.NameBlock != null ? this.NameBlock.FilePosition : 0); this.BoundPointer = (ulong)(this.Bound != null ? this.Bound.FilePosition : 0); // write structure data @@ -2413,7 +2458,11 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - //if (Name != null) list.Add(Name); //TODO: fix + if (Name != null) + { + NameBlock = (string_r)Name; + list.Add(NameBlock); + } if (Bound != null) list.Add(Bound); return list.ToArray(); } @@ -2457,6 +2506,10 @@ namespace CodeWalker.GameFiles public uint[] Hashes { get; set; } public ResourcePointerArray64 Drawables { get; set; } + + private ResourceSystemStructBlock HashesBlock = null;//only used for saving + + /// /// Reads the data-block from a stream. /// @@ -2499,12 +2552,12 @@ namespace CodeWalker.GameFiles base.Write(writer, parameters); // update structure data - //this.HashesPointer = (ulong)(this.Hashes != null ? this.Hashes.Position : 0); //TODO:: FIX THIS - // this.HashesCount1 = (ushort)(this.Hashes != null ? this.Hashes.Count : 0); - // this.HashesCount2 = (ushort)(this.Hashes != null ? this.Hashes.Count : 0); + this.HashesPointer = (ulong)(this.HashesBlock != null ? this.HashesBlock.FilePosition : 0); + this.HashesCount1 = (ushort)(this.HashesBlock != null ? this.HashesBlock.ItemCount : 0); + this.HashesCount2 = (ushort)(this.HashesBlock != null ? this.HashesBlock.ItemCount : 0); this.DrawablesPointer = (ulong)(this.Drawables != null ? this.Drawables.FilePosition : 0); - // this.DrawablesCount1 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); - // this.DrawablesCount2 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); + this.DrawablesCount1 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); + this.DrawablesCount2 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); // write structure data writer.Write(this.Unknown_10h); @@ -2527,7 +2580,11 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - //if (Hashes != null) list.Add(Hashes); //TODO: fix + if (Hashes != null) + { + HashesBlock = new ResourceSystemStructBlock(Hashes); + list.Add(HashesBlock); + } if (Drawables != null) list.Add(Drawables); return list.ToArray(); } @@ -2559,6 +2616,10 @@ namespace CodeWalker.GameFiles public uint[] Hashes { get; set; } public ResourcePointerArray64 Drawables { get; set; } + + private ResourceSystemStructBlock HashesBlock = null;//only used for saving + + public long MemoryUsage { get @@ -2597,10 +2658,6 @@ namespace CodeWalker.GameFiles this.Unknown_3Ch = reader.ReadUInt32(); // read reference data - //this.Hashes = reader.ReadBlockAt>( - // this.HashesPointer, // offset - // this.HashesCount1 - //); this.Hashes = reader.ReadUintsAt(this.HashesPointer, this.HashesCount1); this.Drawables = reader.ReadBlockAt>( @@ -2617,12 +2674,12 @@ namespace CodeWalker.GameFiles base.Write(writer, parameters); // update structure data - //this.HashesPointer = (ulong)(this.Hashes != null ? this.Hashes.Position : 0); //TODO: fix update this - // this.HashesCount1 = (ushort)(this.Hashes != null ? this.Hashes.Count : 0); - // this.HashesCount2 = (ushort)(this.Hashes != null ? this.Hashes.Count : 0); + this.HashesPointer = (ulong)(this.HashesBlock != null ? this.HashesBlock.FilePosition : 0); + this.HashesCount1 = (ushort)(this.HashesBlock != null ? this.HashesBlock.ItemCount : 0); + this.HashesCount2 = (ushort)(this.HashesBlock != null ? this.HashesBlock.ItemCount : 0); this.DrawablesPointer = (ulong)(this.Drawables != null ? this.Drawables.FilePosition : 0); - // this.DrawablesCount1 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); - // this.DrawablesCount2 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); + this.DrawablesCount1 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); + this.DrawablesCount2 = (ushort)(this.Drawables != null ? this.Drawables.Count : 0); // write structure data writer.Write(this.Unknown_10h); @@ -2645,7 +2702,11 @@ namespace CodeWalker.GameFiles public override IResourceBlock[] GetReferences() { var list = new List(base.GetReferences()); - //if (Hashes != null) list.Add(Hashes); //TODO: fix + if (Hashes != null) + { + HashesBlock = new ResourceSystemStructBlock(Hashes); + list.Add(HashesBlock); + } if (Drawables != null) list.Add(Drawables); return list.ToArray(); }