ZoneCodeGenerator: Add support for scriptstring array pointers

This commit is contained in:
Jan 2019-11-24 02:46:40 +01:00
parent 1606f62ee7
commit b8bd20f693
3 changed files with 39 additions and 12 deletions

View File

@ -17,40 +17,48 @@ m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingRefer
$endif$ $endif$
%> %>
LoadArrayPointer_ScriptString(context, structure, member, reference) ::= <%
$TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->Alloc<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$>(alignof($TypeDeclaration(member.Member.VariableType)$$PrintFollowingReferences(reference.FollowingReferences)$));$\n$
varScriptString = $TypeVarName(structure)$->$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_PointerCheck(context, structure, member, reference) ::= << LoadArrayPointer_PointerCheck(context, structure, member, reference) ::= <<
if ($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$) if ($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$)
{ {
$if(member.IsReusable)$ $if(member.IsReusable)$
if($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING) if($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING)
{ {
$LoadArrayPointer_Loading(context, structure, member, reference)$ $LoadArrayPointer_TypeCheck(context, structure, member, reference)$
} }
else else
{ {
$TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$); $TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$);
} }
$else$ $else$
$LoadArrayPointer_Loading(context, structure, member, reference)$ $LoadArrayPointer_TypeCheck(context, structure, member, reference)$
$endif$ $endif$
} }
>> >>
LoadArrayPointer_TypeCheck(context, structure, member, reference) ::= <%
$if(member.IsScriptString)$
// ScriptString $member.Member.Name$
$else$
$LoadArrayPointer_PointerCheck(context, structure, member, reference)$
$endif$
%>
LoadArrayPointer_Condition(context, structure, member, reference) ::= << LoadArrayPointer_Condition(context, structure, member, reference) ::= <<
$if(member.Condition)$$\\$ $if(member.Condition)$$\\$
if($PrintEvaluation(member.Condition)$) if($PrintEvaluation(member.Condition)$)
{ {
$LoadArrayPointer_TypeCheck(context, structure, member, reference)$ $LoadArrayPointer_PointerCheck(context, structure, member, reference)$
} }
$else$$\\$ $else$$\\$
$LoadArrayPointer_TypeCheck(context, structure, member, reference)$$\\$ $LoadArrayPointer_PointerCheck(context, structure, member, reference)$$\\$
$endif$ $endif$
>> >>

View File

@ -1,4 +1,5 @@
#include "AssetLoader.h" #include "AssetLoader.h"
#include <cassert>
AssetLoader::AssetLoader(const asset_type_t assetType, IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream) AssetLoader::AssetLoader(const asset_type_t assetType, IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream)
{ {
@ -47,6 +48,20 @@ scr_string_t AssetLoader::UseScriptString(const scr_string_t scrString)
return scriptStringIndex; return scriptStringIndex;
} }
void AssetLoader::LoadScriptStringArray(const bool atStreamStart, const size_t count)
{
assert(varScriptString != nullptr);
if (atStreamStart)
m_stream->Load<scr_string_t>(varScriptString, count);
for (size_t index = 0; index < count; index++)
{
*varScriptString = UseScriptString(*varScriptString);
varScriptString++;
}
}
void* AssetLoader::LinkAsset(std::string name, void* asset) void* AssetLoader::LinkAsset(std::string name, void* asset)
{ {
return m_zone->GetPools()->AddAsset(m_asset_type, std::move(name), asset, m_used_script_strings, m_dependencies); return m_zone->GetPools()->AddAsset(m_asset_type, std::move(name), asset, m_used_script_strings, m_dependencies);

View File

@ -14,10 +14,14 @@ class AssetLoader : public ContentLoader
protected: protected:
IZoneScriptStringProvider* m_script_string_provider; IZoneScriptStringProvider* m_script_string_provider;
scr_string_t* varScriptString;
AssetLoader(asset_type_t assetType, IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream); AssetLoader(asset_type_t assetType, IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream);
void AddDependency(asset_type_t type, std::string& name); void AddDependency(asset_type_t type, std::string& name);
scr_string_t UseScriptString(scr_string_t scrString); scr_string_t UseScriptString(scr_string_t scrString);
void LoadScriptStringArray(bool atStreamStart, size_t count);
void* LinkAsset(std::string name, void* asset); void* LinkAsset(std::string name, void* asset);
}; };