From 80473fb1e465c1f86a9225d02a55d12b220b13e1 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 12 Sep 2021 15:48:03 +0200 Subject: [PATCH] #5128: Add IManipulatorManager interface, since I want the manipulator algorithms to be part of the core module. --- include/imanipulator.h | 26 ++++++++ radiantcore/CMakeLists.txt | 1 + .../manipulators/ManipulatorManager.cpp | 66 +++++++++++++++++++ tools/msvc/DarkRadiantCore.vcxproj | 1 + tools/msvc/DarkRadiantCore.vcxproj.filters | 3 + 5 files changed, 97 insertions(+) create mode 100644 radiantcore/selection/manipulators/ManipulatorManager.cpp diff --git a/include/imanipulator.h b/include/imanipulator.h index e2da0ad296..991e5aa1fc 100644 --- a/include/imanipulator.h +++ b/include/imanipulator.h @@ -2,6 +2,7 @@ #include #include +#include "imodule.h" template class BasicVector2; typedef BasicVector2 Vector2; @@ -39,6 +40,12 @@ class IManipulator Custom }; + enum class Context + { + Scene, // manipulate regular map elements + TextureTool, // manipualte UV coordinates + }; + /** * Part of a Manipulator which can be operated upon by the user. * @@ -116,4 +123,23 @@ class ISceneManipulator : virtual void render(RenderableCollector& collector, const VolumeTest& volume) = 0; }; +// Factory interface instantiating new IManipulator instances for a given purpose +class IManipulatorManager : + public RegisterableModule +{ +public: + virtual ~IManipulatorManager() {} + + // Acquire a new instance of the given manipulator for the given context and type + virtual IManipulator::Ptr createManipulator(IManipulator::Context context, IManipulator::Type type) = 0; +}; + +} + +const char* const MODULE_MANIPULATORMANAGER("ManipulatorManager"); + +inline selection::IManipulatorManager& GlobalManipulatorManager() +{ + static module::InstanceReference _reference(MODULE_MANIPULATORMANAGER); + return _reference; } diff --git a/radiantcore/CMakeLists.txt b/radiantcore/CMakeLists.txt index c668bf048d..ab922839b2 100644 --- a/radiantcore/CMakeLists.txt +++ b/radiantcore/CMakeLists.txt @@ -244,6 +244,7 @@ add_library(radiantcore MODULE selection/manipulators/DragManipulator.cpp selection/manipulators/ManipulatorBase.cpp selection/manipulators/ManipulatorComponents.cpp + selection/manipulators/ManipulatorManager.cpp selection/manipulators/ModelScaleManipulator.cpp selection/manipulators/RotateManipulator.cpp selection/manipulators/ScaleManipulator.cpp diff --git a/radiantcore/selection/manipulators/ManipulatorManager.cpp b/radiantcore/selection/manipulators/ManipulatorManager.cpp new file mode 100644 index 0000000000..fa099478e1 --- /dev/null +++ b/radiantcore/selection/manipulators/ManipulatorManager.cpp @@ -0,0 +1,66 @@ +#include "imanipulator.h" + +#include +#include "module/StaticModule.h" +#include "string/convert.h" + +namespace selection +{ + +class ManipulatorManager : + public IManipulatorManager +{ +private: + using ManipulatorsByType = std::map>; + std::map _manipulatorsByContext; + +public: + + IManipulator::Ptr createManipulator(IManipulator::Context context, IManipulator::Type type) override + { + if (_manipulatorsByContext.count(context) == 0) + { + throw std::runtime_error("Manipulator context not known: " + string::to_string(static_cast(context))); + } + + auto existing = _manipulatorsByContext[context].find(type); + + if (existing == _manipulatorsByContext[context].end()) + { + throw std::runtime_error("Manipulator type not known: " + string::to_string(static_cast(type))); + } + + return existing->second(); + } + + const std::string& getName() const + { + static std::string _name(MODULE_MANIPULATORMANAGER); + return _name; + } + + const StringSet& getDependencies() const + { + static StringSet _dependencies; + return _dependencies; + } + + void initialiseModule(const IApplicationContext& ctx) + { + rMessage() << getName() << "::initialiseModule called." << std::endl; + + _manipulatorsByContext.emplace(IManipulator::Context::Scene, ManipulatorsByType()); + _manipulatorsByContext.emplace(IManipulator::Context::TextureTool, ManipulatorsByType()); + + // TODO + } + + void shutdownModule() + { + _manipulatorsByContext.clear(); + } +}; + +module::StaticModule _manipulatorManagerInstance; + +} diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index 4360acf89e..5c46043c28 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -657,6 +657,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index e58fed1608..f7cea8b5b5 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -1075,6 +1075,9 @@ src\map\autosaver + + src\selection\manipulators +