mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 16:15:43 +00:00
165 lines
6.1 KiB
Plaintext
165 lines
6.1 KiB
Plaintext
delimiters "$", "$"
|
|
|
|
// Everything related to loading a pointer with a count that can be larger than 1
|
|
|
|
LoadArrayPointer_Loading(context, structure, member, reference) ::= <<
|
|
$if(member.Computations.IsTempBlock)$
|
|
$member.Member.VariableType.Type.FullName$* ptr = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
|
|
$endif$$\\$
|
|
|
|
$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$)); $\\$
|
|
// $member.Member.VariableType.Type.Alignment$$\\$
|
|
$\\$
|
|
$\\$
|
|
$if(member.Computations.IsTempBlock)$
|
|
|
|
$member.Member.VariableType.Type.FullName$** toInsert = nullptr;
|
|
if(ptr == PTR_INSERT)
|
|
toInsert = m_stream->InsertPointer<$member.Member.VariableType.Type.FullName$>();
|
|
|
|
$endif$$\\$
|
|
$\\$
|
|
$\\$
|
|
$if(member.StructureType && !member.StructureType.IsLeaf && !member.Computations.IsRuntimeBlock)$
|
|
$TypeVarName(member.Member.VariableType.Type)$ = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;
|
|
LoadArray_$member.Member.VariableType.Type.Name$(true, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$);$\\$
|
|
$else$
|
|
m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$);$\\$
|
|
$endif$$\\$
|
|
$\\$
|
|
$if(member.Computations.IsTempBlock)$
|
|
|
|
if(toInsert != nullptr)
|
|
*toInsert = $TypeVarName(structure.Type)$->$member.Member.Name$;$\\$
|
|
$endif$
|
|
>>
|
|
|
|
LoadArrayPointer_ScriptString(context, structure, member, reference) ::= <%
|
|
$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$));
|
|
// $member.Member.VariableType.Type.Alignment$
|
|
$\n$
|
|
|
|
varScriptString = $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$;$\n$
|
|
LoadScriptStringArray(true, $PrintEvaluation(reference.ArrayPointerCountEvaluation)$);
|
|
|
|
%>
|
|
|
|
LoadArrayPointer_TypeCheck(context, structure, member, reference) ::= <%
|
|
$if(member.IsScriptString)$
|
|
$LoadArrayPointer_ScriptString(context, structure, member, reference)$
|
|
$else$
|
|
$LoadArrayPointer_Loading(context, structure, member, reference)$
|
|
$endif$
|
|
%>
|
|
|
|
LoadArrayPointer_Reuse(context, structure, member, reference) ::= <<
|
|
$if(member.Computations.IsTempBlock)$
|
|
if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING || $TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_INSERT)
|
|
{
|
|
$LoadArrayPointer_TypeCheck(context, structure, member, reference)$
|
|
}
|
|
else
|
|
{
|
|
$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToAlias($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$);
|
|
}$\\$
|
|
$else$
|
|
if($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING)
|
|
{
|
|
$LoadArrayPointer_TypeCheck(context, structure, member, reference)$
|
|
}
|
|
else
|
|
{
|
|
$TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$);
|
|
}$\\$
|
|
$endif$
|
|
>>
|
|
|
|
LoadArrayPointer_PointerCheck(context, structure, member, reference) ::= <<
|
|
if ($TypeVarName(structure.Type)$->$member.Member.Name$$PrintArrayIndices(reference)$)
|
|
{
|
|
$if(member.IsReusable)$
|
|
$LoadArrayPointer_Reuse(context, structure, member, reference)$
|
|
$else$
|
|
$LoadArrayPointer_TypeCheck(context, structure, member, reference)$
|
|
$endif$
|
|
}
|
|
>>
|
|
|
|
LoadArrayPointer_Block(context, structure, member, reference) ::= <%
|
|
$if(member.Computations.IsNotDefaultNormalBlock)$
|
|
m_stream->PushBlock($member.Block.Name$);$\n$
|
|
$endif$
|
|
|
|
$LoadArrayPointer_PointerCheck(context, structure, member, reference)$
|
|
|
|
$if(member.Computations.IsNotDefaultNormalBlock)$
|
|
$\n$m_stream->PopBlock();
|
|
$endif$
|
|
%>
|
|
|
|
LoadArrayPointer(context, structure, member, reference) ::= <%
|
|
$LoadArrayPointer_Block(context, structure, member, reference)$
|
|
%>
|
|
|
|
LoadPointerArrayMethod_Loading(context, type, structure) ::= <%
|
|
*$TypePtrVarName(type)$ = m_stream->Alloc<$type.FullName$>(alignof($type.FullName$));
|
|
// $type.Alignment$
|
|
$\n$
|
|
|
|
$if(structure && !structure.IsLeaf)$
|
|
|
|
$TypeVarName(structure.Type)$ = *$TypePtrVarName(type)$;$\n$
|
|
Load_$type.Name$(true);
|
|
|
|
$else$
|
|
|
|
m_stream->Load<$type.FullName$>(*$TypePtrVarName(type)$);
|
|
|
|
$endif$
|
|
%>
|
|
|
|
LoadPointerArrayMethod_Asset(context, type, structure) ::= <<
|
|
$LoaderClassName(structure)$ loader(m_script_string_provider, m_zone, m_stream);
|
|
AddDependency(loader.Load($TypePtrVarName(type)$));
|
|
>>
|
|
|
|
LoadPointerArrayMethod_PointerCheck(context, type, structure, reusable) ::= <<
|
|
if (*$TypePtrVarName(type)$)
|
|
{
|
|
$if(structure && structure.IsAsset)$
|
|
$LoadPointerArrayMethod_Asset(context, type, structure)$
|
|
$else$
|
|
$if(reusable)$
|
|
if(*$TypePtrVarName(type)$ == PTR_FOLLOWING)
|
|
{
|
|
$LoadPointerArrayMethod_Loading(context, type, structure)$
|
|
}
|
|
else
|
|
{
|
|
*$TypePtrVarName(type)$ = m_stream->ConvertOffsetToPointer(*$TypePtrVarName(type)$);
|
|
}
|
|
$else$
|
|
$LoadPointerArrayMethod_Loading(context, type, structure)$
|
|
$endif$
|
|
$endif$
|
|
}
|
|
>>
|
|
|
|
LoadPointerArrayMethod(context, type, structure, reusable) ::= <<
|
|
void $LoaderClassName(context.Asset)$::LoadPtrArray_$SafeTypeName(type)$(const bool atStreamStart, const size_t count)
|
|
{
|
|
assert($TypePtrVarName(type)$ != nullptr);
|
|
|
|
if(atStreamStart)
|
|
m_stream->Load<$type.FullName$*>($TypePtrVarName(type)$, count);
|
|
|
|
$type.FullName$** var = $TypePtrVarName(type)$;
|
|
for(size_t index = 0; index < count; index++)
|
|
{
|
|
$TypePtrVarName(type)$ = var;
|
|
$LoadPointerArrayMethod_PointerCheck(context, type, structure, reusable)$
|
|
|
|
var++;
|
|
}
|
|
}
|
|
>> |