2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-01-13 20:21:48 +00:00

refactor: add AssetMarker headers to zcg marker template

This commit is contained in:
Jan Laupetin
2026-01-05 16:48:33 +00:00
parent 660f34df69
commit e7f126265d
15 changed files with 141 additions and 265 deletions

View File

@@ -1,14 +1,18 @@
#include "OncePerTemplateRenderingContext.h"
#include "Domain/Computations/StructureComputations.h"
#include <algorithm>
OncePerTemplateRenderingContext::OncePerTemplateRenderingContext(std::string game,
const Architecture gameArchitecture,
std::vector<const FastFileBlock*> fastFileBlocks)
std::vector<const FastFileBlock*> fastFileBlocks,
std::vector<StructureInformation*> assets)
: m_game(std::move(game)),
m_architecture_mismatch(gameArchitecture != OWN_ARCHITECTURE),
m_pointer_size(GetPointerSizeForArchitecture(gameArchitecture)),
m_blocks(std::move(fastFileBlocks)),
m_assets(std::move(assets)),
m_default_normal_block(nullptr),
m_default_temp_block(nullptr)
{
@@ -26,6 +30,15 @@ OncePerTemplateRenderingContext::OncePerTemplateRenderingContext(std::string gam
std::unique_ptr<OncePerTemplateRenderingContext> OncePerTemplateRenderingContext::BuildContext(const IDataRepository* repository)
{
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(), repository->GetArchitecture(), repository->GetAllFastFileBlocks()));
OncePerTemplateRenderingContext(repository->GetGameName(), repository->GetArchitecture(), repository->GetAllFastFileBlocks(), assetInformation));
}

View File

@@ -3,6 +3,7 @@
#include "Persistence/IDataRepository.h"
#include <string>
#include <vector>
class OncePerTemplateRenderingContext
{
@@ -13,10 +14,14 @@ public:
bool m_architecture_mismatch;
unsigned m_pointer_size;
std::vector<const FastFileBlock*> m_blocks;
std::vector<StructureInformation*> m_assets;
const FastFileBlock* m_default_normal_block;
const FastFileBlock* m_default_temp_block;
private:
OncePerTemplateRenderingContext(std::string game, Architecture gameArchitecture, std::vector<const FastFileBlock*> fastFileBlocks);
OncePerTemplateRenderingContext(std::string game,
Architecture gameArchitecture,
std::vector<const FastFileBlock*> fastFileBlocks,
std::vector<StructureInformation*> assets);
};

View File

