From fb50e3fa44d1f7c6d77113d329d1724e8819f9a6 Mon Sep 17 00:00:00 2001 From: Samuele Lorefice Date: Thu, 6 Mar 2025 19:11:03 +0100 Subject: [PATCH] Fixed list length value returning always zero. Added separated pointer and count memory offsets to list attributes. Tried handling them --- BlendFile/DNA/ActionChannelBag.cs | 6 +-- BlendFile/DNA/ActionLayer.cs | 4 +- BlendFile/DNA/ActionStripKeyframeData.cs | 4 +- BlendFile/DNA/GreasePencil.cs | 6 +-- BlendFile/DNA/IDPropertyUIDataBool.cs | 4 +- BlendFile/DNA/IDPropertyUIDataFloat.cs | 4 +- BlendFile/DNA/IDPropertyUIDataInt.cs | 4 +- BlendFile/DNA/bAction.cs | 8 ++-- BlendFile/DNA/bArmature.cs | 4 +- BlendFile/DNAListAttribute.cs | 22 +++++++--- BlenderSharp.sln.DotSettings.user | 1 + CodeGenerator/Program.cs | 56 +++++++++++++++--------- 12 files changed, 75 insertions(+), 48 deletions(-) diff --git a/BlendFile/DNA/ActionChannelBag.cs b/BlendFile/DNA/ActionChannelBag.cs index 9ba0ab0..cb39ea2 100644 --- a/BlendFile/DNA/ActionChannelBag.cs +++ b/BlendFile/DNA/ActionChannelBag.cs @@ -13,15 +13,15 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(63, "ActionChannelBag", 8)] + [DNAClassAttribute(63, "ActionChannelBag", 24)] public class ActionChannelBag { [DNAFieldAttribute(4, "int", 0, "slot_handle", "int", false, 0)] public int slot_handle; [DNAFieldAttribute(4, "uchar", 3, "_pad[4]", "System.Byte[]", false, 4)] public byte[] _pad = new System.Byte[4]; - [DNAListAttribute(8, "bActionGroup", "**group_array", 2, "bActionGroup", "group_array_num", 1, 8)] + [DNAListAttribute(8, "bActionGroup", "**group_array", 2, "bActionGroup", "group_array_num", 1, 8, 0)] public System.Collections.Generic.List group_array; - [DNAListAttribute(8, "FCurve", "**fcurve_array", 5, "FCurve", "fcurve_array_num", 4, 8)] + [DNAListAttribute(8, "FCurve", "**fcurve_array", 5, "FCurve", "fcurve_array_num", 4, 16, 0)] public System.Collections.Generic.List fcurve_array; public ActionChannelBag() { this.slot_handle = default; diff --git a/BlendFile/DNA/ActionLayer.cs b/BlendFile/DNA/ActionLayer.cs index 85a3430..77b9149 100644 --- a/BlendFile/DNA/ActionLayer.cs +++ b/BlendFile/DNA/ActionLayer.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(66, "ActionLayer", 76)] + [DNAClassAttribute(66, "ActionLayer", 84)] public class ActionLayer { [DNAFieldAttribute(64, "char", 0, "name[64]", "System.Char[]", false, 0)] public char[] name = new System.Char[64]; @@ -27,7 +27,7 @@ namespace BlendFile.DNA { public byte[] _pad0 = new System.Byte[2]; [DNAFieldAttribute(4, "uchar", 7, "_pad1[4]", "System.Byte[]", false, 72)] public byte[] _pad1 = new System.Byte[4]; - [DNAListAttribute(8, "ActionStrip", "**strip_array", 5, "ActionStrip", "strip_array_num", 6, 76)] + [DNAListAttribute(8, "ActionStrip", "**strip_array", 5, "ActionStrip", "strip_array_num", 6, 76, 0)] public System.Collections.Generic.List strip_array; public ActionLayer() { this.name = default; diff --git a/BlendFile/DNA/ActionStripKeyframeData.cs b/BlendFile/DNA/ActionStripKeyframeData.cs index bda30e3..e9a15e7 100644 --- a/BlendFile/DNA/ActionStripKeyframeData.cs +++ b/BlendFile/DNA/ActionStripKeyframeData.cs @@ -13,11 +13,11 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(68, "ActionStripKeyframeData", 4)] + [DNAClassAttribute(68, "ActionStripKeyframeData", 12)] public class ActionStripKeyframeData { [DNAFieldAttribute(4, "uchar", 2, "_pad[4]", "System.Byte[]", false, 0)] public byte[] _pad = new System.Byte[4]; - [DNAListAttribute(8, "ActionChannelBag", "**channelbag_array", 0, "ActionChannelBag", "channelbag_array_num", 1, 4)] + [DNAListAttribute(8, "ActionChannelBag", "**channelbag_array", 0, "ActionChannelBag", "channelbag_array_num", 1, 4, 0)] public System.Collections.Generic.List channelbag_array; public ActionStripKeyframeData() { this._pad = default; diff --git a/BlendFile/DNA/GreasePencil.cs b/BlendFile/DNA/GreasePencil.cs index ce5ef24..cd1c1c0 100644 --- a/BlendFile/DNA/GreasePencil.cs +++ b/BlendFile/DNA/GreasePencil.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(311, "GreasePencil", 570)] + [DNAClassAttribute(311, "GreasePencil", 586)] public class GreasePencil { [DNAFieldAttribute(208, "ID", 0, "id", "ID", false, 0)] public ID id; @@ -45,9 +45,9 @@ namespace BlendFile.DNA { public GreasePencilOnionSkinningSettings onion_skinning_settings; [DNAFieldAttribute(8, "GreasePencilRuntimeHandle", 18, "*runtime", "GreasePencilRuntimeHandle", true, 562)] public GreasePencilRuntimeHandle runtime; - [DNAListAttribute(8, "GreasePencilDrawingBase", "**drawing_array", 2, "GreasePencilDrawingBase", "drawing_array_size", 3, 570)] + [DNAListAttribute(8, "GreasePencilDrawingBase", "**drawing_array", 2, "GreasePencilDrawingBase", "drawing_array_size", 3, 570, 0)] public System.Collections.Generic.List drawing_array; - [DNAListAttribute(8, "Material", "**material_array", 10, "Material", "material_array_size", 11, 570)] + [DNAListAttribute(8, "Material", "**material_array", 10, "Material", "material_array_size", 11, 578, 0)] public System.Collections.Generic.List material_array; public GreasePencil() { this.id = default; diff --git a/BlendFile/DNA/IDPropertyUIDataBool.cs b/BlendFile/DNA/IDPropertyUIDataBool.cs index 09f8b4b..5ea2555 100644 --- a/BlendFile/DNA/IDPropertyUIDataBool.cs +++ b/BlendFile/DNA/IDPropertyUIDataBool.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(19, "IDPropertyUIDataBool", 20)] + [DNAClassAttribute(19, "IDPropertyUIDataBool", 28)] public class IDPropertyUIDataBool { [DNAFieldAttribute(16, "IDPropertyUIData", 0, "base", "IDPropertyUIData", false, 0)] public IDPropertyUIData @base; @@ -21,7 +21,7 @@ namespace BlendFile.DNA { public char[] _pad = new System.Char[3]; [DNAFieldAttribute(1, "int8_t", 4, "default_value", "int8_t", false, 19)] public sbyte default_value; - [DNAListAttribute(8, "int8_t", "*default_array", 1, "int8_t", "default_array_len", 2, 20)] + [DNAListAttribute(8, "int8_t", "*default_array", 1, "int8_t", "default_array_len", 2, 20, 0)] public System.Collections.Generic.List default_array; public IDPropertyUIDataBool() { this.@base = default; diff --git a/BlendFile/DNA/IDPropertyUIDataFloat.cs b/BlendFile/DNA/IDPropertyUIDataFloat.cs index ad2f711..c5dd1f4 100644 --- a/BlendFile/DNA/IDPropertyUIDataFloat.cs +++ b/BlendFile/DNA/IDPropertyUIDataFloat.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(20, "IDPropertyUIDataFloat", 68)] + [DNAClassAttribute(20, "IDPropertyUIDataFloat", 76)] public class IDPropertyUIDataFloat { [DNAFieldAttribute(16, "IDPropertyUIData", 0, "base", "IDPropertyUIData", false, 0)] public IDPropertyUIData @base; @@ -33,7 +33,7 @@ namespace BlendFile.DNA { public double soft_max; [DNAFieldAttribute(8, "double", 10, "default_value", "double", false, 60)] public double default_value; - [DNAListAttribute(8, "double", "*default_array", 1, "double", "default_array_len", 2, 68)] + [DNAListAttribute(8, "double", "*default_array", 1, "double", "default_array_len", 2, 68, 0)] public System.Collections.Generic.List default_array; public IDPropertyUIDataFloat() { this.@base = default; diff --git a/BlendFile/DNA/IDPropertyUIDataInt.cs b/BlendFile/DNA/IDPropertyUIDataInt.cs index 3acd8bf..4846698 100644 --- a/BlendFile/DNA/IDPropertyUIDataInt.cs +++ b/BlendFile/DNA/IDPropertyUIDataInt.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(18, "IDPropertyUIDataInt", 52)] + [DNAClassAttribute(18, "IDPropertyUIDataInt", 60)] public class IDPropertyUIDataInt { [DNAFieldAttribute(16, "IDPropertyUIData", 0, "base", "IDPropertyUIData", false, 0)] public IDPropertyUIData @base; @@ -33,7 +33,7 @@ namespace BlendFile.DNA { public int enum_items_num; [DNAFieldAttribute(8, "IDPropertyUIDataEnumItem", 10, "*enum_items", "IDPropertyUIDataEnumItem", true, 44)] public IDPropertyUIDataEnumItem enum_items; - [DNAListAttribute(8, "int", "*default_array", 1, "int", "default_array_len", 2, 52)] + [DNAListAttribute(8, "int", "*default_array", 1, "int", "default_array_len", 2, 52, 0)] public System.Collections.Generic.List default_array; public IDPropertyUIDataInt() { this.@base = default; diff --git a/BlendFile/DNA/bAction.cs b/BlendFile/DNA/bAction.cs index f1646f5..456c107 100644 --- a/BlendFile/DNA/bAction.cs +++ b/BlendFile/DNA/bAction.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(65, "bAction", 316)] + [DNAClassAttribute(65, "bAction", 340)] public class bAction { [DNAFieldAttribute(208, "ID", 0, "id", "ID", false, 0)] public ID id; @@ -45,11 +45,11 @@ namespace BlendFile.DNA { public float frame_end; [DNAFieldAttribute(8, "PreviewImage", 20, "*preview", "PreviewImage", true, 308)] public PreviewImage preview; - [DNAListAttribute(8, "ActionLayer", "**layer_array", 1, "ActionLayer", "layer_array_num", 2, 316)] + [DNAListAttribute(8, "ActionLayer", "**layer_array", 1, "ActionLayer", "layer_array_num", 2, 316, 0)] public System.Collections.Generic.List layer_array; - [DNAListAttribute(8, "ActionSlot", "**slot_array", 4, "ActionSlot", "slot_array_num", 5, 316)] + [DNAListAttribute(8, "ActionSlot", "**slot_array", 4, "ActionSlot", "slot_array_num", 5, 324, 0)] public System.Collections.Generic.List slot_array; - [DNAListAttribute(8, "ActionStripKeyframeData", "**strip_keyframe_data_array", 7, "ActionStripKeyframeData", "strip_keyframe_data_array_num", 8, 316)] + [DNAListAttribute(8, "ActionStripKeyframeData", "**strip_keyframe_data_array", 7, "ActionStripKeyframeData", "strip_keyframe_data_array_num", 8, 332, 0)] public System.Collections.Generic.List strip_keyframe_data_array; public bAction() { this.id = default; diff --git a/BlendFile/DNA/bArmature.cs b/BlendFile/DNA/bArmature.cs index 662ab26..ba1e371 100644 --- a/BlendFile/DNA/bArmature.cs +++ b/BlendFile/DNA/bArmature.cs @@ -13,7 +13,7 @@ using System; namespace BlendFile.DNA { using BlendFile; - [DNAClassAttribute(106, "bArmature", 404)] + [DNAClassAttribute(106, "bArmature", 412)] public class bArmature { [DNAFieldAttribute(208, "ID", 0, "id", "ID", false, 0)] public ID id; @@ -59,7 +59,7 @@ namespace BlendFile.DNA { public float axes_position; [DNAFieldAttribute(16, "bArmature_Runtime", 23, "runtime", "bArmature_Runtime", false, 388)] public bArmature_Runtime runtime; - [DNAListAttribute(8, "BoneCollection", "**collection_array", 15, "BoneCollection", "collection_array_num", 16, 404)] + [DNAListAttribute(8, "BoneCollection", "**collection_array", 15, "BoneCollection", "collection_array_num", 16, 404, 0)] public System.Collections.Generic.List collection_array; public bArmature() { this.id = default; diff --git a/BlendFile/DNAListAttribute.cs b/BlendFile/DNAListAttribute.cs index 422529f..62d0d13 100644 --- a/BlendFile/DNAListAttribute.cs +++ b/BlendFile/DNAListAttribute.cs @@ -77,16 +77,25 @@ namespace BlendFile { this._CountFieldIndex = value; } } - private int _MemoryOffset; - public virtual int MemoryOffset { + private int _PtrMemoryOffset; + public virtual int PtrMemoryOffset { get { - return this._MemoryOffset; + return this._PtrMemoryOffset; } set { - this._MemoryOffset = value; + this._PtrMemoryOffset = value; } } - public DNAListAttribute(int Size, string OriginalType, string OriginalName, int OriginalIndex, string UnderlyingType, string CountFieldName, int CountFieldIndex, int MemoryOffset) : + private int _CountMemoryOffset; + public virtual int CountMemoryOffset { + get { + return this._CountMemoryOffset; + } + set { + this._CountMemoryOffset = value; + } + } + public DNAListAttribute(int Size, string OriginalType, string OriginalName, int OriginalIndex, string UnderlyingType, string CountFieldName, int CountFieldIndex, int PtrMemoryOffset, int CountMemoryOffset) : base(OriginalIndex, OriginalName) { this._Size = Size; this._OriginalType = OriginalType; @@ -95,7 +104,8 @@ namespace BlendFile { this._UnderlyingType = UnderlyingType; this._CountFieldName = CountFieldName; this._CountFieldIndex = CountFieldIndex; - this._MemoryOffset = MemoryOffset; + this._PtrMemoryOffset = PtrMemoryOffset; + this._CountMemoryOffset = CountMemoryOffset; } } } diff --git a/BlenderSharp.sln.DotSettings.user b/BlenderSharp.sln.DotSettings.user index aa5ab42..d59bd47 100644 --- a/BlenderSharp.sln.DotSettings.user +++ b/BlenderSharp.sln.DotSettings.user @@ -15,6 +15,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded True diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs index cf5f6a0..c5a6fc8 100644 --- a/CodeGenerator/Program.cs +++ b/CodeGenerator/Program.cs @@ -186,26 +186,40 @@ namespace CodeGenerator { //Add the lists to the class for (var index = 0; index < type.Fields.Count; index++) { + Dictionary listCountOffsets = new(); var field = type.Fields[index]; //Skip fields that are not part of a list - if (!listFields.Select(f => f.Item1).Contains(field)) { + if (listFields.Select(f => f.Item1).Contains(field)) { + //Retrieve the list pointer and the list length fields + var (listPointer, listLength) = listFields.FirstOrDefault(x => x.Item1 == field); + //retrieve the offset of the list length field if exists + listCountOffsets.TryGetValue(listLength.Name, out int listLenghtOffset); + + //Retrieve the index of the list length field + int sizeIndex = type.Fields.IndexOf(listLength); + + Log($"Generating list field {listPointer.Name}"); + var cmf = CreateListMemberField(listPointer, listLength); + + var attribute = GenerateDnaListAttribute(index, listPointer, sizeIndex, listLength, totalSize, + listLenghtOffset, out int size); + + totalSize += size; + cmf.CustomAttributes.Add(attribute); + ctd.Members.Add(cmf); + } else if (listFields.Select(f => f.Item2).Contains(field)) { + //Retrieve the list length field + string fName = field.Name.ParseFName(); + //Try seeing if the list attribute is already present + var x = ctd.Members.OfType().FirstOrDefault(member => member.Name == fName); + + if (x != null) //Update the existing list attribute + x.CustomAttributes[0].Arguments[5] = new(new CodePrimitiveExpression(totalSize)); + else //Store the data for when the list attribute is made + listCountOffsets.Add(fName, totalSize); + } else { Log($"Field {field.Name} is not part of a list, skipping"); - continue; } - //Retrieve the list pointer and the list length fields - var (listPointer, listLength) = listFields.FirstOrDefault(x => x.Item1 == field); - //Retrieve the index of the list length field - int sizeIndex = type.Fields.IndexOf(listLength); - - Log($"Generating list field {listPointer.Name}"); - var cmf = CreateListMemberField(listPointer, listLength); - - var attribute = GenerateDnaListAttribute(index, listPointer, listPointer.M_Parent.M_Parent, sizeIndex, - listLength, totalSize, out int size); - - totalSize += size; - cmf.CustomAttributes.Add(attribute); - ctd.Members.Add(cmf); } ctd.CustomAttributes[0].Arguments.Add(new (new CodePrimitiveExpression(totalSize))); @@ -340,7 +354,8 @@ namespace CodeGenerator { .AddAutoProperty(typeof(string), "UnderlyingType") .AddAutoProperty(typeof(string), "CountFieldName") .AddAutoProperty(typeof(int), "CountFieldIndex") - .AddAutoProperty(typeof(int), "MemoryOffset") + .AddAutoProperty(typeof(int), "PtrMemoryOffset") + .AddAutoProperty(typeof(int), "CountMemoryOffset") .AddPropertiesConstructor() .AddBaseConstructorParams(["OriginalIndex", "OriginalName"]) .Build() @@ -397,8 +412,8 @@ namespace CodeGenerator { } private static CodeAttributeDeclaration GenerateDnaListAttribute(int listIndex, BlendFile.DnaField listField, - BlendFile.Dna1Body body, int lenghtIndex, BlendFile.DnaField lenghtField, int offset, out int size) { - size = 0; + int lenghtIndex, BlendFile.DnaField lenghtField, int ptrOffset, int countOffset, out int size) { + size = 8; var cad = new CodeAttributeDeclaration("DNAListAttribute"); cad.Arguments.AddRange(new CodeAttributeArgumentCollection() { new(new CodeSnippetExpression("8")),//pointer size @@ -408,7 +423,8 @@ namespace CodeGenerator { new(new CodePrimitiveExpression(listField.Type)),//TODO: double check this new(new CodePrimitiveExpression(lenghtField.Name)), new(new CodePrimitiveExpression(lenghtIndex)), - new(new CodePrimitiveExpression(offset)) + new(new CodePrimitiveExpression(ptrOffset)), + new(new CodePrimitiveExpression(countOffset)) }); return cad; }