/
SpacePartitionRenderer.cpp
91 lines (73 loc) · 2.28 KB
/
SpacePartitionRenderer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "SpacePartitionRenderer.h"
#include "registry/adaptors.h"
#include "module/StaticModule.h"
#include <functional>
namespace render
{
namespace
{
const std::string RKEY_RENDER_SPACE_PARTITION = "debug/ui/scenegraph/renderSpacePartition";
}
void SpacePartitionRenderer::toggle(const cmd::ArgumentList& args)
{
registry::setValue(
RKEY_RENDER_SPACE_PARTITION,
!registry::getValue<bool>(RKEY_RENDER_SPACE_PARTITION)
);
}
const std::string& SpacePartitionRenderer::getName() const
{
static std::string _name("SpacePartitionRenderer");
return _name;
}
const StringSet& SpacePartitionRenderer::getDependencies() const
{
static StringSet _dependencies;
if (_dependencies.empty())
{
_dependencies.insert(MODULE_RENDERSYSTEM);
_dependencies.insert(MODULE_SCENEGRAPH);
_dependencies.insert(MODULE_XMLREGISTRY);
_dependencies.insert(MODULE_COMMANDSYSTEM);
}
return _dependencies;
}
void SpacePartitionRenderer::initialiseModule(const IApplicationContext& ctx)
{
registry::observeBooleanKey(
RKEY_RENDER_SPACE_PARTITION,
sigc::mem_fun(this, &SpacePartitionRenderer::installRenderer),
sigc::mem_fun(this, &SpacePartitionRenderer::uninstallRenderer)
);
if (registry::getValue<bool>(RKEY_RENDER_SPACE_PARTITION))
{
installRenderer();
}
// Add the icon to the toolbar
GlobalCommandSystem().addCommand("ToggleSpacePartitionRendering", std::bind(&SpacePartitionRenderer::toggle, this, std::placeholders::_1));
}
void SpacePartitionRenderer::shutdownModule()
{
if (registry::getValue<bool>(RKEY_RENDER_SPACE_PARTITION))
{
uninstallRenderer();
}
}
void SpacePartitionRenderer::installRenderer()
{
_renderableSP.setSpacePartition(GlobalSceneGraph().getSpacePartition());
_renderableSP.setRenderSystem(std::dynamic_pointer_cast<RenderSystem>(
module::GlobalModuleRegistry().getModule(MODULE_RENDERSYSTEM)));
GlobalRenderSystem().attachRenderable(_renderableSP);
}
void SpacePartitionRenderer::uninstallRenderer()
{
_renderableSP.setRenderSystem(RenderSystemPtr());
_renderableSP.setSpacePartition(scene::ISpacePartitionSystemPtr());
GlobalRenderSystem().detachRenderable(_renderableSP);
}
#ifdef _DEBUG
// The module is only active in debug builds
module::StaticModuleRegistration<SpacePartitionRenderer> spacePartitionModule;
#endif
} // namespace render