From bc53e27647d2b7118df19e807fe77c734fb7cd08 Mon Sep 17 00:00:00 2001 From: Samuele Lorefice Date: Fri, 9 May 2025 17:11:25 +0200 Subject: [PATCH] Added some handling of array vs field data attributes. --- BlendFile/Reader.cs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/BlendFile/Reader.cs b/BlendFile/Reader.cs index 05fb61a..3f80be7 100644 --- a/BlendFile/Reader.cs +++ b/BlendFile/Reader.cs @@ -153,10 +153,11 @@ public class Reader { fldInfo.GetCustomAttributes().OfType().FirstOrDefault()?.IsPointer ?? false)); // for each pointer field - foreach (var f in list) { + foreach (var f in list) + { + int fieldIndex = f.GetCustomAttribute()!.OriginalIndex; // get the pointer value - var addr = GetBlockFieldDataOffset(obj.Key.Item1, f.GetCustomAttribute()!.OriginalIndex, - fieldInfo); + var addr = GetBlockFieldDataOffset(obj.Key.Item1, fieldIndex, fieldInfo); // dereference the pointer addr = pointers.GetValueOrDefault(addr); if (addr == IntPtr.Zero) continue; // null pointer @@ -206,9 +207,17 @@ public class Reader { /// array of metadata /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata) => - fieldMetadata.First(x => x.GetCustomAttribute()!.OriginalIndex == fieldIndex) - .GetCustomAttribute()!.MemoryOffset; + private long GetFieldDataOffset(int fieldIndex, FieldInfo[] fieldMetadata) + { + var fi = fieldMetadata.First(x => x.GetCustomAttribute()!.OriginalIndex == fieldIndex); + //get the attribute from the field + var attrib = fi.GetCustomAttribute(); + return attrib switch { + DNAFieldAttribute fieldAttribute => fieldAttribute.MemoryOffset, + DNAArrayAttribute arrayAttribute => arrayAttribute.MemoryOffset, + _ => 0 + }; + } /// /// Creates an instance of a given type