@@ -11,22 +11,19 @@ namespace
{
constexpr int TAG_SOURCE = 1;
class Template final : BaseTemplate
class PerAsset final : BaseTemplate
{
public:
Template(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context)
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream),
m_env(context)
{
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINEF("#include \"Game/{0}/{0}.h\"", m_env.m_game)
LINE("")
LINE("#include <catch2/catch_test_macros.hpp>")
@@ -78,6 +75,8 @@ namespace
m_intendation--;
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
};
} // namespace
@@ -88,14 +87,14 @@ std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRenderOncePerA
auto assetName = context.m_asset->m_definition->m_name;
utils::MakeStringLowerCase(assetName);
files.emplace_back(std::format("{0}/{0}_struct_test.cpp", assetName), TAG_SOURCE);
files.emplace_back(std::format("XAssets/{0}/{0}_struct_test.cpp", assetName), TAG_SOURCE);
return files;
}
void AssetStructTestsTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
{
Template t(stream, context);
PerAsset t(stream, context);
assert(fileTag == TAG_SOURCE);
if (fileTag == TAG_SOURCE)

View File

@@ -5,9 +5,8 @@
#include <sstream>
BaseTemplate::BaseTemplate(std::ostream& stream, const OncePerAssetRenderingContext& context)
BaseTemplate::BaseTemplate(std::ostream& stream)
: m_out(stream),
m_env(context),
m_intendation(0u)
{
}
@@ -18,6 +17,17 @@ void BaseTemplate::DoIntendation() const
m_out << INTENDATION;
}
// clang-format off
void BaseTemplate::AddGeneratedHint() const
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
} // clang-format on
std::string BaseTemplate::Upper(std::string str)
{
for (auto& c : str)

View File

@@ -5,7 +5,6 @@
#include "Domain/Evaluation/OperandDynamic.h"
#include "Domain/Evaluation/OperandStatic.h"
#include "Domain/Evaluation/Operation.h"
#include "Generating/OncePerAssetRenderingContext.h"
#include <format>
#include <ostream>
@@ -15,10 +14,12 @@ class BaseTemplate
protected:
static constexpr auto INTENDATION = " ";
BaseTemplate(std::ostream& stream, const OncePerAssetRenderingContext& context);
explicit BaseTemplate(std::ostream& stream);
void DoIntendation() const;
void AddGeneratedHint() const;
static std::string Upper(std::string str);
static std::string Lower(std::string str);
static std::string MakeTypeVarName(const DataDefinition* def);
@@ -37,7 +38,6 @@ protected:
static std::string MakeEvaluation(const IEvaluation* evaluation);
std::ostream& m_out;
const OncePerAssetRenderingContext& m_env;
unsigned m_intendation;
private:

View File

@@ -6,7 +6,6 @@
#include "Utils/StringUtils.h"
#include <cassert>
#include <iostream>
#include <sstream>
namespace
@@ -14,22 +13,19 @@ namespace
constexpr int TAG_HEADER = 1;
constexpr int TAG_SOURCE = 2;
class Template final : BaseTemplate
class PerAsset final : BaseTemplate
{
public:
Template(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context)
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream),
m_env(context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINE("#pragma once")
LINE("")
LINEF("#include \"Game/{0}/{0}.h\"", m_env.m_game)
@@ -137,12 +133,8 @@ namespace
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINEF("#include \"{0}_load_db.h\"", Lower(m_env.m_asset->m_definition->m_name))
LINE("")
LINEF("#include \"Game/{0}/AssetMarker{0}.h\"", m_env.m_game)
@@ -2195,6 +2187,8 @@ namespace
m_intendation--;
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
};
} // namespace
@@ -2205,15 +2199,15 @@ std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRenderOncePerAsset(con
auto assetName = context.m_asset->m_definition->m_name;
utils::MakeStringLowerCase(assetName);
files.emplace_back(std::format("{0}/{0}_load_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("{0}/{0}_load_db.cpp", assetName), TAG_SOURCE);
files.emplace_back(std::format("XAssets/{0}/{0}_load_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("XAssets/{0}/{0}_load_db.cpp", assetName), TAG_SOURCE);
return files;
}
void ZoneLoadTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
{
Template t(stream, context);
PerAsset t(stream, context);
if (fileTag == TAG_HEADER)
{

View File

@@ -12,23 +12,50 @@ namespace
{
constexpr int TAG_HEADER = 1;
constexpr int TAG_SOURCE = 2;
constexpr int TAG_ALL_MARKERS = 3;
class Template final : BaseTemplate
class PerTemplate final : BaseTemplate
{
public:
Template(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context)
PerTemplate(std::ostream& stream, const OncePerTemplateRenderingContext& context)
: BaseTemplate(stream),
m_env(context)
{
}
void AllMarkers() const
{
AddGeneratedHint();
LINE("#pragma once")
LINE("")
for (const auto* asset : m_env.m_assets)
{
auto lowerAssetName = asset->m_definition->m_name;
utils::MakeStringLowerCase(lowerAssetName);
LINEF("#include \"Game/{0}/XAssets/{1}/{1}_mark_db.h\"", m_env.m_game, lowerAssetName)
}
}
private:
const OncePerTemplateRenderingContext& m_env;
};
class PerAsset final : BaseTemplate
{
public:
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream),
m_env(context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINE("#pragma once")
LINE("")
LINEF("#include \"Game/{0}/{0}.h\"", m_env.m_game)
@@ -113,12 +140,8 @@ namespace
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINEF("#include \"{0}_mark_db.h\"", Lower(m_env.m_asset->m_definition->m_name))
if (!m_env.m_referenced_assets.empty())
@@ -761,9 +784,28 @@ namespace
m_intendation--;
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
};
} // namespace
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerTemplate(const OncePerTemplateRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
files.emplace_back(std::format("AssetMarker{0}.h", context.m_game), TAG_ALL_MARKERS);
return files;
}
void ZoneMarkTemplate::RenderOncePerTemplateFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerTemplateRenderingContext& context)
{
assert(fileTag == TAG_ALL_MARKERS);
PerTemplate t(stream, context);
t.AllMarkers();
}
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context)
{
std::vector<CodeTemplateFile> files;
@@ -771,15 +813,15 @@ std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRenderOncePerAsset(con
auto assetName = context.m_asset->m_definition->m_name;
utils::MakeStringLowerCase(assetName);
files.emplace_back(std::format("{0}/{0}_mark_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("{0}/{0}_mark_db.cpp", assetName), TAG_SOURCE);
files.emplace_back(std::format("XAssets/{0}/{0}_mark_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("XAssets/{0}/{0}_mark_db.cpp", assetName), TAG_SOURCE);
return files;
}
void ZoneMarkTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
{
Template t(stream, context);
PerAsset t(stream, context);
if (fileTag == TAG_HEADER)
{

View File

@@ -5,6 +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> GetFilesToRenderOncePerAsset(const OncePerAssetRenderingContext& context) override;
void RenderOncePerAssetFile(std::ostream& stream, CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context) override;
};

View File

@@ -12,22 +12,19 @@ namespace
constexpr CodeTemplateFileTag TAG_HEADER = 1;
constexpr CodeTemplateFileTag TAG_SOURCE = 2;
class Template final : BaseTemplate
class PerAsset final : BaseTemplate
{
public:
Template(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream, context)
PerAsset(std::ostream& stream, const OncePerAssetRenderingContext& context)
: BaseTemplate(stream),
m_env(context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINE("#pragma once")
LINE("")
LINEF("#include \"Game/{0}/{0}.h\"", m_env.m_game)
@@ -112,12 +109,8 @@ namespace
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify.")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
AddGeneratedHint();
LINEF("#include \"{0}_write_db.h\"", Lower(m_env.m_asset->m_definition->m_name))
if (!m_env.m_referenced_assets.empty())
@@ -1230,6 +1223,8 @@ namespace
m_intendation--;
LINE("}")
}
const OncePerAssetRenderingContext& m_env;
};
} // namespace
@@ -1241,15 +1236,15 @@ std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRenderOncePerAsset(co
for (auto& c : assetName)
c = static_cast<char>(tolower(c));
files.emplace_back(std::format("{0}/{0}_write_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("{0}/{0}_write_db.cpp", assetName), TAG_SOURCE);
files.emplace_back(std::format("XAssets/{0}/{0}_write_db.h", assetName), TAG_HEADER);
files.emplace_back(std::format("XAssets/{0}/{0}_write_db.cpp", assetName), TAG_SOURCE);
return files;
}
void ZoneWriteTemplate::RenderOncePerAssetFile(std::ostream& stream, const CodeTemplateFileTag fileTag, const OncePerAssetRenderingContext& context)
{
Template t(stream, context);
PerAsset t(stream, context);
if (fileTag == TAG_HEADER)
{