From 8cef16017e4928c970da39290e3621b17974f1b9 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Thu, 11 Feb 2016 11:26:41 +0100 Subject: [PATCH] Use wink-signals boost.signals sadly requires way too many dependencies, libsigc++ requires too much configuration and all the other libs I tested mostly required constexpr as callbacks (due to passing callbacks via template list), which doesn't server this purpose, so wink-signals seems just about right for what we do. --- .gitmodules | 3 +++ deps/Wink-Signals | 1 + deps/protobuf | 2 +- premake5.lua | 1 + src/Components/Modules/AssetHandler.cpp | 19 ++++++++----------- src/Components/Modules/AssetHandler.hpp | 6 +++--- src/Components/Modules/Dedicated.cpp | 15 +++++---------- src/Components/Modules/Dedicated.hpp | 7 +++---- src/Components/Modules/Dvar.cpp | 13 +++++-------- src/Components/Modules/Dvar.hpp | 6 +++--- src/Components/Modules/Maps.cpp | 7 +++---- src/Components/Modules/Maps.hpp | 2 +- src/Components/Modules/QuickPatch.cpp | 12 ++++-------- src/Components/Modules/QuickPatch.hpp | 6 +++--- src/Components/Modules/Renderer.cpp | 15 +++++++-------- src/Components/Modules/Renderer.hpp | 6 +++--- src/Components/Modules/ZoneBuilder.cpp | 4 +--- src/STDInclude.hpp | 1 + 18 files changed, 56 insertions(+), 70 deletions(-) create mode 160000 deps/Wink-Signals diff --git a/.gitmodules b/.gitmodules index 39e5c987..8d109cc4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,3 +20,6 @@ [submodule "deps/protobuf"] path = deps/protobuf url = https://github.com/google/protobuf.git +[submodule "deps/Wink-Signals"] + path = deps/Wink-Signals + url = https://github.com/miguelmartin75/Wink-Signals.git diff --git a/deps/Wink-Signals b/deps/Wink-Signals new file mode 160000 index 00000000..7fde542d --- /dev/null +++ b/deps/Wink-Signals @@ -0,0 +1 @@ +Subproject commit 7fde542d24a7fa0cdac23fbd093f9bd60b9c2c52 diff --git a/deps/protobuf b/deps/protobuf index bc215089..028d59fc 160000 --- a/deps/protobuf +++ b/deps/protobuf @@ -1 +1 @@ -Subproject commit bc215089ca7d9da3a2b313b250d1dee665eda438 +Subproject commit 028d59fccda7a94c3fd39095261caceb77456af3 diff --git a/premake5.lua b/premake5.lua index 3b9b72c6..d8e25802 100644 --- a/premake5.lua +++ b/premake5.lua @@ -109,6 +109,7 @@ workspace "iw4x" "./deps/libtomcrypt/src/headers", "./deps/libtommath", "./deps/protobuf/src", + "./deps/Wink-Signals", } -- Virtual paths diff --git a/src/Components/Modules/AssetHandler.cpp b/src/Components/Modules/AssetHandler.cpp index 670ac40a..e9e4546f 100644 --- a/src/Components/Modules/AssetHandler.cpp +++ b/src/Components/Modules/AssetHandler.cpp @@ -5,7 +5,7 @@ namespace Components bool AssetHandler::BypassState = false; std::map AssetHandler::AssetInterfaces; std::map AssetHandler::TypeCallbacks; - std::vector AssetHandler::RestrictCallbacks; + wink::signal> AssetHandler::RestrictSignal; std::map AssetHandler::Relocations; @@ -110,15 +110,11 @@ namespace Components const char* name = Game::DB_GetXAssetNameHandlers[type](asset); if (!name) return false; - for (auto callback : AssetHandler::RestrictCallbacks) - { - if (!callback(type, *asset, name)) - { - return false; - } - } + bool restrict = false; + AssetHandler::RestrictSignal(type, *asset, name, &restrict); - return true; + // If no slot restricts the loading, we can load the asset + return (!restrict); } void __declspec(naked) AssetHandler::AddAssetStub() @@ -149,9 +145,9 @@ namespace Components AssetHandler::TypeCallbacks[type] = callback; } - void AssetHandler::OnLoad(RestrictCallback callback) + void AssetHandler::OnLoad(RestrictCallback* callback) { - AssetHandler::RestrictCallbacks.push_back(callback); + AssetHandler::RestrictSignal.connect(callback); } void AssetHandler::Relocate(void* start, void* to, DWORD size) @@ -279,6 +275,7 @@ namespace Components } AssetHandler::AssetInterfaces.clear(); + //AssetHandler::RestrictSignal.clear(); AssetHandler::TypeCallbacks.clear(); } } diff --git a/src/Components/Modules/AssetHandler.hpp b/src/Components/Modules/AssetHandler.hpp index 89757228..ad0fdc36 100644 --- a/src/Components/Modules/AssetHandler.hpp +++ b/src/Components/Modules/AssetHandler.hpp @@ -14,14 +14,14 @@ namespace Components }; typedef Game::XAssetHeader(*Callback)(Game::XAssetType type, std::string name); - typedef bool(*RestrictCallback)(Game::XAssetType type, Game::XAssetHeader asset, std::string name); + typedef void(RestrictCallback)(Game::XAssetType type, Game::XAssetHeader asset, std::string name, bool* restrict); AssetHandler(); ~AssetHandler(); const char* GetName() { return "AssetHandler"; }; static void OnFind(Game::XAssetType type, Callback callback); - static void OnLoad(RestrictCallback callback); + static void OnLoad(RestrictCallback* callback); static void Relocate(void* start, void* to, DWORD size = 4); @@ -50,7 +50,7 @@ namespace Components static std::map AssetInterfaces; static std::map TypeCallbacks; - static std::vector RestrictCallbacks; + static wink::signal> RestrictSignal; static std::map Relocations; }; diff --git a/src/Components/Modules/Dedicated.cpp b/src/Components/Modules/Dedicated.cpp index 1132cc2e..c1ed3d0d 100644 --- a/src/Components/Modules/Dedicated.cpp +++ b/src/Components/Modules/Dedicated.cpp @@ -2,8 +2,7 @@ namespace Components { - Dvar::Var Dedicated::Dedi; - std::vector Dedicated::FrameCallbacks; + wink::signal> Dedicated::FrameSignal; bool Dedicated::IsDedicated() { @@ -144,18 +143,14 @@ namespace Components Network::SendCommand(master, "heartbeat", "IW4"); } - void Dedicated::OnFrame(Dedicated::Callback callback) + void Dedicated::OnFrame(Dedicated::Callback* callback) { - Dedicated::FrameCallbacks.push_back(callback); + Dedicated::FrameSignal.connect(callback); } void Dedicated::FrameStub() { - for (auto callback : Dedicated::FrameCallbacks) - { - callback(); - } - + Dedicated::FrameSignal(); Utils::Hook::Call(0x5A8E80)(); } @@ -250,6 +245,6 @@ namespace Components Dedicated::~Dedicated() { - Dedicated::FrameCallbacks.clear(); + //Dedicated::FrameSignal.clear(); } } diff --git a/src/Components/Modules/Dedicated.hpp b/src/Components/Modules/Dedicated.hpp index 29f3cce0..6c342c49 100644 --- a/src/Components/Modules/Dedicated.hpp +++ b/src/Components/Modules/Dedicated.hpp @@ -3,7 +3,7 @@ namespace Components class Dedicated : public Component { public: - typedef void(*Callback)(); + typedef void(Callback)(); Dedicated(); ~Dedicated(); @@ -13,11 +13,10 @@ namespace Components static void Heartbeat(); - static void OnFrame(Callback callback); + static void OnFrame(Callback* callback); private: - static Dvar::Var Dedi; - static std::vector FrameCallbacks; + static wink::signal> FrameSignal; static void MapRotate(); static void FrameStub(); diff --git a/src/Components/Modules/Dvar.cpp b/src/Components/Modules/Dvar.cpp index 0e18af4f..4878f3e1 100644 --- a/src/Components/Modules/Dvar.cpp +++ b/src/Components/Modules/Dvar.cpp @@ -2,7 +2,7 @@ namespace Components { - std::vector Dvar::RegistrationCallbacks; + wink::signal> Dvar::RegistrationSignal; Dvar::Var::Var(std::string dvarName) : Var() { @@ -131,18 +131,15 @@ namespace Components return Game::Dvar_RegisterInt(name, value, min, max, flag.val, description); } - void Dvar::OnInit(Dvar::Callback callback) + void Dvar::OnInit(Dvar::Callback* callback) { - Dvar::RegistrationCallbacks.push_back(callback); + Dvar::RegistrationSignal.connect(callback); } Game::dvar_t* Dvar::RegisterName(const char* name, const char* default, Game::dvar_flag flag, const char* description) { // Run callbacks - for (auto callback : Dvar::RegistrationCallbacks) - { - callback(); - } + Dvar::RegistrationSignal(); // Name watcher Renderer::OnFrame([] () @@ -205,6 +202,6 @@ namespace Components Dvar::~Dvar() { - Dvar::RegistrationCallbacks.clear(); + //Dvar::RegistrationSignal.clear(); } } diff --git a/src/Components/Modules/Dvar.hpp b/src/Components/Modules/Dvar.hpp index af326a9e..decc255f 100644 --- a/src/Components/Modules/Dvar.hpp +++ b/src/Components/Modules/Dvar.hpp @@ -3,7 +3,7 @@ namespace Components class Dvar : public Component { public: - typedef void(*Callback)(); + typedef void(Callback)(); struct Flag { @@ -42,14 +42,14 @@ namespace Components ~Dvar(); const char* GetName() { return "Dvar"; }; - static void OnInit(Callback callback); + static void OnInit(Callback* callback); // Only strings and bools use this type of declaration template static Var Register(const char* name, T value, Flag flag, const char* description); template static Var Register(const char* name, T value, T min, T max, Flag flag, const char* description); private: - static std::vector RegistrationCallbacks; + static wink::signal> RegistrationSignal; static Game::dvar_t* RegisterName(const char* name, const char* default, Game::dvar_flag flag, const char* description); }; diff --git a/src/Components/Modules/Maps.cpp b/src/Components/Modules/Maps.cpp index 2dc7d912..a2f39bbb 100644 --- a/src/Components/Modules/Maps.cpp +++ b/src/Components/Modules/Maps.cpp @@ -50,13 +50,14 @@ namespace Components return FastFiles::LoadLocalizeZones(data.data(), data.size(), sync); } - bool Maps::LoadAssetRestrict(Game::XAssetType type, Game::XAssetHeader asset, std::string name) + void Maps::LoadAssetRestrict(Game::XAssetType type, Game::XAssetHeader asset, std::string name, bool* restrict) { if (std::find(Maps::CurrentDependencies.begin(), Maps::CurrentDependencies.end(), FastFiles::Current()) != Maps::CurrentDependencies.end()) { if (type == Game::XAssetType::ASSET_TYPE_GAME_MAP_MP || type == Game::XAssetType::ASSET_TYPE_COL_MAP_MP || type == Game::XAssetType::ASSET_TYPE_GFX_MAP || type == Game::XAssetType::ASSET_TYPE_MAP_ENTS || type == Game::XAssetType::ASSET_TYPE_COM_MAP || type == Game::XAssetType::ASSET_TYPE_FX_MAP) { - return false; + *restrict = true; + return; } } @@ -70,8 +71,6 @@ namespace Components asset.mapEnts->entitystring = mapEntities.data(); } } - - return true; } void Maps::GetBSPName(char* buffer, size_t size, const char* format, const char* mapname) diff --git a/src/Components/Modules/Maps.hpp b/src/Components/Modules/Maps.hpp index 145f4ab0..bb6873eb 100644 --- a/src/Components/Modules/Maps.hpp +++ b/src/Components/Modules/Maps.hpp @@ -19,7 +19,7 @@ namespace Components static std::vector CurrentDependencies; static void GetBSPName(char* buffer, size_t size, const char* format, const char* mapname); - static bool LoadAssetRestrict(Game::XAssetType type, Game::XAssetHeader asset, std::string name); + static void LoadAssetRestrict(Game::XAssetType type, Game::XAssetHeader asset, std::string name, bool* restrict); static void LoadMapZones(Game::XZoneInfo *zoneInfo, unsigned int zoneCount, int sync); void ReallocateEntryPool(); diff --git a/src/Components/Modules/QuickPatch.cpp b/src/Components/Modules/QuickPatch.cpp index 4c5a8e3b..011f9cb0 100644 --- a/src/Components/Modules/QuickPatch.cpp +++ b/src/Components/Modules/QuickPatch.cpp @@ -2,7 +2,7 @@ namespace Components { - std::vector QuickPatch::ShutdownCallbacks; + wink::signal> QuickPatch::ShutdownSignal; int64_t* QuickPatch::GetStatsID() { @@ -12,17 +12,13 @@ namespace Components void QuickPatch::OnShutdown(QuickPatch::Callback callback) { - QuickPatch::ShutdownCallbacks.push_back(callback); + QuickPatch::ShutdownSignal.connect(callback); } void QuickPatch::ShutdownStub(int channel, const char* message) { Game::Com_Printf(0, message); - - for (auto callback : QuickPatch::ShutdownCallbacks) - { - if (callback) callback(); - } + QuickPatch::ShutdownSignal(); } void QuickPatch::UnlockStats() @@ -207,6 +203,6 @@ namespace Components QuickPatch::~QuickPatch() { - QuickPatch::ShutdownCallbacks.clear(); + //QuickPatch::ShutdownSignal.clear(); } } diff --git a/src/Components/Modules/QuickPatch.hpp b/src/Components/Modules/QuickPatch.hpp index b464b1ce..37b0ae6b 100644 --- a/src/Components/Modules/QuickPatch.hpp +++ b/src/Components/Modules/QuickPatch.hpp @@ -3,17 +3,17 @@ namespace Components class QuickPatch : public Component { public: - typedef void(*Callback)(); + typedef void(Callback)(); QuickPatch(); ~QuickPatch(); const char* GetName() { return "QuickPatch"; }; static void UnlockStats(); - static void OnShutdown(Callback callback); + static void OnShutdown(Callback* callback); private: - static std::vector ShutdownCallbacks; + static wink::signal> ShutdownSignal; static int64_t* GetStatsID(); static void ShutdownStub(int channel, const char* message); diff --git a/src/Components/Modules/Renderer.cpp b/src/Components/Modules/Renderer.cpp index 679b12d6..b1b3bbb4 100644 --- a/src/Components/Modules/Renderer.cpp +++ b/src/Components/Modules/Renderer.cpp @@ -3,7 +3,7 @@ namespace Components { Utils::Hook Renderer::DrawFrameHook; - std::vector Renderer::FrameCallbacks; + wink::signal> Renderer::FrameSignal; void __declspec(naked) Renderer::FrameHook() { @@ -16,15 +16,12 @@ namespace Components void Renderer::FrameHandler() { - for (auto callback : Renderer::FrameCallbacks) - { - callback(); - } + Renderer::FrameSignal(); } - void Renderer::OnFrame(Renderer::Callback callback) + void Renderer::OnFrame(Renderer::Callback* callback) { - Renderer::FrameCallbacks.push_back(callback); + Renderer::FrameSignal.connect(callback); } int Renderer::Width() @@ -46,6 +43,8 @@ namespace Components Renderer::~Renderer() { Renderer::DrawFrameHook.Uninstall(); - Renderer::FrameCallbacks.clear(); + + // As I don't want to include my fork as submodule, we have to wait till my pull request gets accepted in order to do this. + //Renderer::FrameSignal.clear(); } } diff --git a/src/Components/Modules/Renderer.hpp b/src/Components/Modules/Renderer.hpp index 6029f2a3..777f39a9 100644 --- a/src/Components/Modules/Renderer.hpp +++ b/src/Components/Modules/Renderer.hpp @@ -3,7 +3,7 @@ namespace Components class Renderer : public Component { public: - typedef void(*Callback)(); + typedef void(Callback)(); Renderer(); ~Renderer(); @@ -12,13 +12,13 @@ namespace Components static int Width(); static int Height(); - static void OnFrame(Callback callback); + static void OnFrame(Callback* callback); private: static void FrameHook(); static void FrameHandler(); - static std::vector FrameCallbacks; + static wink::signal> FrameSignal; static Utils::Hook DrawFrameHook; }; } diff --git a/src/Components/Modules/ZoneBuilder.cpp b/src/Components/Modules/ZoneBuilder.cpp index 0ba75bd4..aad33ccc 100644 --- a/src/Components/Modules/ZoneBuilder.cpp +++ b/src/Components/Modules/ZoneBuilder.cpp @@ -447,7 +447,7 @@ namespace Components static_assert(sizeof(Game::XFile) == 40, "Invalid XFile structure!"); static_assert(Game::MAX_XFILE_COUNT == 8, "XFile block enum is invalid!"); - AssetHandler::OnLoad([] (Game::XAssetType type, Game::XAssetHeader asset, std::string name) + AssetHandler::OnLoad([] (Game::XAssetType type, Game::XAssetHeader asset, std::string name, bool* restrict) { // static void* blocTable = 0; // @@ -471,8 +471,6 @@ namespace Components // } // } // } - - return true; }); if (ZoneBuilder::IsEnabled()) diff --git a/src/STDInclude.hpp b/src/STDInclude.hpp index 74877e0b..68c30a13 100644 --- a/src/STDInclude.hpp +++ b/src/STDInclude.hpp @@ -59,6 +59,7 @@ //#include #include #include +#include // Protobuf #include