From 7227c84cde7513ba51ddccbd33a0ca3b84e6bcee Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 14 Sep 2024 12:21:43 +0200 Subject: [PATCH] chore: use RawTemplater to template XModel loading code for t5 and t6 --- premake5.lua | 1 + .../XModel/{JsonXModel.h => JsonXModelT5.h} | 0 .../Game/T5/XModel/XModelConstantsT5.h | 31 +++++++++ .../XModel/{JsonXModel.h => JsonXModelT6.h} | 0 .../Game/T6/XModel/XModelConstantsT6.h | 33 ++++++++++ src/ObjLoading.lua | 2 + .../Game/T5/XModel/XModelLoaderT5.cpp | 49 -------------- .../Game/T6/XModel/XModelLoaderT6.cpp | 51 --------------- .../Game/T6/XModel/XModelLoaderT6.h | 13 ---- src/ObjLoading/XModel/Gltf/GltfLoader.h | 4 +- src/ObjLoading/XModel/XModelFileLoader.h | 18 ++++++ ...Loader.inc.h => XModelLoader.cpp.template} | 36 +++++++++-- src/ObjLoading/XModel/XModelLoader.h | 18 ------ .../XModelLoader.h.template} | 10 ++- .../Game/T5/XModel/XModelDumperT5.cpp | 2 +- .../Game/T6/XModel/XModelDumperT6.cpp | 2 +- tools/scripts/source_templating.lua | 64 +++++++++++++++++++ 17 files changed, 192 insertions(+), 142 deletions(-) rename src/ObjCommon/Game/T5/XModel/{JsonXModel.h => JsonXModelT5.h} (100%) create mode 100644 src/ObjCommon/Game/T5/XModel/XModelConstantsT5.h rename src/ObjCommon/Game/T6/XModel/{JsonXModel.h => JsonXModelT6.h} (100%) create mode 100644 src/ObjCommon/Game/T6/XModel/XModelConstantsT6.h delete mode 100644 src/ObjLoading/Game/T5/XModel/XModelLoaderT5.cpp delete mode 100644 src/ObjLoading/Game/T6/XModel/XModelLoaderT6.cpp delete mode 100644 src/ObjLoading/Game/T6/XModel/XModelLoaderT6.h create mode 100644 src/ObjLoading/XModel/XModelFileLoader.h rename src/ObjLoading/XModel/{GenericXModelLoader.inc.h => XModelLoader.cpp.template} (97%) delete mode 100644 src/ObjLoading/XModel/XModelLoader.h rename src/ObjLoading/{Game/T5/XModel/XModelLoaderT5.h => XModel/XModelLoader.h.template} (62%) create mode 100644 tools/scripts/source_templating.lua diff --git a/premake5.lua b/premake5.lua index 9e850d85..0ac4a6ac 100644 --- a/premake5.lua +++ b/premake5.lua @@ -4,6 +4,7 @@ include "tools/scripts/linking.lua" include "tools/scripts/options.lua" include "tools/scripts/platform.lua" include "tools/scripts/version.lua" +include "tools/scripts/source_templating.lua" -- ================== -- Workspace diff --git a/src/ObjCommon/Game/T5/XModel/JsonXModel.h b/src/ObjCommon/Game/T5/XModel/JsonXModelT5.h similarity index 100% rename from src/ObjCommon/Game/T5/XModel/JsonXModel.h rename to src/ObjCommon/Game/T5/XModel/JsonXModelT5.h diff --git a/src/ObjCommon/Game/T5/XModel/XModelConstantsT5.h b/src/ObjCommon/Game/T5/XModel/XModelConstantsT5.h new file mode 100644 index 00000000..0481cd27 --- /dev/null +++ b/src/ObjCommon/Game/T5/XModel/XModelConstantsT5.h @@ -0,0 +1,31 @@ +#pragma once + +#include "Game/T5/T5.h" + +namespace T5 +{ + inline const char* HITLOC_NAMES[]{ + // clang-format off + "none", + "helmet", + "head", + "neck", + "torso_upper", + "torso_lower", + "right_arm_upper", + "left_arm_upper", + "right_arm_lower", + "left_arm_lower", + "right_hand", + "left_hand", + "right_leg_upper", + "left_leg_upper", + "right_leg_lower", + "left_leg_lower", + "right_foot", + "left_foot", + "gun", + // clang-format on + }; + static_assert(std::extent_v == HITLOC_COUNT); +} // namespace T5 diff --git a/src/ObjCommon/Game/T6/XModel/JsonXModel.h b/src/ObjCommon/Game/T6/XModel/JsonXModelT6.h similarity index 100% rename from src/ObjCommon/Game/T6/XModel/JsonXModel.h rename to src/ObjCommon/Game/T6/XModel/JsonXModelT6.h diff --git a/src/ObjCommon/Game/T6/XModel/XModelConstantsT6.h b/src/ObjCommon/Game/T6/XModel/XModelConstantsT6.h new file mode 100644 index 00000000..e7ae94cd --- /dev/null +++ b/src/ObjCommon/Game/T6/XModel/XModelConstantsT6.h @@ -0,0 +1,33 @@ +#pragma once + +#include "Game/T6/T6.h" + +namespace T6 +{ + inline const char* HITLOC_NAMES[]{ + // clang-format off + "none", + "helmet", + "head", + "neck", + "torso_upper", + "torso_middle", + "torso_lower", + "right_arm_upper", + "left_arm_upper", + "right_arm_lower", + "left_arm_lower", + "right_hand", + "left_hand", + "right_leg_upper", + "left_leg_upper", + "right_leg_lower", + "left_leg_lower", + "right_foot", + "left_foot", + "gun", + "shield", + // clang-format on + }; + static_assert(std::extent_v == HITLOC_COUNT); +} // namespace T6 diff --git a/src/ObjLoading.lua b/src/ObjLoading.lua index 9452e56e..45f110c2 100644 --- a/src/ObjLoading.lua +++ b/src/ObjLoading.lua @@ -49,6 +49,8 @@ function ObjLoading:project() path.join(folder, "ObjLoading") } } + + useSourceTemplating("ObjLoading") self:include(includes) Crypto:include(includes) diff --git a/src/ObjLoading/Game/T5/XModel/XModelLoaderT5.cpp b/src/ObjLoading/Game/T5/XModel/XModelLoaderT5.cpp deleted file mode 100644 index 55f19595..00000000 --- a/src/ObjLoading/Game/T5/XModel/XModelLoaderT5.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "XModelLoaderT5.h" - -#include "Game/T5/CommonT5.h" -#include "Game/T5/XModel/JsonXModel.h" - -#define GAME_NAMESPACE T5 - -namespace T5 -{ - const char* HITLOC_NAMES[]{ - // clang-format off - "none", - "helmet", - "head", - "neck", - "torso_upper", - "torso_lower", - "right_arm_upper", - "left_arm_upper", - "right_arm_lower", - "left_arm_lower", - "right_hand", - "left_hand", - "right_leg_upper", - "left_leg_upper", - "right_leg_lower", - "left_leg_lower", - "right_foot", - "left_foot", - "gun", - // clang-format on - }; - static_assert(std::extent_v == HITLOC_COUNT); -} // namespace T5 - -#include "XModel/GenericXModelLoader.inc.h" - -namespace T5 -{ - bool LoadXModel(std::istream& stream, XModel& xmodel, MemoryManager* memory, IAssetLoadingManager* manager, std::vector& dependencies) - { - std::set dependenciesSet; - XModelLoader loader(stream, *memory, *manager, dependenciesSet); - - dependencies.assign(dependenciesSet.cbegin(), dependenciesSet.cend()); - - return loader.Load(xmodel); - } -} // namespace T5 diff --git a/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.cpp b/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.cpp deleted file mode 100644 index 3beb26cb..00000000 --- a/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "XModelLoaderT6.h" - -#include "Game/T6/CommonT6.h" -#include "Game/T6/XModel/JsonXModel.h" - -#define GAME_NAMESPACE T6 - -namespace T6 -{ - const char* HITLOC_NAMES[]{ - // clang-format off - "none", - "helmet", - "head", - "neck", - "torso_upper", - "torso_middle", - "torso_lower", - "right_arm_upper", - "left_arm_upper", - "right_arm_lower", - "left_arm_lower", - "right_hand", - "left_hand", - "right_leg_upper", - "left_leg_upper", - "right_leg_lower", - "left_leg_lower", - "right_foot", - "left_foot", - "gun", - "shield", - // clang-format on - }; - static_assert(std::extent_v == HITLOC_COUNT); -} // namespace T6 - -#include "XModel/GenericXModelLoader.inc.h" - -namespace T6 -{ - bool LoadXModel(std::istream& stream, XModel& xmodel, MemoryManager* memory, IAssetLoadingManager* manager, std::vector& dependencies) - { - std::set dependenciesSet; - XModelLoader loader(stream, *memory, *manager, dependenciesSet); - - dependencies.assign(dependenciesSet.cbegin(), dependenciesSet.cend()); - - return loader.Load(xmodel); - } -} // namespace T6 diff --git a/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.h b/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.h deleted file mode 100644 index e55883e5..00000000 --- a/src/ObjLoading/Game/T6/XModel/XModelLoaderT6.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/T6/T6.h" -#include "Utils/MemoryManager.h" - -#include -#include - -namespace T6 -{ - bool LoadXModel(std::istream& stream, XModel& xmodel, MemoryManager* memory, IAssetLoadingManager* manager, std::vector& dependencies); -} diff --git a/src/ObjLoading/XModel/Gltf/GltfLoader.h b/src/ObjLoading/XModel/Gltf/GltfLoader.h index b12d8d98..872394e4 100644 --- a/src/ObjLoading/XModel/Gltf/GltfLoader.h +++ b/src/ObjLoading/XModel/Gltf/GltfLoader.h @@ -2,14 +2,14 @@ #include "GltfInput.h" #include "XModel/Gltf/JsonGltf.h" -#include "XModel/XModelLoader.h" +#include "XModel/XModelFileLoader.h" #include #include namespace gltf { - class Loader : public XModelLoader + class Loader : public XModelFileLoader { public: Loader() = default; diff --git a/src/ObjLoading/XModel/XModelFileLoader.h b/src/ObjLoading/XModel/XModelFileLoader.h new file mode 100644 index 00000000..ad5bd918 --- /dev/null +++ b/src/ObjLoading/XModel/XModelFileLoader.h @@ -0,0 +1,18 @@ +#pragma once + +#include "XModel/XModelCommon.h" + +#include + +class XModelFileLoader +{ +public: + XModelFileLoader() = default; + virtual ~XModelFileLoader() = default; + XModelFileLoader(const XModelFileLoader& other) = default; + XModelFileLoader(XModelFileLoader&& other) noexcept = default; + XModelFileLoader& operator=(const XModelFileLoader& other) = default; + XModelFileLoader& operator=(XModelFileLoader&& other) noexcept = default; + + virtual std::unique_ptr Load() = 0; +}; diff --git a/src/ObjLoading/XModel/GenericXModelLoader.inc.h b/src/ObjLoading/XModel/XModelLoader.cpp.template similarity index 97% rename from src/ObjLoading/XModel/GenericXModelLoader.inc.h rename to src/ObjLoading/XModel/XModelLoader.cpp.template index 2c9610c5..5cdd8575 100644 --- a/src/ObjLoading/XModel/GenericXModelLoader.inc.h +++ b/src/ObjLoading/XModel/XModelLoader.cpp.template @@ -1,9 +1,24 @@ -#pragma once +#options GAME (T5, T6) -#ifndef GAME_NAMESPACE -#error Must define GAME_NAMESPACE +#filename "Game/" + GAME + "/XModel/XModelLoader" + GAME + ".cpp" + +#set LOADER_HEADER "\"XModelLoader" + GAME + ".h\"" +#set COMMON_HEADER "\"Game/" + GAME + "/Common" + GAME + ".h\"" +#set CONSTANTS_HEADER "\"Game/" + GAME + "/XModel/XModelConstants" + GAME + ".h\"" +#set JSON_HEADER "\"Game/" + GAME + "/XModel/JsonXModel" + GAME + ".h\"" + +#if GAME == "T5" +#define FEATURE_T5 +#elif GAME == "T6" +#define FEATURE_T6 #endif +#include LOADER_HEADER + +#include COMMON_HEADER +#include CONSTANTS_HEADER +#include JSON_HEADER + #include "ObjLoading.h" #include "Utils/QuatInt16.h" #include "Utils/StringUtils.h" @@ -26,9 +41,10 @@ #include #include #include +#include #include -namespace GAME_NAMESPACE +namespace GAME { class XModelLoader { @@ -794,4 +810,14 @@ namespace GAME_NAMESPACE PartClassificationState& m_part_classification_state; std::set& m_dependencies; }; -} // namespace GAME_NAMESPACE + + bool LoadXModel(std::istream& stream, XModel& xmodel, MemoryManager* memory, IAssetLoadingManager* manager, std::vector& dependencies) + { + std::set dependenciesSet; + XModelLoader loader(stream, *memory, *manager, dependenciesSet); + + dependencies.assign(dependenciesSet.cbegin(), dependenciesSet.cend()); + + return loader.Load(xmodel); + } +} // namespace GAME diff --git a/src/ObjLoading/XModel/XModelLoader.h b/src/ObjLoading/XModel/XModelLoader.h deleted file mode 100644 index 8aeca27a..00000000 --- a/src/ObjLoading/XModel/XModelLoader.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "XModel/XModelCommon.h" - -#include - -class XModelLoader -{ -public: - XModelLoader() = default; - virtual ~XModelLoader() = default; - XModelLoader(const XModelLoader& other) = default; - XModelLoader(XModelLoader&& other) noexcept = default; - XModelLoader& operator=(const XModelLoader& other) = default; - XModelLoader& operator=(XModelLoader&& other) noexcept = default; - - virtual std::unique_ptr Load() = 0; -}; diff --git a/src/ObjLoading/Game/T5/XModel/XModelLoaderT5.h b/src/ObjLoading/XModel/XModelLoader.h.template similarity index 62% rename from src/ObjLoading/Game/T5/XModel/XModelLoaderT5.h rename to src/ObjLoading/XModel/XModelLoader.h.template index cf1c3951..6aeb6877 100644 --- a/src/ObjLoading/Game/T5/XModel/XModelLoaderT5.h +++ b/src/ObjLoading/XModel/XModelLoader.h.template @@ -1,13 +1,19 @@ +#options GAME (T5, T6) + +#filename "Game/" + GAME + "/XModel/XModelLoader" + GAME + ".h" + +#set GAME_HEADER "\"Game/" + GAME + "/" + GAME + ".h\"" + #pragma once #include "AssetLoading/IAssetLoadingManager.h" -#include "Game/T5/T5.h" +#include GAME_HEADER #include "Utils/MemoryManager.h" #include #include -namespace T5 +namespace GAME { bool LoadXModel(std::istream& stream, XModel& xmodel, MemoryManager* memory, IAssetLoadingManager* manager, std::vector& dependencies); } diff --git a/src/ObjWriting/Game/T5/XModel/XModelDumperT5.cpp b/src/ObjWriting/Game/T5/XModel/XModelDumperT5.cpp index a29f79f6..d9ece077 100644 --- a/src/ObjWriting/Game/T5/XModel/XModelDumperT5.cpp +++ b/src/ObjWriting/Game/T5/XModel/XModelDumperT5.cpp @@ -1,7 +1,7 @@ #include "XModelDumperT5.h" #include "Game/T5/CommonT5.h" -#include "Game/T5/XModel/JsonXModel.h" +#include "Game/T5/XModel/JsonXModelT5.h" #define GAME_NAMESPACE T5 diff --git a/src/ObjWriting/Game/T6/XModel/XModelDumperT6.cpp b/src/ObjWriting/Game/T6/XModel/XModelDumperT6.cpp index e629d886..59dbe4cd 100644 --- a/src/ObjWriting/Game/T6/XModel/XModelDumperT6.cpp +++ b/src/ObjWriting/Game/T6/XModel/XModelDumperT6.cpp @@ -1,7 +1,7 @@ #include "XModelDumperT6.h" #include "Game/T6/CommonT6.h" -#include "Game/T6/XModel/JsonXModel.h" +#include "Game/T6/XModel/JsonXModelT6.h" #define GAME_NAMESPACE T6 #define FEATURE_T6 diff --git a/tools/scripts/source_templating.lua b/tools/scripts/source_templating.lua new file mode 100644 index 00000000..a64ee53f --- /dev/null +++ b/tools/scripts/source_templating.lua @@ -0,0 +1,64 @@ +function useSourceTemplating(projectName) + local projectFolder = path.join(ProjectFolder(), projectName) + local templateFiles = os.matchfiles(path.join(projectFolder, "**.template")) + + local createdFiles = {} + + for i = 1, #templateFiles do + local templateFile = templateFiles[i] + local relativeTemplatePath = path.getrelative(projectFolder, templateFile) + local relativeResultPath = path.replaceextension(relativeTemplatePath, "") + local resultExtension = path.getextension(relativeResultPath) + + local data = io.readfile(templateFile) + local gameOptionsStart, gameOptionsCount = string.find(data, "#options%s+GAME%s*%(") + + if gameOptionsStart == nil then + error("Source template " .. relativeTemplatePath .. " must define an option called GAME") + end + + local gameOptionsPos, gameOptionsLenPlusOne = string.find(data, "[%a%d%s,]+%)", gameOptionsStart + gameOptionsCount) + + if gameOptionsPos ~= gameOptionsStart + gameOptionsCount then + error("Source template " .. relativeTemplatePath .. " must define an option called GAME") + end + + local gameOptions = string.sub(data, gameOptionsPos, gameOptionsLenPlusOne - 1) + local games = string.explode(gameOptions, ",%s*") + + files { + templateFile + } + + filter("files:" .. templateFile) + buildmessage("Templating source file " .. relativeTemplatePath) + buildinputs { + TargetDirectoryBuildTools .. "/" .. ExecutableByOs('RawTemplater') + } + buildcommands { + '"' .. TargetDirectoryBuildTools .. '/' .. ExecutableByOs('RawTemplater') .. '"' + .. ' -o "%{prj.location}/"' + .. " %{file.relpath}" + } + for i = 1, #games do + local gameName = games[i] + local outputFileName = path.replaceextension(path.replaceextension(relativeResultPath, "") .. gameName, resultExtension) + local outputFile = "%{prj.location}/Game/" .. gameName .. "/" .. outputFileName + + table.insert(createdFiles, outputFile) + + buildoutputs { + outputFile + } + end + filter {} + + includedirs { + "%{prj.location}" + } + + files { + createdFiles + } + end +end