diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs index b547e20..e77ad2d 100644 --- a/CodeGenerator/Program.cs +++ b/CodeGenerator/Program.cs @@ -98,6 +98,8 @@ namespace CodeGenerator { //Add the class to the namespace ns.Types.Add(ctd); + var totalSize = 0; + //Add the fields to the class Log($"Fields: {type.Fields.Count}"); for (var index = 0; index < type.Fields.Count; index++) { @@ -113,10 +115,17 @@ namespace CodeGenerator { Log($"Generating field {field.Name}"); cmf = CreateMemberField(field); } - cmf.CustomAttributes.Add(GenerateDNAFieldAttribute(index, field, field.M_Parent.M_Parent)); + + var size = 0; + var attributes = GenerateDNAFieldAttribute(index, field, field.M_Parent.M_Parent, out size); + totalSize += size; + + cmf.CustomAttributes.Add(attributes); ctd.Members.Add(cmf); } - + + ctd.CustomAttributes[0].Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(totalSize))); + Log("Generating Parameterless constructor"); if(ctd.Members.Count > 0) ctd.Members.Add(GenerateParameterlessConstructor(type, ctd)); @@ -330,17 +339,41 @@ namespace CodeGenerator { } }; ctd.Members.Add(cmp); + + cmf = new CodeMemberField(typeof(int), "_size") { + Attributes = MemberAttributes.Private + }; + + ctd.Members.Add(cmf); + + cmp = new CodeMemberProperty() { + Name = "Size", + Type = new CodeTypeReference(typeof(int)), + Attributes = MemberAttributes.Public, + HasGet = true, + GetStatements = { + new CodeMethodReturnStatement(new CodeSnippetExpression("_size")) + }, + HasSet = true, + SetStatements = { + new CodeAssignStatement(new CFieldRefExp(new CThisRefExp(), "_size"), new CArgRefExp("value")) + } + }; + + ctd.Members.Add(cmp); var cc = new CodeConstructor() { Attributes = MemberAttributes.Public }; cc.Parameters.AddRange(new CParamDeclExp[] { new(typeof(int), "originalIndex"), - new(typeof(string), "originalName") + new(typeof(string), "originalName"), + new(typeof(int), "size") }); cc.Statements.AddRange(new CodeAssignStatement[] { new(new CFieldRefExp(new CThisRefExp(), "OriginalIndex"), new CArgRefExp("originalIndex")), - new(new CFieldRefExp(new CThisRefExp(), "OriginalName"), new CArgRefExp("originalName")) + new(new CFieldRefExp(new CThisRefExp(), "OriginalName"), new CArgRefExp("originalName")), + new(new CFieldRefExp(new CThisRefExp(), "Size"), new CArgRefExp("size")) }); ctd.Members.Add(cc); @@ -348,15 +381,15 @@ namespace CodeGenerator { } private static CodeAttributeDeclaration GenerateDNAFieldAttribute(int index, BlendFile.DnaField field, - BlendFile.Dna1Body body) { + BlendFile.Dna1Body body, out int size) { string t; - int size = body.Lengths[field.IdxType]; + size = body.Lengths[field.IdxType]; bool isPointer = false; if (field.Name.StartsWith('*')) { - size = 4; + size = 8; isPointer = true; }