diff --git a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg index 45ed2c9a..e9d4bd6c 100644 --- a/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg +++ b/src/ZoneCodeGenerator/Generating/Templates/Loading/ArrayPointer.stg @@ -17,40 +17,48 @@ m_stream->Load<$TypeDeclaration(member.Member.VariableType)$$PrintFollowingRefer $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) ::= << if ($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$) { $if(member.IsReusable)$ if($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ == PTR_FOLLOWING) { - $LoadArrayPointer_Loading(context, structure, member, reference)$ + $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ } else { $TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$ = m_stream->ConvertOffsetToPointer($TypeVarName(structure)$->$member.Member.Name$$PrintArrayIndices(reference)$); } $else$ - $LoadArrayPointer_Loading(context, structure, member, reference)$ + $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ $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) ::= << $if(member.Condition)$$\\$ if($PrintEvaluation(member.Condition)$) { - $LoadArrayPointer_TypeCheck(context, structure, member, reference)$ + $LoadArrayPointer_PointerCheck(context, structure, member, reference)$ } $else$$\\$ -$LoadArrayPointer_TypeCheck(context, structure, member, reference)$$\\$ +$LoadArrayPointer_PointerCheck(context, structure, member, reference)$$\\$ $endif$ >> diff --git a/src/ZoneLoading/Loading/AssetLoader.cpp b/src/ZoneLoading/Loading/AssetLoader.cpp index 0beef1c0..b6a94421 100644 --- a/src/ZoneLoading/Loading/AssetLoader.cpp +++ b/src/ZoneLoading/Loading/AssetLoader.cpp @@ -1,4 +1,5 @@ #include "AssetLoader.h" +#include 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; } +void AssetLoader::LoadScriptStringArray(const bool atStreamStart, const size_t count) +{ + assert(varScriptString != nullptr); + + if (atStreamStart) + m_stream->Load(varScriptString, count); + + for (size_t index = 0; index < count; index++) + { + *varScriptString = UseScriptString(*varScriptString); + varScriptString++; + } +} + 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); diff --git a/src/ZoneLoading/Loading/AssetLoader.h b/src/ZoneLoading/Loading/AssetLoader.h index a0196a5a..c2ef9933 100644 --- a/src/ZoneLoading/Loading/AssetLoader.h +++ b/src/ZoneLoading/Loading/AssetLoader.h @@ -14,10 +14,14 @@ class AssetLoader : public ContentLoader protected: IZoneScriptStringProvider* m_script_string_provider; + scr_string_t* varScriptString; + AssetLoader(asset_type_t assetType, IZoneScriptStringProvider* scriptStringProvider, Zone* zone, IZoneInputStream* stream); void AddDependency(asset_type_t type, std::string& name); + scr_string_t UseScriptString(scr_string_t scrString); + void LoadScriptStringArray(bool atStreamStart, size_t count); void* LinkAsset(std::string name, void* asset); };