diff --git a/CodeGenerator/Program.cs b/CodeGenerator/Program.cs index 6ac5a4c..6b49734 100644 --- a/CodeGenerator/Program.cs +++ b/CodeGenerator/Program.cs @@ -326,6 +326,7 @@ namespace CodeGenerator { private static CodeAttributeDeclaration GenerateDNAFieldAttribute(int index, BlendFile.DnaField field, BlendFile.Dna1Body body) { string t; + int size = body.Lengths[field.IdxType]; if (field.Name.Contains('[')) { CodeMemberField amf = CreateArrayMemberField(field); var sb = new StringBuilder(); @@ -336,6 +337,12 @@ namespace CodeGenerator { } sb.Append("]"); t = sb.ToString(); + + var dimensions = GetArrayDimensions(field.Name); + + foreach(var dim in dimensions) { + size *= dim; + } } else { t = field.Type; @@ -347,7 +354,7 @@ namespace CodeGenerator { new(new CodePrimitiveExpression(field.Type)), new(new CodePrimitiveExpression(field.Name)), new(new CodePrimitiveExpression(t)), - new(new CodePrimitiveExpression((int)body.Lengths[field.IdxType])) + new(new CodePrimitiveExpression(size)) }); return cad; } @@ -370,19 +377,8 @@ namespace CodeGenerator { CodeMemberField cmf; // Parse all array dimensions - var dimensions = new List(); var name = field.Name.ParseFName(); - int startIndex = 0; - - // Get all array dimensions - while ((startIndex = name.IndexOf('[', startIndex)) != -1) { - int endIndex = name.IndexOf(']', startIndex); - string sizeStr = name.Substring(startIndex + 1, endIndex - startIndex - 1); - if (int.TryParse(sizeStr, out int size)) { - dimensions.Add(size); - } - startIndex = endIndex + 1; - } + var dimensions = GetArrayDimensions(name); // Get clean field name (without array brackets) name = field.Name.ParseFName().Substring(0, field.Name.IndexOf('[')); @@ -405,6 +401,23 @@ namespace CodeGenerator { return cmf; } + private static List GetArrayDimensions(string name) + { + var dimensions = new List(); + int startIndex = 0; + // Get all array dimensions + while ((startIndex = name.IndexOf('[', startIndex)) != -1) { + int endIndex = name.IndexOf(']', startIndex); + string sizeStr = name.Substring(startIndex + 1, endIndex - startIndex - 1); + if (int.TryParse(sizeStr, out int size)) { + dimensions.Add(size); + } + startIndex = endIndex + 1; + } + + return dimensions; + } + private static CodeExpression GenerateArrayInitExpression(CodeTypeReference type, IEnumerable dimensions) { var dimValues = dimensions as int[] ?? dimensions.ToArray(); string dims = string.Concat(dimValues.Take(dimValues.Count() - 1).Select(d => $"{d},"));