WIP fixed array data size calculation

This commit is contained in:
mm00
2025-02-18 19:12:49 +01:00
parent bc3ac0ad86
commit 095986af06

View File

@@ -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<int>();
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<int> GetArrayDimensions(string name)
{
var dimensions = new List<int>();
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<int> dimensions) {
var dimValues = dimensions as int[] ?? dimensions.ToArray();
string dims = string.Concat(dimValues.Take(dimValues.Count() - 1).Select(d => $"{d},"));