WIP fixed array data size calculation
This commit is contained in:
@@ -326,6 +326,7 @@ namespace CodeGenerator {
|
|||||||
private static CodeAttributeDeclaration GenerateDNAFieldAttribute(int index, BlendFile.DnaField field,
|
private static CodeAttributeDeclaration GenerateDNAFieldAttribute(int index, BlendFile.DnaField field,
|
||||||
BlendFile.Dna1Body body) {
|
BlendFile.Dna1Body body) {
|
||||||
string t;
|
string t;
|
||||||
|
int size = body.Lengths[field.IdxType];
|
||||||
if (field.Name.Contains('[')) {
|
if (field.Name.Contains('[')) {
|
||||||
CodeMemberField amf = CreateArrayMemberField(field);
|
CodeMemberField amf = CreateArrayMemberField(field);
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
@@ -336,6 +337,12 @@ namespace CodeGenerator {
|
|||||||
}
|
}
|
||||||
sb.Append("]");
|
sb.Append("]");
|
||||||
t = sb.ToString();
|
t = sb.ToString();
|
||||||
|
|
||||||
|
var dimensions = GetArrayDimensions(field.Name);
|
||||||
|
|
||||||
|
foreach(var dim in dimensions) {
|
||||||
|
size *= dim;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
t = field.Type;
|
t = field.Type;
|
||||||
@@ -347,7 +354,7 @@ namespace CodeGenerator {
|
|||||||
new(new CodePrimitiveExpression(field.Type)),
|
new(new CodePrimitiveExpression(field.Type)),
|
||||||
new(new CodePrimitiveExpression(field.Name)),
|
new(new CodePrimitiveExpression(field.Name)),
|
||||||
new(new CodePrimitiveExpression(t)),
|
new(new CodePrimitiveExpression(t)),
|
||||||
new(new CodePrimitiveExpression((int)body.Lengths[field.IdxType]))
|
new(new CodePrimitiveExpression(size))
|
||||||
});
|
});
|
||||||
return cad;
|
return cad;
|
||||||
}
|
}
|
||||||
@@ -370,19 +377,8 @@ namespace CodeGenerator {
|
|||||||
CodeMemberField cmf;
|
CodeMemberField cmf;
|
||||||
|
|
||||||
// Parse all array dimensions
|
// Parse all array dimensions
|
||||||
var dimensions = new List<int>();
|
|
||||||
var name = field.Name.ParseFName();
|
var name = field.Name.ParseFName();
|
||||||
int startIndex = 0;
|
var dimensions = GetArrayDimensions(name);
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get clean field name (without array brackets)
|
// Get clean field name (without array brackets)
|
||||||
name = field.Name.ParseFName().Substring(0, field.Name.IndexOf('['));
|
name = field.Name.ParseFName().Substring(0, field.Name.IndexOf('['));
|
||||||
@@ -405,6 +401,23 @@ namespace CodeGenerator {
|
|||||||
return cmf;
|
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) {
|
private static CodeExpression GenerateArrayInitExpression(CodeTypeReference type, IEnumerable<int> dimensions) {
|
||||||
var dimValues = dimensions as int[] ?? dimensions.ToArray();
|
var dimValues = dimensions as int[] ?? dimensions.ToArray();
|
||||||
string dims = string.Concat(dimValues.Take(dimValues.Count() - 1).Select(d => $"{d},"));
|
string dims = string.Concat(dimValues.Take(dimValues.Count() - 1).Select(d => $"{d},"));
|
||||||
|
|||||||
Reference in New Issue
Block a user