mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 16:15:43 +00:00
ZoneCodeGenerator: Add ability to split loading of a structure due to a dynamic member
This commit is contained in:
parent
0db6f90980
commit
236108e5fb
@ -88,10 +88,9 @@ namespace ZoneCodeGenerator.Generating.Computations
|
||||
.OfType<ReferenceTypeArray>()
|
||||
.Any(array => array.DynamicSize != null);
|
||||
|
||||
public bool IsBarrier => HasDynamicArraySize ||
|
||||
information.StructureType != null &&
|
||||
information.StructureType != information.Parent &&
|
||||
information.StructureType.Computations.Barrier != null;
|
||||
public bool IsDynamicMember => HasDynamicArraySize ||
|
||||
!ContainsNonEmbeddedReference &&
|
||||
information.StructureType?.Computations.DynamicMember != null;
|
||||
|
||||
public MemberReferenceComputations References => new MemberReferenceComputations(information);
|
||||
|
||||
|
@ -61,6 +61,9 @@ namespace ZoneCodeGenerator.Generating.Computations
|
||||
? referenceTypePointer.Count
|
||||
: null;
|
||||
|
||||
public bool IsDynamicArray =>
|
||||
Reference is ReferenceTypeArray referenceTypeArray && referenceTypeArray.DynamicSize != null;
|
||||
|
||||
public MemberReferenceComputations(MemberInformation information)
|
||||
{
|
||||
this.information = information;
|
||||
|
@ -12,8 +12,8 @@ namespace ZoneCodeGenerator.Generating.Computations
|
||||
|
||||
public bool IsUsed => information.Usages.Any();
|
||||
|
||||
public MemberInformation Barrier =>
|
||||
information.OrderedMembers.FirstOrDefault(memberInformation => memberInformation.Computations.IsBarrier);
|
||||
public MemberInformation DynamicMember =>
|
||||
information.OrderedMembers.FirstOrDefault(memberInformation => memberInformation.Computations.IsDynamicMember);
|
||||
|
||||
public StructureComputations(StructureInformation information)
|
||||
{
|
||||
|
@ -4,7 +4,7 @@ delimiters "$", "$"
|
||||
|
||||
LoadEmbedded_Load(context, structure, member, reference) ::= <<
|
||||
$TypeVarName(member.Member.VariableType.Type)$ = &$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
|
||||
Load_$member.Member.VariableType.Type.Name$(false);
|
||||
Load_$member.Member.VariableType.Type.Name$($if(member.Computations.IsDynamicMember)$true$else$false$endif$);
|
||||
>>
|
||||
|
||||
LoadEmbedded_TypeCheck(context, structure, member, reference) ::= <%
|
||||
|
@ -81,7 +81,9 @@ $LoadMemberReference(context, structure, member, entry)$}$
|
||||
>>
|
||||
|
||||
LoadMemberReference(context, structure, member, reference) ::= <%
|
||||
$if(reference.IsSinglePointer)$
|
||||
$if(reference.IsDynamicArray)$
|
||||
// Dynamic array $member.Member.Name$
|
||||
$elseif(reference.IsSinglePointer)$
|
||||
$LoadSinglePointer(context, structure, member, reference)$
|
||||
$elseif(reference.IsArrayPointer)$
|
||||
$LoadArrayPointer(context, structure, member, reference)$
|
||||
@ -164,6 +166,8 @@ $elseif(member.Computations.ContainsNonEmbeddedReference)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$elseif(member.StructureType && !member.StructureType.IsLeaf)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$elseif(member.Computations.IsDynamicMember)$
|
||||
$LoadMemberCondition(context, structure, member)$
|
||||
$endif$
|
||||
|
||||
$endif$
|
||||
@ -238,10 +242,17 @@ void $LoaderClassName(context.Asset)$::LoadArray_$type.Name$(const bool atStream
|
||||
LoadMethod(context, structure) ::= <<
|
||||
void $LoaderClassName(context.Asset)$::Load_$structure.Type.Name$(const bool atStreamStart)
|
||||
{
|
||||
assert($TypeVarName(structure.Type)$ != nullptr);
|
||||
assert($TypeVarName(structure.Type)$ != nullptr);$\\$
|
||||
|
||||
$if(!(structure.IsUnion && structure.Computations.DynamicMember))$
|
||||
|
||||
if(atStreamStart)
|
||||
$if(!structure.Computations.DynamicMember)$
|
||||
m_stream->Load<$structure.Type.FullName$>($TypeVarName(structure.Type)$);$\\$
|
||||
$else$
|
||||
m_stream->LoadPartial<$structure.Type.FullName$>($TypeVarName(structure.Type)$, offsetof($structure.Type.FullName$, $structure.Computations.DynamicMember.Member.Name$));$\\$
|
||||
$endif$
|
||||
$endif$
|
||||
$if(structure.ReferenceFromNonDefaultNormalBlockExists || structure.IsAsset)$
|
||||
|
||||
m_stream->PushBlock($context.DefaultNormalBlock.Name$);$\\$
|
||||
|
@ -32,6 +32,10 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor
|
||||
if (!hasNoPointerMembers)
|
||||
return false;
|
||||
|
||||
// If the member has an embedded type with dynamic size
|
||||
if (member.Computations.HasDynamicArraySize)
|
||||
return false;
|
||||
|
||||
if (member.StructureType != null
|
||||
&& member.StructureType != structureInformation
|
||||
&& !IsLeaf(member.StructureType))
|
||||
|
@ -29,6 +29,9 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor
|
||||
if (!hasNoPointerMembers)
|
||||
return false;
|
||||
|
||||
if (member.Computations.HasDynamicArraySize)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,12 @@ public:
|
||||
LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), count * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void LoadPartial(T* dst, const size_t size)
|
||||
{
|
||||
LoadDataInBlock(const_cast<void*>(reinterpret_cast<const void*>(dst)), size);
|
||||
}
|
||||
|
||||
virtual void** InsertPointer() = 0;
|
||||
template<typename T>
|
||||
T** InsertPointer()
|
||||
|
Loading…
x
Reference in New Issue
Block a user