mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-07-01 00:31:56 +00:00
ZoneCodeGenerator: Make unions work with conditions and only load one union member at a time consistently
This commit is contained in:
@ -73,6 +73,12 @@ namespace ZoneCodeGenerator.Generating.Computations
|
||||
public bool IsNotDefaultNormalBlock =>
|
||||
information.Block != null && !(information.Block.IsNormal && information.Block.IsDefault);
|
||||
|
||||
public bool IsFirstMember =>
|
||||
information.Parent.OrderedMembers.FirstOrDefault(member => !member.IsLeaf && !member.Computations.ShouldIgnore) == information;
|
||||
|
||||
public bool IsLastMember =>
|
||||
information.Parent.OrderedMembers.LastOrDefault(member => !member.IsLeaf && !member.Computations.ShouldIgnore) == information;
|
||||
|
||||
public MemberReferenceComputations References => new MemberReferenceComputations(information);
|
||||
|
||||
public MemberComputations(MemberInformation information)
|
||||
|
@ -79,35 +79,86 @@ Loading member $member.Member.Name$
|
||||
|
||||
LoadMemberReference(context, structure, member, reference) ::= <%
|
||||
$if(reference.IsSinglePointer)$
|
||||
$\n$$\n$
|
||||
$LoadSinglePointer(context, structure, member, reference)$
|
||||
$elseif(reference.IsArrayPointer)$
|
||||
$\n$$\n$
|
||||
$LoadArrayPointer(context, structure, member, reference)$
|
||||
$elseif(reference.IsPointerArray)$
|
||||
$\n$$\n$
|
||||
$LoadPointerArray(context, structure, member, reference)$
|
||||
$elseif(reference.IsArray && !reference.NextReference)$
|
||||
$\n$$\n$
|
||||
$LoadEmbeddedArray(context, structure, member, reference)$
|
||||
$elseif(!reference.Reference)$
|
||||
$\n$$\n$
|
||||
$LoadEmbedded(context, structure, member, reference)$
|
||||
$else$
|
||||
$\n$$\n$
|
||||
// $member.Member.Name$
|
||||
$endif$
|
||||
%>
|
||||
|
||||
LoadMemberCondition_Struct(context, structure, member) ::= <<
|
||||
|
||||
|
||||
$if(member.Condition)$
|
||||
if($PrintEvaluation(member.Condition)$)
|
||||
{
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
}$\\$
|
||||
$else$
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$$\\$
|
||||
$endif$
|
||||
>>
|
||||
|
||||
LoadMemberCondition_Union(context, structure, member) ::= <<
|
||||
$if(member.Computations.IsFirstMember)$$\\$
|
||||
$if(member.Condition)$
|
||||
|
||||
if($PrintEvaluation(member.Condition)$)
|
||||
{
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
}$\\$
|
||||
$else$
|
||||
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$$\\$
|
||||
$endif$$\\$
|
||||
$elseif(member.Computations.IsLastMember)$$\\$
|
||||
$if(member.Condition)$
|
||||
else if($PrintEvaluation(member.Condition)$)
|
||||
{
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
}$\\$
|
||||
$else$
|
||||
else
|
||||
{
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
}$\\$
|
||||
$endif$$\\$
|
||||
$else$$\\$
|
||||
$if(member.Condition)$
|
||||
else if($PrintEvaluation(member.Condition)$)
|
||||
{
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
}$\\$
|
||||
$else$$\\$
|
||||
#error Middle member of union must have condition ($member.Member.Name$)
|
||||
$endif$$\\$
|
||||
$endif$
|
||||
>>
|
||||
|
||||
LoadMemberCondition(context, structure, member) ::= <%
|
||||
$if(structure.IsUnion)$
|
||||
$LoadMemberCondition_Union(context, structure, member)$
|
||||
$else$
|
||||
$LoadMemberCondition_Struct(context, structure, member)$
|
||||
$endif$
|
||||
%>
|
||||
|
||||
LoadMemberIfNeedsTreatment(context, structure, member) ::= <%
|
||||
$if(!member.Computations.ShouldIgnore)$
|
||||
|
||||
$if(member.IsString || member.IsScriptString)$
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$elseif(member.Computations.ContainsNonEmbeddedReference)$
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
|
||||
$LoadMemberReference(context, structure, member, member.Computations.References)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$endif$
|
||||
|
||||
$endif$
|
||||
|
Reference in New Issue
Block a user