From b30853b6a364f7cbf0b953addbc219feb2601abc Mon Sep 17 00:00:00 2001 From: dexy Date: Thu, 12 Mar 2020 09:48:56 +1100 Subject: [PATCH] ShaderParametersBlock length calculation and padding fix --- .../GameFiles/Resources/Drawable.cs | 66 +++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/CodeWalker.Core/GameFiles/Resources/Drawable.cs b/CodeWalker.Core/GameFiles/Resources/Drawable.cs index b07f051..371ea3b 100644 --- a/CodeWalker.Core/GameFiles/Resources/Drawable.cs +++ b/CodeWalker.Core/GameFiles/Resources/Drawable.cs @@ -294,7 +294,8 @@ namespace CodeWalker.GameFiles // read reference data this.ParametersList = reader.ReadBlockAt( this.ParametersPointer, // offset - this.ParameterCount + this.ParameterCount, + this ); //// just testing... @@ -378,6 +379,7 @@ namespace CodeWalker.GameFiles if (pnode != null) { ParametersList = new ShaderParametersBlock(); + ParametersList.Owner = this; ParametersList.ReadXml(pnode); ParameterCount = (byte)ParametersList.Count; @@ -442,7 +444,17 @@ namespace CodeWalker.GameFiles { get { - long offset = 0; + var bsize = BaseSize; + var psize = ParametersDataSize; + return bsize + psize*4; + } + } + + public long BaseSize + { + get + { + long offset = 32; foreach (var x in Parameters) { offset += 16; @@ -450,11 +462,9 @@ namespace CodeWalker.GameFiles } offset += Parameters.Length * 4; - return offset; } } - public ushort ParametersSize { get @@ -471,8 +481,9 @@ namespace CodeWalker.GameFiles { get { - ushort size = (ushort)(BlockLength + 36);//TODO: figure out how to calculate this correctly!! - return size; + var size = BaseSize; + if ((size % 16) != 0) size += (16 - (size % 16)); + return (ushort)size; } } @@ -493,11 +504,14 @@ namespace CodeWalker.GameFiles public MetaName[] Hashes { get; set; } public int Count { get; set; } + public ShaderFX Owner { get; set; } + private ResourceSystemStructBlock[] ParameterDataBlocks = null; public override void Read(ResourceDataReader reader, params object[] parameters) { Count = Convert.ToInt32(parameters[0]); + Owner = parameters[1] as ShaderFX; var paras = new List(); for (int i = 0; i < Count; i++) @@ -543,17 +557,28 @@ namespace CodeWalker.GameFiles Hashes = hashes.ToArray(); - //####### TODO: investigate missing data here!!! ####### - //var bytes = reader.ReadBytes(142 * Count); - //if (bytes != null) + ////testing padding area at the end of the block... + //var psiz1 = Owner.ParameterDataSize; + //var psiz2 = ParametersDataSize; + //if (psiz1 != psiz2) + //{ }//no hit + //var unk0 = reader.ReadStructs(8); + //foreach (var u0i in unk0) //{ - // for (int i = 0; i < bytes.Length; i++) + // if (u0i != 0) + // { }//no hit + //} + //if (Owner.Unknown_12h != 0) + //{ + // var unk1 = reader.ReadStructs(psiz1); + // foreach (var u1i in unk1) // { - // if (bytes[i] != 0) - // { break; } + // if (u1i != 0) + // { break; }//no hit // } //} + //// just testing... //for (int i = 0; i < Parameters.Length; i++) //{ @@ -652,6 +677,12 @@ namespace CodeWalker.GameFiles { writer.Write((uint)h); } + + + //write end padding stuff + var psiz = ParametersDataSize; + writer.Write(new byte[32 + psiz*4]); + } public void WriteXml(StringBuilder sb, int indent) { @@ -4473,6 +4504,11 @@ namespace CodeWalker.GameFiles private string_r NameBlock = null;//only used when saving.. +#if DEBUG + public ResourceAnalyzer Analyzer { get; set; } +#endif + + public override void Read(ResourceDataReader reader, params object[] parameters) { base.Read(reader, parameters); @@ -4508,6 +4544,12 @@ namespace CodeWalker.GameFiles if (UnkPointer != 0) { } + + +#if DEBUG + Analyzer = new ResourceAnalyzer(reader); +#endif + } public override void Write(ResourceDataWriter writer, params object[] parameters) {