refactor: generate combined asset loader/writer/marker headers per variant

This commit is contained in:
Jan Laupetin committed 2026-10-22 20:01:05 +02:00
1 parent 884fefd1db
commit 8490c09fad
49 files changed
+408 -368

No files matched your search

+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderIW3.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW3/AssetMarkerIW3.h"
#include "Game/IW3/AssetMarkerIW3_pc.h"
#include "Game/IW3/Font/FontLoaderIW3.h"
#include "Game/IW3/GameIW3.h"
#include "Game/IW3/IW3.h"
+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderIW4.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW4/AssetMarkerIW4.h"
#include "Game/IW4/AssetMarkerIW4_pc32.h"
#include "Game/IW4/Font/FontLoaderIW4.h"
#include "Game/IW4/GameIW4.h"
#include "Game/IW4/IW4.h"
+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderIW5.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/IW5/AssetMarkerIW5.h"
#include "Game/IW5/AssetMarkerIW5_pc32.h"
#include "Game/IW5/Font/FontLoaderIW5.h"
#include "Game/IW5/GameIW5.h"
#include "Game/IW5/IW5.h"
+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderQOS.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/QOS/AssetMarkerQOS.h"
#include "Game/QOS/AssetMarkerQOS_pc.h"
#include "Game/QOS/QOS.h"
#include "Localize/AssetLoaderLocalizeQOS.h"
#include "RawFile/AssetLoaderRawFileQOS.h"
+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderT4.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/T4/AssetMarkerT4.h"
#include "Game/T4/AssetMarkerT4_pc.h"
#include "Game/T4/Font/FontLoaderT4.h"
#include "Game/T4/Image/ImageLoaderEmbeddedT4.h"
#include "Game/T4/Image/ImageLoaderExternalT4.h"
+1 -1
View File
@@ -1,7 +1,7 @@
#include "ObjLoaderT5.h"
#include "Asset/GlobalAssetPoolsLoader.h"
#include "Game/T5/AssetMarkerT5.h"
#include "Game/T5/AssetMarkerT5_pc.h"
#include "Game/T5/Font/FontLoaderT5.h"
#include "Game/T5/GameT5.h"
#include "Game/T5/Image/ImageLoaderEmbeddedT5.h"
+1 -1
View File
@@ -3,7 +3,7 @@
#include "Asset/GlobalAssetPoolsLoader.h"
#include "FontIcon/CsvLoaderFontIconT6.h"
#include "FontIcon/JsonLoaderFontIconT6.h"
#include "Game/T6/AssetMarkerT6.h"
#include "Game/T6/AssetMarkerT6_pc.h"
#include "Game/T6/CommonT6.h"
#include "Game/T6/Font/FontLoaderT6.h"
#include "Game/T6/GameT6.h"
+17 -11
View File
@@ -306,6 +306,8 @@ function ZoneCode:allTestFiles()
for i, variantName in ipairs(gameData.Variants) do
local variantLower = string.lower(variantName)
-- Per asset
for j, assetName in ipairs(gameData.Assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_struct_test.cpp")
@@ -324,15 +326,17 @@ function ZoneCode:allMarkFiles()
for i, variantName in ipairs(gameData.Variants) do
local variantLower = string.lower(variantName)
-- Per asset
for j, assetName in ipairs(gameData.Assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_mark_db.cpp")
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_mark_db.h")
end
-- Per variant
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetMarker" .. game .. "_" .. variantLower .. ".h")
end
-- PerTemplate
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetMarker" .. game .. ".h")
end
return result
@@ -346,16 +350,17 @@ function ZoneCode:allLoadFiles()
for i, variantName in ipairs(gameData.Variants) do
local variantLower = string.lower(variantName)
-- Per Asset/Variant
-- Per asset
for j, assetName in ipairs(gameData.Assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_load_db.cpp")
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_load_db.h")
end
-- Per variant
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetLoader" .. game .. "_" .. variantLower .. ".h")
end
-- PerTemplate
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetLoader" .. game .. ".h")
end
return result
@@ -369,16 +374,17 @@ function ZoneCode:allWriteFiles()
for i, variantName in ipairs(gameData.Variants) do
local variantLower = string.lower(variantName)
-- Per Asset/Variant
-- Per asset
for j, assetName in ipairs(gameData.Assets) do
local assetNameLower = string.lower(assetName)
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_write_db.cpp")
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/XAssets/" .. assetNameLower .. "/" .. assetNameLower .. "_" .. gameLower .. "_" .. variantName .. "_write_db.h")
end
-- Per variant
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetWriter" .. game .. "_" .. variantLower .. ".h")
end
-- PerTemplate
table.insert(result, "%{wks.location}/src/ZoneCode/Game/" .. game .. "/AssetWriter" .. game .. ".h")
end
return result
@@ -1,25 +0,0 @@
#include "BaseRenderingContext.h"
BaseRenderingContext::BaseRenderingContext(std::string game, const GameVariant* variant, std::vector<const FastFileBlock*> fastFileBlocks)
: m_game(std::move(game)),
m_word_size_mismatch(variant->m_word_size != OWN_WORD_SIZE),
m_word_size(variant->m_word_size),
m_pointer_size(GetPointerSizeForWordSize(variant->m_word_size)),
m_endianness_mismatch(std::endian::native != variant->m_endianness),
m_endianness(variant->m_endianness),
m_blocks(std::move(fastFileBlocks)),
m_default_normal_block(nullptr),
m_default_temp_block(nullptr),
m_variant(variant)
{
for (const auto* block : m_blocks)
{
if (block->m_is_default)
{
if (block->m_type == FastFileBlockType::NORMAL && m_default_normal_block == nullptr)
m_default_normal_block = block;
else if (block->m_type == FastFileBlockType::TEMP && m_default_temp_block == nullptr)
m_default_temp_block = block;
}
}
}
@@ -1,26 +0,0 @@
#pragma once
#include "Persistence/IDataRepository.h"
#include <string>
#include <vector>
class BaseRenderingContext
{
public:
std::string m_game;
bool m_word_size_mismatch;
WordSize m_word_size;
unsigned m_pointer_size;
bool m_endianness_mismatch;
std::endian m_endianness;
std::vector<const FastFileBlock*> m_blocks;
const FastFileBlock* m_default_normal_block;
const FastFileBlock* m_default_temp_block;
const GameVariant* m_variant;
protected:
BaseRenderingContext(std::string game, const GameVariant* variant, std::vector<const FastFileBlock*> fastFileBlocks);
};
@@ -15,6 +15,25 @@
namespace fs = std::filesystem;
namespace
{
void LogDirtyCheckResult(const utils::TextFileCheckDirtyResult result, const std::string_view forWhat)
{
switch (result)
{
case utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN:
con::info("Successfully generated code for {}", forWhat);
break;
case utils::TextFileCheckDirtyResult::OUTPUT_WAS_UP_TO_DATE:
con::info("Code was up to date for {}", forWhat);
break;
case utils::TextFileCheckDirtyResult::FAILURE:
con::error("Failed to generate code for {}", forWhat);
break;
}
}
} // namespace
CodeGenerator::CodeGenerator(const ZoneCodeGeneratorArguments* args)
: m_args(args)
{
@@ -29,7 +48,7 @@ void CodeGenerator::SetupTemplates()
m_template_mapping["assetstructtests"] = std::make_unique<AssetStructTestsTemplate>();
}
utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerTemplate(const OncePerTemplateRenderingContext& context, ICodeTemplate* codeTemplate) const
utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerTemplate(const PerTemplateRenderingContext& context, ICodeTemplate* codeTemplate) const
{
bool wroteAtLeastOneFile = false;
for (const auto& codeFile : codeTemplate->GetFilesToRenderOncePerTemplate(context))
@@ -60,7 +79,38 @@ utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerTemplate(const
return wroteAtLeastOneFile ? utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN : utils::TextFileCheckDirtyResult::OUTPUT_WAS_UP_TO_DATE;
}
utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerAsset(const OncePerAssetRenderingContext& context, ICodeTemplate* codeTemplate) const
utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerVariant(const PerVariantRenderingContext& context, ICodeTemplate* codeTemplate) const
{
bool wroteAtLeastOneFile = false;
for (const auto& codeFile : codeTemplate->GetFilesToRenderOncePerVariant(context))
{
fs::path outputPath(m_args->m_output_directory);
outputPath.append(codeFile.m_file_name);
utils::TextFileCheckDirtyOutput out(outputPath);
if (!out.Open())
{
con::error("Failed to open file '{}'", outputPath.string());
return utils::TextFileCheckDirtyResult::FAILURE;
}
codeTemplate->RenderOncePerVariantFile(out.Stream(), codeFile.m_tag, context);
const auto fileResult = out.Close();
if (fileResult == utils::TextFileCheckDirtyResult::FAILURE)
{
con::error("Failed to write file '{}'", outputPath.string());
return utils::TextFileCheckDirtyResult::FAILURE;
}
if (fileResult == utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN)
wroteAtLeastOneFile = true;
}
return wroteAtLeastOneFile ? utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN : utils::TextFileCheckDirtyResult::OUTPUT_WAS_UP_TO_DATE;
}
utils::TextFileCheckDirtyResult CodeGenerator::GenerateCodeOncePerAsset(const PerAssetRenderingContext& context, ICodeTemplate* codeTemplate) const
{
bool wroteAtLeastOneFile = false;
for (const auto& codeFile : codeTemplate->GetFilesToRenderOncePerAsset(context))
@@ -145,39 +195,31 @@ bool CodeGenerator::GenerateCode(const IDataRepository* repository)
{
for (auto* asset : assets)
{
auto context = OncePerAssetRenderingContext::BuildContext(repository, asset, variant);
auto context = std::make_unique<PerAssetRenderingContext>(repository, asset, variant);
const auto result = GenerateCodeOncePerAsset(*context, foundTemplate->second.get());
switch (result)
{
case utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN:
con::info("Successfully generated code for asset '{}' with preset '{}'", asset->m_definition->GetFullName(), foundTemplate->first);
break;
case utils::TextFileCheckDirtyResult::OUTPUT_WAS_UP_TO_DATE:
con::info("Code was up to date for asset '{}' with preset '{}'", asset->m_definition->GetFullName(), foundTemplate->first);
break;
case utils::TextFileCheckDirtyResult::FAILURE:
con::error("Failed to generate code for asset '{}' with preset '{}'", asset->m_definition->GetFullName(), foundTemplate->first);
LogDirtyCheckResult(
result,
std::format("for asset '{}' with variant '{}' and preset '{}'", asset->m_definition->GetFullName(), variant->m_name, foundTemplate->first));
if (result == utils::TextFileCheckDirtyResult::FAILURE)
return false;
}
}
{
auto context = OncePerTemplateRenderingContext::BuildContext(repository, variant);
const auto result = GenerateCodeOncePerTemplate(*context, foundTemplate->second.get());
switch (result)
{
case utils::TextFileCheckDirtyResult::OUTPUT_WRITTEN:
con::info("Successfully generated code with preset '{}'", foundTemplate->first);
break;
case utils::TextFileCheckDirtyResult::OUTPUT_WAS_UP_TO_DATE:
con::info("Code was up to date for preset '{}'", foundTemplate->first);
break;
case utils::TextFileCheckDirtyResult::FAILURE:
con::error("Failed to generate code with preset '{}'", foundTemplate->first);
auto context = std::make_unique<PerVariantRenderingContext>(repository, variant);
const auto result = GenerateCodeOncePerVariant(*context, foundTemplate->second.get());
LogDirtyCheckResult(result, std::format("for variant '{}' with preset '{}'", variant->m_name, foundTemplate->first));
if (result == utils::TextFileCheckDirtyResult::FAILURE)
return false;
}
}
}
{
auto context = std::make_unique<PerTemplateRenderingContext>(repository);
const auto result = GenerateCodeOncePerTemplate(*context, foundTemplate->second.get());
LogDirtyCheckResult(result, std::format("for preset '{}'", foundTemplate->first));
if (result == utils::TextFileCheckDirtyResult::FAILURE)
return false;
}
}
const auto end = std::chrono::steady_clock::now();
const auto timeInMs = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
@@ -18,8 +18,9 @@ public:
private:
void SetupTemplates();
utils::TextFileCheckDirtyResult GenerateCodeOncePerTemplate(const OncePerTemplateRenderingContext& context, ICodeTemplate* codeTemplate) const;
utils::TextFileCheckDirtyResult GenerateCodeOncePerAsset(const OncePerAssetRenderingContext& context, ICodeTemplate* codeTemplate) const;
utils::TextFileCheckDirtyResult GenerateCodeOncePerTemplate(const PerTemplateRenderingContext& context, ICodeTemplate* codeTemplate) const;
utils::TextFileCheckDirtyResult GenerateCodeOncePerVariant(const PerVariantRenderingContext& context, ICodeTemplate* codeTemplate) const;
utils::TextFileCheckDirtyResult GenerateCodeOncePerAsset(const PerAssetRenderingContext& context, ICodeTemplate* codeTemplate) const;
static bool GetAssetWithName(const IDataRepository* repository, const std::string& name, StructureInformation*& asset);
@@ -1,7 +1,7 @@
#pragma once
#include "OncePerAssetRenderingContext.h"
#include "OncePerTemplateRenderingContext.h"
#include "PerAssetRenderingContext.h"
#include "PerTemplateRenderingContext.h"
#include <ostream>
#include <string>
@@ -32,17 +32,24 @@ public:
ICodeTemplate& operator=(const ICodeTemplate& other) = default;
ICodeTemplate& operator=(ICodeTemplate&& other) noexcept = default;
virtual std::vector<CodeTemplateFile> GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context)
virtual std::vector<CodeTemplateFile> GetFilesToRenderOncePerTemplate(const PerTemplateRenderingContext& context)
{
return {};
}
virtual void RenderOncePerTemplateFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context) {}
virtual void RenderOncePerTemplateFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerTemplateRenderingContext& context) {}
virtual std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
virtual std::vector<CodeTemplateFile> GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context)
{
return {};
}
virtual void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) {}
virtual void RenderOncePerVariantFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context) {}
virtual std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context)
{
return {};
}
virtual void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context) {}
};
@@ -1,39 +0,0 @@
#include "OncePerTemplateRenderingContext.h"
#include "Domain/Computations/StructureComputations.h"
#include <algorithm>
OncePerTemplateRenderingContext::OncePerTemplateRenderingContext(std::string game,
const GameVariant* variant,
std::vector<const FastFileBlock*> fastFileBlocks,
std::vector<StructureInformation*> assets)
: BaseRenderingContext(std::move(game), variant, std::move(fastFileBlocks)),
m_assets(std::move(assets))
{
for (const auto* block : m_blocks)
{
if (block->m_is_default)
{
if (block->m_type == FastFileBlockType::NORMAL && m_default_normal_block == nullptr)
m_default_normal_block = block;
else if (block->m_type == FastFileBlockType::TEMP && m_default_temp_block == nullptr)
m_default_temp_block = block;
}
}
}
std::unique_ptr<OncePerTemplateRenderingContext> OncePerTemplateRenderingContext::BuildContext(const IDataRepository* repository, const GameVariant* variant)
{
std::vector<StructureInformation*> assetInformation;
for (auto* info : repository->GetAllStructureInformation())
{
if (!StructureComputations(info).IsAsset())
continue;
assetInformation.emplace_back(info);
}
return std::make_unique<OncePerTemplateRenderingContext>(
OncePerTemplateRenderingContext(repository->GetGameName(), variant, repository->GetAllFastFileBlocks(), assetInformation));
}
@@ -1,21 +0,0 @@
#pragma once
#include "BaseRenderingContext.h"
#include "Persistence/IDataRepository.h"
#include <string>
#include <vector>
class OncePerTemplateRenderingContext : public BaseRenderingContext
{
public:
static std::unique_ptr<OncePerTemplateRenderingContext> BuildContext(const IDataRepository* repository, const GameVariant* variant);
std::vector<StructureInformation*> m_assets;
private:
OncePerTemplateRenderingContext(std::string game,
const GameVariant* variant,
std::vector<const FastFileBlock*> fastFileBlocks,
std::vector<StructureInformation*> assets);
};
@@ -1,4 +1,4 @@
#include "OncePerAssetRenderingContext.h"
#include "PerAssetRenderingContext.h"
#include "Domain/Computations/MemberComputations.h"
#include "Domain/Computations/StructureComputations.h"
@@ -18,24 +18,16 @@ RenderingUsedType::RenderingUsedType(const DataDefinition* type, StructureInform
{
}
OncePerAssetRenderingContext::OncePerAssetRenderingContext(std::string game, const GameVariant* variant, std::vector<const FastFileBlock*> fastFileBlocks)
: BaseRenderingContext(std::move(game), variant, std::move(fastFileBlocks)),
PerAssetRenderingContext::PerAssetRenderingContext(const IDataRepository* repository, StructureInformation* asset, const GameVariant* variant)
: PerVariantRenderingContext(repository, variant),
m_asset(nullptr),
m_has_actions(false)
{
for (const auto* block : m_blocks)
{
if (block->m_is_default)
{
if (block->m_type == FastFileBlockType::NORMAL && m_default_normal_block == nullptr)
m_default_normal_block = block;
else if (block->m_type == FastFileBlockType::TEMP && m_default_temp_block == nullptr)
m_default_temp_block = block;
}
}
MakeAsset(repository, asset);
CreateUsedTypeCollections();
}
RenderingUsedType* OncePerAssetRenderingContext::AddUsedType(std::unique_ptr<RenderingUsedType> usedType)
RenderingUsedType* PerAssetRenderingContext::AddUsedType(std::unique_ptr<RenderingUsedType> usedType)
{
auto* result = usedType.get();
m_used_types.push_back(usedType.get());
@@ -44,8 +36,7 @@ RenderingUsedType* OncePerAssetRenderingContext::AddUsedType(std::unique_ptr<Ren
return result;
}
RenderingUsedType*
OncePerAssetRenderingContext::GetBaseType(const IDataRepository* repository, const MemberComputations* computations, RenderingUsedType* usedType)
RenderingUsedType* PerAssetRenderingContext::GetBaseType(const IDataRepository* repository, const MemberComputations* computations, RenderingUsedType* usedType)
{
if (usedType->m_type->GetType() == DataDefinitionType::TYPEDEF)
{
@@ -73,7 +64,7 @@ RenderingUsedType*
return nullptr;
}
void OncePerAssetRenderingContext::AddMembersToContext(const IDataRepository* repository, const StructureInformation* info)
void PerAssetRenderingContext::AddMembersToContext(const IDataRepository* repository, const StructureInformation* info)
{
for (const auto& member : info->m_ordered_members)
{
@@ -117,7 +108,7 @@ void OncePerAssetRenderingContext::AddMembersToContext(const IDataRepository* re
}
}
void OncePerAssetRenderingContext::ScanUsedTypeIfNeeded(const IDataRepository* repository, const MemberComputations* computations, RenderingUsedType* usedType)
void PerAssetRenderingContext::ScanUsedTypeIfNeeded(const IDataRepository* repository, const MemberComputations* computations, RenderingUsedType* usedType)
{
if (usedType->m_info != nullptr && !StructureComputations(usedType->m_info).IsAsset() && !computations->IsInRuntimeBlock() && !usedType->m_members_loaded)
{
@@ -126,7 +117,7 @@ void OncePerAssetRenderingContext::ScanUsedTypeIfNeeded(const IDataRepository* r
}
}
void OncePerAssetRenderingContext::MakeAsset(const IDataRepository* repository, StructureInformation* asset)
void PerAssetRenderingContext::MakeAsset(const IDataRepository* repository, StructureInformation* asset)
{
m_asset = asset;
AddUsedType(std::make_unique<RenderingUsedType>(asset->m_definition, asset));
@@ -134,7 +125,7 @@ void OncePerAssetRenderingContext::MakeAsset(const IDataRepository* repository,
AddMembersToContext(repository, asset);
}
void OncePerAssetRenderingContext::CreateUsedTypeCollections()
void PerAssetRenderingContext::CreateUsedTypeCollections()
{
for (auto* usedType : m_used_types)
{
@@ -161,7 +152,7 @@ void OncePerAssetRenderingContext::CreateUsedTypeCollections()
}
}
bool OncePerAssetRenderingContext::UsedTypeHasActions(const RenderingUsedType* usedType)
bool PerAssetRenderingContext::UsedTypeHasActions(const RenderingUsedType* usedType)
{
const StructureComputations computations(usedType->m_info);
@@ -185,15 +176,3 @@ bool OncePerAssetRenderingContext::UsedTypeHasActions(const RenderingUsedType* u
return false;
}
std::unique_ptr<OncePerAssetRenderingContext>
OncePerAssetRenderingContext::BuildContext(const IDataRepository* repository, StructureInformation* asset, const GameVariant* variant)
{
auto context =
std::make_unique<OncePerAssetRenderingContext>(OncePerAssetRenderingContext(repository->GetGameName(), variant, repository->GetAllFastFileBlocks()));
context->MakeAsset(repository, asset);
context->CreateUsedTypeCollections();
return std::move(context);
}
@@ -1,11 +1,10 @@
#pragma once
#include "BaseRenderingContext.h"
#include "Domain/Computations/MemberComputations.h"
#include "Domain/Information/StructureInformation.h"
#include "PerVariantRenderingContext.h"
#include "Persistence/IDataRepository.h"
#include <string>
#include <unordered_map>
class RenderingUsedType
@@ -25,11 +24,10 @@ public:
bool m_pointer_array_reference_is_reusable;
};
class OncePerAssetRenderingContext : public BaseRenderingContext
class PerAssetRenderingContext : public PerVariantRenderingContext
{
public:
static std::unique_ptr<OncePerAssetRenderingContext>
BuildContext(const IDataRepository* repository, StructureInformation* asset, const GameVariant* variant);
PerAssetRenderingContext(const IDataRepository* repository, StructureInformation* asset, const GameVariant* variant);
StructureInformation* m_asset;
@@ -39,8 +37,6 @@ public:
bool m_has_actions;
private:
OncePerAssetRenderingContext(std::string game, const GameVariant* variant, std::vector<const FastFileBlock*> fastFileBlocks);
RenderingUsedType* AddUsedType(std::unique_ptr<RenderingUsedType> usedType);
RenderingUsedType* GetBaseType(const IDataRepository* repository, const MemberComputations* computations, RenderingUsedType* usedType);
void AddMembersToContext(const IDataRepository* repository, const StructureInformation* info);
@@ -0,0 +1,34 @@
#include "PerTemplateRenderingContext.h"
#include "Domain/Computations/StructureComputations.h"
PerTemplateRenderingContext::PerTemplateRenderingContext(const IDataRepository* repository)
: m_game(repository->GetGameName()),
m_blocks(repository->GetAllFastFileBlocks()),
m_default_normal_block(nullptr),
m_default_temp_block(nullptr)
{
for (const auto* block : m_blocks)
{
if (block->m_is_default)
{
if (block->m_type == FastFileBlockType::NORMAL && m_default_normal_block == nullptr)
m_default_normal_block = block;
else if (block->m_type == FastFileBlockType::TEMP && m_default_temp_block == nullptr)
m_default_temp_block = block;
}
}
for (auto* info : repository->GetAllStructureInformation())
{
if (!StructureComputations(info).IsAsset())
continue;
m_all_assets.emplace_back(info);
}
for (auto* variant : repository->GetGameVariants())
{
m_all_variants.emplace_back(variant);
}
}
@@ -0,0 +1,21 @@
#pragma once
#include "Persistence/IDataRepository.h"
#include <string>
#include <vector>
class PerTemplateRenderingContext
{
public:
explicit PerTemplateRenderingContext(const IDataRepository* repository);
std::string m_game;
std::vector<const FastFileBlock*> m_blocks;
const FastFileBlock* m_default_normal_block;
const FastFileBlock* m_default_temp_block;
std::vector<StructureInformation*> m_all_assets;
std::vector<GameVariant*> m_all_variants;
};
@@ -0,0 +1,12 @@
#include "PerVariantRenderingContext.h"
PerVariantRenderingContext::PerVariantRenderingContext(const IDataRepository* repository, const GameVariant* variant)
: PerTemplateRenderingContext(repository),
m_word_size_mismatch(variant->m_word_size != OWN_WORD_SIZE),
m_word_size(variant->m_word_size),
m_pointer_size(GetPointerSizeForWordSize(variant->m_word_size)),
m_endianness_mismatch(std::endian::native != variant->m_endianness),
m_endianness(variant->m_endianness),
m_variant(variant)
{
}
@@ -0,0 +1,20 @@
#pragma once
#include "PerTemplateRenderingContext.h"
#include "Persistence/IDataRepository.h"
#include <bit>
class PerVariantRenderingContext : public PerTemplateRenderingContext
{
public:
PerVariantRenderingContext(const IDataRepository* repository, const GameVariant* variant);
bool m_word_size_mismatch;
WordSize m_word_size;
unsigned m_pointer_size;
bool m_endianness_mismatch;
std::endian m_endianness;
const GameVariant* m_variant;
};
@@ -1,6 +1,7 @@
#include "AssetStructTestsTemplate.h"
#include "Domain/Computations/StructureComputations.h"
#include "Internal/BasePerVariantTemplate.h"
#include "Internal/BaseTemplate.h"
#include "Utils/StringUtils.h"
@@ -11,11 +12,11 @@ namespace
{
constexpr int TAG_SOURCE = 1;
class PerAsset final : BaseTemplate
class PerAsset final : BasePerVariantTemplate
{
public:
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context),
PerAsset(std::ostream& stream, const PerAssetRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -76,11 +77,11 @@ namespace
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
const PerAssetRenderingContext& m_env;
};
} // namespace
std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
@@ -98,7 +99,7 @@ std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRenderOncePerA
return files;
}
void AssetStructTestsTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
void AssetStructTestsTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context)
{
PerAsset t(stream, context);
@@ -5,6 +5,6 @@
class AssetStructTestsTemplate final : public ICodeTemplate
{
public:
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context) override;
};
@@ -0,0 +1,65 @@
#include "BasePerVariantTemplate.h"
#include "Domain/Computations/StructureComputations.h"
#include "Domain/Definition/ArrayDeclarationModifier.h"
#include <sstream>
BasePerVariantTemplate::BasePerVariantTemplate(std::ostream& stream, const PerVariantRenderingContext& context)
: BaseTemplate(stream, context),
m_env(context)
{
}
std::string BasePerVariantTemplate::MakeAllocAlignment(const StructureInformation& info) const
{
if (info.m_alloc_alignment)
return MakeEvaluation(info.m_alloc_alignment.get());
return std::to_string(info.m_definition->GetAlignment(m_env.m_word_size));
}
size_t BasePerVariantTemplate::SizeForDeclModifierLevel(const MemberInformation& memberInfo, const size_t level) const
{
const auto& declModifiers = memberInfo.m_member->m_type_declaration->m_declaration_modifiers;
if (declModifiers.empty())
return memberInfo.m_member->m_type_declaration->GetSize(m_env.m_word_size);
if (level == 0)
return memberInfo.m_member->m_type_declaration->GetSize(m_env.m_word_size);
size_t currentSize = memberInfo.m_member->m_type_declaration->m_type->GetSize(m_env.m_word_size);
const auto end = declModifiers.rbegin() + (declModifiers.size() - level);
for (auto i = declModifiers.rbegin(); i != end; ++i)
{
if ((*i)->GetType() == DeclarationModifierType::POINTER)
currentSize = m_env.m_pointer_size;
else
currentSize *= dynamic_cast<ArrayDeclarationModifier*>(i->get())->m_size;
}
return currentSize;
}
size_t BasePerVariantTemplate::OffsetForMemberModifier(const MemberInformation& memberInfo,
const DeclarationModifierComputations& modifier,
const size_t nestedBaseOffset) const
{
size_t curOffset = memberInfo.m_member->m_offset;
auto curLevel = 0u;
for (const auto index : modifier.GetArrayIndices())
{
if (index > 0)
curOffset += index * SizeForDeclModifierLevel(memberInfo, curLevel + 1);
curLevel++;
}
return curOffset + nestedBaseOffset;
}
bool BasePerVariantTemplate::MemoryLayoutMatches(const StructureInformation& structureInfo) const
{
return !m_env.m_word_size_mismatch || structureInfo.m_has_matching_cross_platform_memory_layout;
}
@@ -0,0 +1,27 @@
#pragma once
#include "BaseTemplate.h"
#include "Domain/Evaluation/OperandDynamic.h"
#include "Domain/Evaluation/Operation.h"
#include "Generating/PerAssetRenderingContext.h"
#include <format>
class BasePerVariantTemplate : public BaseTemplate
{
protected:
BasePerVariantTemplate(std::ostream& stream, const PerVariantRenderingContext& context);
[[nodiscard]] std::string MakeAllocAlignment(const StructureInformation& info) const;
[[nodiscard]] size_t SizeForDeclModifierLevel(const MemberInformation& memberInfo, size_t level) const;
[[nodiscard]] size_t
OffsetForMemberModifier(const MemberInformation& memberInfo, const DeclarationModifierComputations& modifier, size_t nestedBaseOffset) const;
/**
* Evaluates whether the struct/union has matching memory layouts between the generated code and game.
*/
[[nodiscard]] bool MemoryLayoutMatches(const StructureInformation& structureInfo) const;
const PerVariantRenderingContext& m_env;
};
@@ -6,7 +6,7 @@
#include <sstream>
BaseTemplate::BaseTemplate(std::ostream& stream, const BaseRenderingContext& context)
BaseTemplate::BaseTemplate(std::ostream& stream, const PerTemplateRenderingContext& context)
: m_out(stream),
m_intendation(0u),
m_env(context)
@@ -256,14 +256,6 @@ void BaseTemplate::MakeEvaluationInternal(const IEvaluation* evaluation, std::os
MakeOperandDynamic(dynamic_cast<const OperandDynamic*>(evaluation), str);
}
std::string BaseTemplate::MakeAllocAlignment(const StructureInformation& info) const
{
if (info.m_alloc_alignment)
return MakeEvaluation(info.m_alloc_alignment.get());
return std::to_string(info.m_definition->GetAlignment(m_env.m_word_size));
}
std::string BaseTemplate::MakeEvaluation(const IEvaluation* evaluation)
{
std::ostringstream str;
@@ -279,48 +271,3 @@ bool BaseTemplate::ShouldGenerateFillMethod(const RenderingUsedType& type)
return isNotForeignAsset && (hasMismatchingStructure || isEmbeddedDynamic);
}
size_t BaseTemplate::SizeForDeclModifierLevel(const MemberInformation& memberInfo, const size_t level) const
{
const auto& declModifiers = memberInfo.m_member->m_type_declaration->m_declaration_modifiers;
if (declModifiers.empty())
return memberInfo.m_member->m_type_declaration->GetSize(m_env.m_word_size);
if (level == 0)
return memberInfo.m_member->m_type_declaration->GetSize(m_env.m_word_size);
size_t currentSize = memberInfo.m_member->m_type_declaration->m_type->GetSize(m_env.m_word_size);
const auto end = declModifiers.rbegin() + (declModifiers.size() - level);
for (auto i = declModifiers.rbegin(); i != end; ++i)
{
if ((*i)->GetType() == DeclarationModifierType::POINTER)
currentSize = m_env.m_pointer_size;
else
currentSize *= dynamic_cast<ArrayDeclarationModifier*>(i->get())->m_size;
}
return currentSize;
}
size_t BaseTemplate::OffsetForMemberModifier(const MemberInformation& memberInfo,
const DeclarationModifierComputations& modifier,
const size_t nestedBaseOffset) const
{
size_t curOffset = memberInfo.m_member->m_offset;
auto curLevel = 0u;
for (const auto index : modifier.GetArrayIndices())
{
if (index > 0)
curOffset += index * SizeForDeclModifierLevel(memberInfo, curLevel + 1);
curLevel++;
}
return curOffset + nestedBaseOffset;
}
bool BaseTemplate::MemoryLayoutMatches(const StructureInformation& structureInfo) const
{
return !m_env.m_word_size_mismatch || structureInfo.m_has_matching_cross_platform_memory_layout;
}
@@ -5,8 +5,8 @@
#include "Domain/Evaluation/OperandDynamic.h"
#include "Domain/Evaluation/OperandStatic.h"
#include "Domain/Evaluation/Operation.h"
#include "Generating/BaseRenderingContext.h"
#include "Generating/OncePerAssetRenderingContext.h"
#include "Generating/PerAssetRenderingContext.h"
#include "Generating/PerTemplateRenderingContext.h"
#include <format>
#include <ostream>
@@ -16,7 +16,7 @@ class BaseTemplate
protected:
static constexpr auto INTENDATION = " ";
explicit BaseTemplate(std::ostream& stream, const BaseRenderingContext& context);
explicit BaseTemplate(std::ostream& stream, const PerTemplateRenderingContext& context);
void DoIntendation() const;
@@ -33,7 +33,6 @@ protected:
static std::string MakeArrayIndices(const DeclarationModifierComputations& modifierComputations);
static std::string MakeCustomActionCall(const CustomAction* action);
static std::string MakeArrayCount(const ArrayDeclarationModifier* arrayModifier);
std::string MakeAllocAlignment(const StructureInformation& info) const;
static std::string MakeEvaluation(const IEvaluation* evaluation);
static bool ShouldGenerateFillMethod(const RenderingUsedType& type);
@@ -41,15 +40,6 @@ protected:
static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str);
[[nodiscard]] size_t SizeForDeclModifierLevel(const MemberInformation& memberInfo, size_t level) const;
[[nodiscard]] size_t
OffsetForMemberModifier(const MemberInformation& memberInfo, const DeclarationModifierComputations& modifier, size_t nestedBaseOffset) const;
/**
* Evaluates whether the struct/union has matching memory layouts between the generated code and game.
*/
[[nodiscard]] bool MemoryLayoutMatches(const StructureInformation& structureInfo) const;
std::ostream& m_out;
unsigned m_intendation;
@@ -61,7 +51,7 @@ private:
static void MakeOperation(const Operation* operation, std::ostringstream& str);
static void MakeEvaluationInternal(const IEvaluation* evaluation, std::ostringstream& str);
const BaseRenderingContext& m_env;
const PerTemplateRenderingContext& m_env;
};
#define LINE(x) \
@@ -2,6 +2,7 @@
#include "Domain/Computations/MemberComputations.h"
#include "Domain/Computations/StructureComputations.h"
#include "Internal/BasePerVariantTemplate.h"
#include "Internal/BaseTemplate.h"
#include "Utils/StringUtils.h"
@@ -14,11 +15,11 @@ namespace
constexpr int TAG_SOURCE = 2;
constexpr int TAG_ALL_LOADERS = 3;
class PerTemplate final : BaseTemplate
class PerVariant final : BasePerVariantTemplate
{
public:
PerTemplate(std::ostream& stream, const OncePerTemplateRenderingContext& context)
: BaseTemplate(stream, context),
PerVariant(std::ostream& stream, const PerVariantRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -30,7 +31,7 @@ namespace
LINE("#pragma once")
LINE("")
for (const auto* asset : m_env.m_assets)
for (const auto* asset : m_env.m_all_assets)
{
LINEF("#include \"Game/{0}/XAssets/{1}/{1}_{2}_{3}_load_db.h\"",
m_env.m_game,
@@ -41,14 +42,14 @@ namespace
}
private:
const OncePerTemplateRenderingContext& m_env;
const PerVariantRenderingContext& m_env;
};
class PerAsset final : BaseTemplate
class PerAsset final : BasePerVariantTemplate
{
public:
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context),
PerAsset(std::ostream& stream, const PerAssetRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -168,7 +169,7 @@ namespace
LINEF("#include \"{0}_{1}_{2}_load_db.h\"", Lower(m_env.m_asset->m_definition->m_name), Lower(m_env.m_game), Lower(m_env.m_variant->m_name))
LINE("")
LINEF("#include \"Game/{0}/AssetMarker{0}.h\"", m_env.m_game)
LINEF("#include \"Game/{0}/AssetMarker{0}_{1}.h\"", m_env.m_game, Lower(m_env.m_variant->m_name))
LINE("")
LINE("#include \"Loading/AssetInfoCollector.h\"")
@@ -2157,28 +2158,28 @@ namespace
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
const PerAssetRenderingContext& m_env;
};
} // namespace
std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context)
std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
files.emplace_back(std::format("AssetLoader{0}.h", context.m_game), TAG_ALL_LOADERS);
files.emplace_back(std::format("AssetLoader{0}_{1}.h", context.m_game, context.m_variant->m_name), TAG_ALL_LOADERS);
return files;
}
void ZoneLoadTemplate::RenderOncePerTemplateFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context)
void ZoneLoadTemplate::RenderOncePerVariantFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context)
{
assert(fileTag == TAG_ALL_LOADERS);
const PerTemplate t(stream, context);
const PerVariant t(stream, context);
t.AllLoaders();
}
std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
@@ -2197,7 +2198,7 @@ std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerAsset(con
return files;
}
void ZoneLoadTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
void ZoneLoadTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context)
{
PerAsset t(stream, context);
@@ -5,9 +5,9 @@
class ZoneLoadTemplate final : public ICodeTemplate
{
public:
std::vector<CodeTemplateFile> GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context) override;
void RenderOncePerTemplateFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context) override;
void RenderOncePerVariantFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context) override;
};
@@ -2,6 +2,7 @@
#include "Domain/Computations/MemberComputations.h"
#include "Domain/Computations/StructureComputations.h"
#include "Internal/BasePerVariantTemplate.h"
#include "Internal/BaseTemplate.h"
#include "Utils/StringUtils.h"
@@ -14,11 +15,11 @@ namespace
constexpr int TAG_SOURCE = 2;
constexpr int TAG_ALL_MARKERS = 3;
class PerTemplate final : BaseTemplate
class PerVariant final : BasePerVariantTemplate
{
public:
PerTemplate(std::ostream& stream, const OncePerTemplateRenderingContext& context)
: BaseTemplate(stream, context),
PerVariant(std::ostream& stream, const PerVariantRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -30,7 +31,7 @@ namespace
LINE("#pragma once")
LINE("")
for (const auto* asset : m_env.m_assets)
for (const auto* asset : m_env.m_all_assets)
{
LINEF("#include \"Game/{0}/XAssets/{1}/{1}_{2}_{3}_mark_db.h\"",
m_env.m_game,
@@ -41,14 +42,14 @@ namespace
}
private:
const OncePerTemplateRenderingContext& m_env;
const PerVariantRenderingContext& m_env;
};
class PerAsset final : BaseTemplate
class PerAsset final : BasePerVariantTemplate
{
public:
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context),
PerAsset(std::ostream& stream, const PerAssetRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -786,28 +787,28 @@ namespace
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
const PerAssetRenderingContext& m_env;
};
} // namespace
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context)
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
files.emplace_back(std::format("AssetMarker{0}.h", context.m_game), TAG_ALL_MARKERS);
files.emplace_back(std::format("AssetMarker{0}_{1}.h", context.m_game, context.m_variant->m_name), TAG_ALL_MARKERS);
return files;
}
void ZoneMarkTemplate::RenderOncePerTemplateFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context)
void ZoneMarkTemplate::RenderOncePerVariantFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context)
{
assert(fileTag == TAG_ALL_MARKERS);
const PerTemplate t(stream, context);
const PerVariant t(stream, context);
t.AllMarkers();
}
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
@@ -826,7 +827,7 @@ std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerAsset(con
return files;
}
void ZoneMarkTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
void ZoneMarkTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context)
{
PerAsset t(stream, context);
@@ -5,9 +5,9 @@
class ZoneMarkTemplate final : public ICodeTemplate
{
public:
std::vector<CodeTemplateFile> GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context) override;
void RenderOncePerTemplateFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context) override;
void RenderOncePerVariantFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context) override;
};
@@ -1,6 +1,7 @@
#include "ZoneWriteTemplate.h"
#include "Domain/Computations/StructureComputations.h"
#include "Internal/BasePerVariantTemplate.h"
#include "Internal/BaseTemplate.h"
#include "Utils/StringUtils.h"
@@ -14,11 +15,11 @@ namespace
constexpr CodeTemplateFileTag TAG_SOURCE = 2;
constexpr CodeTemplateFileTag TAG_ALL_WRITERS = 3;
class PerTemplate final : BaseTemplate
class PerVariant final : BasePerVariantTemplate
{
public:
PerTemplate(std::ostream& stream, const OncePerTemplateRenderingContext& context)
: BaseTemplate(stream, context),
PerVariant(std::ostream& stream, const PerVariantRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -30,7 +31,7 @@ namespace
LINE("#pragma once")
LINE("")
for (const auto* asset : m_env.m_assets)
for (const auto* asset : m_env.m_all_assets)
{
LINEF("#include \"Game/{0}/XAssets/{1}/{1}_{2}_{3}_write_db.h\"",
m_env.m_game,
@@ -41,14 +42,14 @@ namespace
}
private:
const OncePerTemplateRenderingContext& m_env;
const PerVariantRenderingContext& m_env;
};
class PerAsset final : BaseTemplate
class PerAsset final : BasePerVariantTemplate
{
public:
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context),
PerAsset(std::ostream& stream, const PerAssetRenderingContext& context)
: BasePerVariantTemplate(stream, context),
m_env(context)
{
}
@@ -1639,28 +1640,28 @@ namespace
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
const PerAssetRenderingContext& m_env;
};
} // namespace
std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context)
std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
files.emplace_back(std::format("AssetWriter{0}.h", context.m_game), TAG_ALL_WRITERS);
files.emplace_back(std::format("AssetWriter{0}_{1}.h", context.m_game, context.m_variant->m_name), TAG_ALL_WRITERS);
return files;
}
void ZoneWriteTemplate::RenderOncePerTemplateFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context)
void ZoneWriteTemplate::RenderOncePerVariantFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context)
{
assert(fileTag == TAG_ALL_WRITERS);
const PerTemplate t(stream, context);
const PerVariant t(stream, context);
t.AllWriters();
}
std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
@@ -1679,7 +1680,7 @@ std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerAsset(co
return files;
}
void ZoneWriteTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
void ZoneWriteTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context)
{
PerAsset t(stream, context);
@@ -5,9 +5,9 @@
class ZoneWriteTemplate final : public ICodeTemplate
{
public:
std::vector<CodeTemplateFile> GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context) override;
void RenderOncePerTemplateFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerVariant(const PerVariantRenderingContext& context) override;
void RenderOncePerVariantFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerVariantRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) override;
std::vector<CodeTemplateFile> GetFilesToRenderOncePerAsset(const PerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const PerAssetRenderingContext& context) override;
};
@@ -1,6 +1,6 @@
#include "ZoneDefWriterIW5.h"
#include "Game/IW5/AssetMarkerIW5.h"
#include "Game/IW5/IW5.h"
using namespace IW5;
@@ -1,6 +1,6 @@
#include "ZoneDefWriterT5.h"
#include "Game/T5/AssetMarkerT5.h"
#include "Game/T5/T5.h"
using namespace T5;
@@ -1,6 +1,6 @@
#include "ContentLoaderIW3.h"
#include "Game/IW3/AssetLoaderIW3.h"
#include "Game/IW3/AssetLoaderIW3_pc.h"
#include "Game/IW3/IW3.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentLoaderIW4.h"
#include "Game/IW4/AssetLoaderIW4.h"
#include "Game/IW4/AssetLoaderIW4_pc32.h"
#include "Game/IW4/IW4.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc32 loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentLoaderIW5.h"
#include "Game/IW5/AssetLoaderIW5.h"
#include "Game/IW5/AssetLoaderIW5_pc32.h"
#include "Game/IW5/IW5.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc32 loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentLoaderQOS.h"
#include "Game/QOS/AssetLoaderQOS.h"
#include "Game/QOS/AssetLoaderQOS_pc.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
#include <cassert>
@@ -43,7 +43,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentLoaderT4.h"
#include "Game/T4/AssetLoaderT4.h"
#include "Game/T4/AssetLoaderT4_pc.h"
#include "Game/T4/T4.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentLoaderT5.h"
#include "Game/T5/AssetLoaderT5.h"
#include "Game/T5/AssetLoaderT5_pc.h"
#include "Game/T5/T5.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentLoaderT6.h"
#include "Game/T6/AssetLoaderT6.h"
#include "Game/T6/AssetLoaderT6_pc.h"
#include "Game/T6/T6.h"
#include "Loading/Exception/UnsupportedAssetTypeException.h"
@@ -44,7 +44,7 @@ void ContentLoader::LoadXAsset(const bool atStreamStart) const
#define LOAD_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Loader_##typeName loader(m_zone, m_stream); \
Loader_##typeName##_pc loader(m_zone, m_stream); \
loader.Load(&varXAsset->header.headerEntry); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentWriterIW3.h"
#include "Game/IW3/AssetWriterIW3.h"
#include "Game/IW3/AssetWriterIW3_pc.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentWriterIW4.h"
#include "Game/IW4/AssetWriterIW4.h"
#include "Game/IW4/AssetWriterIW4_pc32.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc32 writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentWriterIW5.h"
#include "Game/IW5/AssetWriterIW5.h"
#include "Game/IW5/AssetWriterIW5_pc32.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc32 writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
@@ -1,6 +1,6 @@
#include "ContentWriterQOS.h"
#include "Game/QOS/AssetWriterQOS.h"
#include "Game/QOS/AssetWriterQOS_pc.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentWriterT4.h"
#include "Game/T4/AssetWriterT4.h"
#include "Game/T4/AssetWriterT4_pc.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentWriterT5.h"
#include "Game/T5/AssetWriterT5.h"
#include "Game/T5/AssetWriterT5_pc.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -80,7 +80,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}
+2 -2
View File
@@ -1,6 +1,6 @@
#include "ContentWriterT6.h"
#include "Game/T6/AssetWriterT6.h"
#include "Game/T6/AssetWriterT6_pc.h"
#include "Writing/WritingException.h"
#include <cassert>
@@ -83,7 +83,7 @@ void ContentWriter::WriteXAsset(const bool atStreamStart)
#define WRITE_ASSET(type_index, typeName, headerEntry) \
case type_index: \
{ \
Writer_##typeName writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
Writer_##typeName##_pc writer(varXAsset->header.headerEntry, m_zone, *m_stream); \
writer.Write(varXAsset->header.headerEntry, varXAssetWritten.AtOffset(4)); \
break; \
}