Skip to content

Commit

Permalink
#5128: Add IManipulatorManager interface, since I want the manipulato…
Browse files Browse the repository at this point in the history
…r algorithms to be part of the core module.
  • Loading branch information
codereader committed Sep 12, 2021
1 parent bdff5ea commit 80473fb
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 0 deletions.
26 changes: 26 additions & 0 deletions include/imanipulator.h
Expand Up @@ -2,6 +2,7 @@

#include <memory>
#include <string>
#include "imodule.h"

template<typename Element> class BasicVector2;
typedef BasicVector2<double> Vector2;
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -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<selection::IManipulatorManager> _reference(MODULE_MANIPULATORMANAGER);
return _reference;
}
1 change: 1 addition & 0 deletions radiantcore/CMakeLists.txt
Expand Up @@ -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
Expand Down
66 changes: 66 additions & 0 deletions radiantcore/selection/manipulators/ManipulatorManager.cpp
@@ -0,0 +1,66 @@
#include "imanipulator.h"

#include <map>
#include "module/StaticModule.h"
#include "string/convert.h"

namespace selection
{

class ManipulatorManager :
public IManipulatorManager
{
private:
using ManipulatorsByType = std::map<IManipulator::Type, std::function<IManipulator::Ptr()>>;
std::map<IManipulator::Context, ManipulatorsByType> _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<int>(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<int>(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<ManipulatorManager> _manipulatorManagerInstance;

}
1 change: 1 addition & 0 deletions tools/msvc/DarkRadiantCore.vcxproj
Expand Up @@ -657,6 +657,7 @@
<ClCompile Include="..\..\radiantcore\selection\manipulators\DragManipulator.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\ManipulatorBase.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\ManipulatorComponents.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\ManipulatorManager.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\ModelScaleManipulator.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\RotateManipulator.cpp" />
<ClCompile Include="..\..\radiantcore\selection\manipulators\ScaleManipulator.cpp" />
Expand Down
3 changes: 3 additions & 0 deletions tools/msvc/DarkRadiantCore.vcxproj.filters
Expand Up @@ -1075,6 +1075,9 @@
<ClCompile Include="..\..\radiantcore\map\autosaver\AutoSaver.cpp">
<Filter>src\map\autosaver</Filter>
</ClCompile>
<ClCompile Include="..\..\radiantcore\selection\manipulators\ManipulatorManager.cpp">
<Filter>src\selection\manipulators</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\radiantcore\modulesystem\ModuleLoader.h">
Expand Down

0 comments on commit 80473fb

Please sign in to comment.