2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-07-01 00:31:56 +00:00

ZoneCodeGenerator: Add possibility to specify a custom array count to signalize how many entries of a static array should be loaded

This commit is contained in:
Jan
2019-12-24 12:41:27 +01:00
parent 9e10cffdce
commit 33ec343460
8 changed files with 118 additions and 14 deletions

View File

@ -29,6 +29,11 @@ namespace ZoneCodeGenerator.Generating.Computations
public bool IsArray => Reference is ReferenceTypeArray;
public int ArraySize => Reference is ReferenceTypeArray array ? array.ArraySize : 0;
public bool HasDynamicArrayCount => Reference is ReferenceTypeArray array && array.DynamicCount != null;
public IEvaluation DynamicArrayCountEvaluation =>
Reference is ReferenceTypeArray array ? array.DynamicCount : null;
public IEnumerable<MemberReferenceComputations> ArrayEntries => Enumerable.Range(0, ArraySize)
.Select(i => new MemberReferenceComputations(information, referenceIndices.Concat(new[] {i})));
@ -64,7 +69,7 @@ namespace ZoneCodeGenerator.Generating.Computations
public bool IsDynamicArray =>
Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null;
public IEvaluation DynamicArrayCountEvaluation => Reference is ReferenceTypeArray referenceTypeArray
public IEvaluation DynamicArraySizeEvaluation => Reference is ReferenceTypeArray referenceTypeArray
? referenceTypeArray.DynamicSize
: null;

View File

@ -6,11 +6,11 @@ LoadDynamicArray_Load(context, structure, member, reference) ::= <%
$if(member.StructureType && !member.StructureType.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(reference.DynamicArrayCountEvaluation)$);
LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(reference.DynamicArraySizeEvaluation)$);
$else$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.DynamicArrayCountEvaluation)$);
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.DynamicArraySizeEvaluation)$);
$endif$
%>

View File

@ -2,6 +2,14 @@ delimiters "$", "$"
// Everything related to loading an embedded reference
ArrayCount(reference) ::= <%
$if(reference.HasDynamicArrayCount)$
$PrintEvaluation(reference.DynamicArrayCountEvaluation)$
$else$
$reference.ArraySize$
$endif$
%>
LoadEmbedded_Load(context, structure, member, reference) ::= <<
$if(!member.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
@ -38,16 +46,16 @@ $LoadEmbedded_Block(context, structure, member, reference)$
LoadEmbeddedArray_Load(context, structure, member, reference) ::= <<
$if(!member.IsLeaf)$
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
LoadArray_$member.Member.VariableType.Type.Name$($if(member.Computations.IsAfterPartialLoad)$true$else$false$endif$, $reference.ArraySize$);$\\$
LoadArray_$member.Member.VariableType.Type.Name$($if(member.Computations.IsAfterPartialLoad)$true$else$false$endif$, $ArrayCount(reference)$);$\\$
$elseif(member.Computations.IsAfterPartialLoad)$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $reference.ArraySize$);$\\$
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $ArrayCount(reference)$);$\\$
$endif$
>>
LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <%
$if(member.IsScriptString)$
varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
LoadScriptStringArray(false, $reference.ArraySize$);
LoadScriptStringArray(false, $ArrayCount(reference)$);
$else$
$LoadEmbeddedArray_Load(context, structure, member, reference)$
$endif$