mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-21 00:25:44 +00:00
ZoneCodeGenerator: Add loading of dynamic arrays
This commit is contained in:
parent
2fea7654a9
commit
1544bbbd18
@ -76,13 +76,15 @@ namespace ZoneCodeGenerator.Generating.Computations
|
|||||||
public bool IsTempBlock => information.Block != null && information.Block.IsTemp;
|
public bool IsTempBlock => information.Block != null && information.Block.IsTemp;
|
||||||
public bool IsRuntimeBlock => information.Block != null && information.Block.IsRuntime;
|
public bool IsRuntimeBlock => information.Block != null && information.Block.IsRuntime;
|
||||||
|
|
||||||
public bool IsFirstMember =>
|
private IEnumerable<MemberInformation> ParentUsedMembers =>
|
||||||
information.Parent.OrderedMembers.FirstOrDefault(member =>
|
information.Parent.IsUnion && information.Parent.Computations.DynamicMember != null
|
||||||
!member.IsLeaf && !member.Computations.ShouldIgnore) == information;
|
? information.Parent.OrderedMembers.Where(member => !member.Computations.ShouldIgnore)
|
||||||
|
: information.Parent.OrderedMembers.Where(member =>
|
||||||
|
!member.IsLeaf && !member.Computations.ShouldIgnore);
|
||||||
|
|
||||||
public bool IsLastMember =>
|
public bool IsFirstMember => ParentUsedMembers.FirstOrDefault() == information;
|
||||||
information.Parent.OrderedMembers.LastOrDefault(member =>
|
|
||||||
!member.IsLeaf && !member.Computations.ShouldIgnore) == information;
|
public bool IsLastMember => ParentUsedMembers.LastOrDefault() == information;
|
||||||
|
|
||||||
public bool HasDynamicArraySize => information.Member.VariableType.References
|
public bool HasDynamicArraySize => information.Member.VariableType.References
|
||||||
.OfType<ReferenceTypeArray>()
|
.OfType<ReferenceTypeArray>()
|
||||||
@ -92,6 +94,10 @@ namespace ZoneCodeGenerator.Generating.Computations
|
|||||||
!ContainsNonEmbeddedReference &&
|
!ContainsNonEmbeddedReference &&
|
||||||
information.StructureType?.Computations.DynamicMember != null;
|
information.StructureType?.Computations.DynamicMember != null;
|
||||||
|
|
||||||
|
public bool IsAfterPartialLoad => IsDynamicMember ||
|
||||||
|
information.Parent.IsUnion &&
|
||||||
|
information.Parent.Computations.DynamicMember != null;
|
||||||
|
|
||||||
public MemberReferenceComputations References => new MemberReferenceComputations(information);
|
public MemberReferenceComputations References => new MemberReferenceComputations(information);
|
||||||
|
|
||||||
public MemberComputations(MemberInformation information)
|
public MemberComputations(MemberInformation information)
|
||||||
|
@ -64,6 +64,10 @@ namespace ZoneCodeGenerator.Generating.Computations
|
|||||||
public bool IsDynamicArray =>
|
public bool IsDynamicArray =>
|
||||||
Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null;
|
Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null;
|
||||||
|
|
||||||
|
public IEvaluation DynamicArrayCountEvaluation => Reference is ReferenceTypeArray referenceTypeArray
|
||||||
|
? referenceTypeArray.DynamicSize
|
||||||
|
: null;
|
||||||
|
|
||||||
public MemberReferenceComputations(MemberInformation information)
|
public MemberReferenceComputations(MemberInformation information)
|
||||||
{
|
{
|
||||||
this.information = information;
|
this.information = information;
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
delimiters "$", "$"
|
||||||
|
|
||||||
|
// Everything related to loading a dynamic array
|
||||||
|
|
||||||
|
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)$);
|
||||||
|
|
||||||
|
$else$
|
||||||
|
|
||||||
|
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.DynamicArrayCountEvaluation)$);
|
||||||
|
|
||||||
|
$endif$
|
||||||
|
%>
|
||||||
|
|
||||||
|
LoadDynamicArray(context, structure, member, reference) ::= <%
|
||||||
|
$LoadDynamicArray_Load(context, structure, member, reference)$
|
||||||
|
%>
|
@ -3,8 +3,12 @@ delimiters "$", "$"
|
|||||||
// Everything related to loading an embedded reference
|
// Everything related to loading an embedded reference
|
||||||
|
|
||||||
LoadEmbedded_Load(context, structure, member, reference) ::= <<
|
LoadEmbedded_Load(context, structure, member, reference) ::= <<
|
||||||
|
$if(!member.IsLeaf)$
|
||||||
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
|
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
|
||||||
Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsDynamicMember)$true$else$false$endif$);
|
Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsAfterPartialLoad)$true$else$false$endif$);$\\$
|
||||||
|
$elseif(member.Computations.IsAfterPartialLoad)$
|
||||||
|
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(&$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$);$\\$
|
||||||
|
$endif$
|
||||||
>>
|
>>
|
||||||
|
|
||||||
LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <%
|
LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <%
|
||||||
@ -31,13 +35,21 @@ LoadEmbedded(context, structure, member, reference) ::= <%
|
|||||||
$LoadEmbedded_Block(context, structure, member, reference)$
|
$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$);$\\$
|
||||||
|
$elseif(member.Computations.IsAfterPartialLoad)$
|
||||||
|
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $reference.ArraySize$);$\\$
|
||||||
|
$endif$
|
||||||
|
>>
|
||||||
|
|
||||||
LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <%
|
LoadEmbeddedArray_TypeCheck(context, structure, member, reference) ::= <%
|
||||||
$if(member.IsScriptString)$
|
$if(member.IsScriptString)$
|
||||||
varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
|
varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
|
||||||
LoadScriptStringArray(false, $reference.ArraySize$);
|
LoadScriptStringArray(false, $reference.ArraySize$);
|
||||||
$else$
|
$else$
|
||||||
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
|
$LoadEmbeddedArray_Load(context, structure, member, reference)$
|
||||||
LoadArray_$member.Member.VariableType.Type.Name$(false, $reference.ArraySize$);
|
|
||||||
$endif$
|
$endif$
|
||||||
%>
|
%>
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import "Common.stg"
|
|||||||
|
|
||||||
import "Loading/Common.stg"
|
import "Loading/Common.stg"
|
||||||
import "Loading/ArrayPointer.stg"
|
import "Loading/ArrayPointer.stg"
|
||||||
|
import "Loading/DynamicArray.stg"
|
||||||
import "Loading/Embedded.stg"
|
import "Loading/Embedded.stg"
|
||||||
import "Loading/SinglePointer.stg"
|
import "Loading/SinglePointer.stg"
|
||||||
import "Loading/PointerArray.stg"
|
import "Loading/PointerArray.stg"
|
||||||
@ -82,7 +83,7 @@ $LoadMemberReference(context, structure, member, entry)$}$
|
|||||||
|
|
||||||
LoadMemberReference(context, structure, member, reference) ::= <%
|
LoadMemberReference(context, structure, member, reference) ::= <%
|
||||||
$if(reference.IsDynamicArray)$
|
$if(reference.IsDynamicArray)$
|
||||||
// Dynamic array $member.Member.Name$
|
$LoadDynamicArray(context, structure, member, reference)$
|
||||||
$elseif(reference.IsSinglePointer)$
|
$elseif(reference.IsSinglePointer)$
|
||||||
$LoadSinglePointer(context, structure, member, reference)$
|
$LoadSinglePointer(context, structure, member, reference)$
|
||||||
$elseif(reference.IsArrayPointer)$
|
$elseif(reference.IsArrayPointer)$
|
||||||
@ -166,7 +167,7 @@ $elseif(member.Computations.ContainsNonEmbeddedReference)$
|
|||||||
$LoadMemberCondition(context, structure, member)$
|
$LoadMemberCondition(context, structure, member)$
|
||||||
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
|
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
|
||||||
$LoadMemberCondition(context, structure, member)$
|
$LoadMemberCondition(context, structure, member)$
|
||||||
$elseif(member.Computations.IsDynamicMember)$
|
$elseif(member.Computations.IsAfterPartialLoad)$
|
||||||
$LoadMemberCondition(context, structure, member)$
|
$LoadMemberCondition(context, structure, member)$
|
||||||
$endif$
|
$endif$
|
||||||
|
|
||||||
@ -208,11 +209,7 @@ void $LoaderClassName(context.Asset)$::LoadPtr_$structure.Type.Name$(const bool
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$if(structure.Block.IsTemp)$
|
|
||||||
*$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToAlias(*$TypePtrVarName(structure.Type)$);
|
*$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToAlias(*$TypePtrVarName(structure.Type)$);
|
||||||
$else$
|
|
||||||
*$TypePtrVarName(structure.Type)$ = m_stream->ConvertOffsetToPointer(*$TypePtrVarName(structure.Type)$);
|
|
||||||
$endif$
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,13 +249,15 @@ void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atS
|
|||||||
$else$
|
$else$
|
||||||
m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$
|
m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$
|
||||||
$endif$
|
$endif$
|
||||||
|
$else$
|
||||||
|
assert(atStreamStart);$\\$
|
||||||
$endif$
|
$endif$
|
||||||
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$
|
$if(structure.IsAsset)$
|
||||||
|
|
||||||
m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$
|
m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$
|
||||||
$endif$
|
$endif$
|
||||||
$structure.OrderedMembers:{member | $LoadMemberIfNeedsTreatment(context, structure, member)$}$
|
$structure.OrderedMembers:{member | $LoadMemberIfNeedsTreatment(context, structure, member)$}$
|
||||||
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$
|
$if(structure.IsAsset)$
|
||||||
|
|
||||||
m_stream->PopBlock();
|
m_stream->PopBlock();
|
||||||
$endif$
|
$endif$
|
||||||
|
Loading…
x
Reference in New Issue
Block a user