Skip to content

Commit

Permalink
#5200: Introduce WxGLWidgetManager which acts as global GL widget reg…
Browse files Browse the repository at this point in the history
…istration instance. It will create the shared wxGLContext and send it to the GL context holder.
  • Loading branch information
codereader committed Sep 16, 2020
1 parent cf97407 commit 564f6c3
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 0 deletions.
38 changes: 38 additions & 0 deletions include/iwxgl.h
@@ -0,0 +1,38 @@
#pragma once

#include "igl.h"

namespace wxutil { class GLWidget; }

namespace ui
{

// Application wide manager for wxGLWidgets
// All GLWidgets need to register themselves to this module
// since the shared wxGLContext creation will be bound to
// the first registered widget
class IWxGLWidgetManager :
public RegisterableModule
{
public:
/// Registers a GL widget, storing the shared context if necessary
virtual void registerGLWidget(wxutil::GLWidget* widget) = 0;

/// Notifies the GL module that a GLWidget has been destroyed
virtual void unregisterGLWidget(wxutil::GLWidget* widget) = 0;
};

}

const char* const MODULE_WXGLWIDGET_MANAGER("wxGLWidgetManager");

inline ui::IWxGLWidgetManager& GlobalWxGlWidgetManager()
{
// Cache the reference locally
static ui::IWxGLWidgetManager& _instance(
*std::static_pointer_cast<ui::IWxGLWidgetManager>(
module::GlobalModuleRegistry().getModule(MODULE_WXGLWIDGET_MANAGER)
)
);
return _instance;
}
1 change: 1 addition & 0 deletions radiant/Makefile.am
Expand Up @@ -122,6 +122,7 @@ darkradiant_SOURCES = main.cpp \
ui/filters/FiltersMainMenu.cpp \
ui/filters/editor/FilterDialog.cpp \
ui/filters/editor/FilterEditor.cpp \
ui/gl/WxGLWidgetManager.cpp \
ui/prefdialog/GameSetupDialog.cpp \
ui/prefdialog/GameSetupPage.cpp \
ui/prefdialog/GameSetupPageIdTech.cpp \
Expand Down
74 changes: 74 additions & 0 deletions radiant/ui/gl/WxGLWidgetManager.cpp
@@ -0,0 +1,74 @@
#include "WxGLWidgetManager.h"

#include "module/StaticModule.h"

namespace ui
{

void WxGLWidgetManager::registerGLWidget(wxutil::GLWidget* widget)
{
auto result = _wxGLWidgets.insert(widget);

if (result.second && _wxGLWidgets.size() == 1)
{
// TODO
#if 0
// First non-duplicated widget registered, take this as context holder
_wxSharedContext = new wxGLContext(widget);

// Create a context
widget->SetCurrent(*_wxSharedContext);
assertNoErrors();

_wxContextValid = true;

sharedContextCreated();
#endif
}
}

void WxGLWidgetManager::unregisterGLWidget(wxutil::GLWidget* widget)
{
assert(_wxGLWidgets.find(widget) != _wxGLWidgets.end());

_wxGLWidgets.erase(widget);

if (_wxGLWidgets.empty())
{
#if 0
// This is the last active GL widget
_wxContextValid = false;

sharedContextDestroyed();

delete _wxSharedContext;
_wxSharedContext = NULL;
#endif
}
}

const std::string& WxGLWidgetManager::getName() const
{
static std::string _name(MODULE_WXGLWIDGET_MANAGER);
return _name;
}

const StringSet& WxGLWidgetManager::getDependencies() const
{
static StringSet _dependencies;
return _dependencies;
}

void WxGLWidgetManager::initialiseModule(const IApplicationContext& ctx)
{
rMessage() << getName() << "::initialiseModule called." << std::endl;
}

void WxGLWidgetManager::shutdownModule()
{
_wxGLWidgets.clear();
}

module::StaticModule<WxGLWidgetManager> wxGLWidgetManagerModule;

}
26 changes: 26 additions & 0 deletions radiant/ui/gl/WxGLWidgetManager.h
@@ -0,0 +1,26 @@
#pragma once

#include <set>
#include "iwxgl.h"

namespace ui
{

class WxGLWidgetManager :
public IWxGLWidgetManager
{
private:
std::set<wxutil::GLWidget*> _wxGLWidgets;

public:
void registerGLWidget(wxutil::GLWidget* widget) override;
void unregisterGLWidget(wxutil::GLWidget* widget) override;

// RegisterableModule implementation
const std::string& getName() const override;
const StringSet& getDependencies() const override;
void initialiseModule(const IApplicationContext& ctx) override;
void shutdownModule() override;
};

}
2 changes: 2 additions & 0 deletions tools/msvc/DarkRadiant.vcxproj
Expand Up @@ -259,6 +259,7 @@
<ClCompile Include="..\..\radiant\ui\filters\FilterOrthoContextMenuItem.cpp" />
<ClCompile Include="..\..\radiant\ui\filters\FiltersMainMenu.cpp" />
<ClCompile Include="..\..\radiant\ui\filters\FilterUserInterface.cpp" />
<ClCompile Include="..\..\radiant\ui\gl\WxGLWidgetManager.cpp" />
<ClCompile Include="..\..\radiant\ui\grid\GridUserInterface.cpp" />
<ClCompile Include="..\..\radiant\ui\layers\CreateLayerDialog.cpp" />
<ClCompile Include="..\..\radiant\ui\LongRunningOperationHandler.cpp" />
Expand Down Expand Up @@ -444,6 +445,7 @@
<ClInclude Include="..\..\radiant\ui\filters\FilterOrthoContextMenuItem.h" />
<ClInclude Include="..\..\radiant\ui\filters\FiltersMainMenu.h" />
<ClInclude Include="..\..\radiant\ui\filters\FilterUserInterface.h" />
<ClInclude Include="..\..\radiant\ui\gl\WxGLWidgetManager.h" />
<ClInclude Include="..\..\radiant\ui\grid\GridUserInterface.h" />
<ClInclude Include="..\..\radiant\ui\layers\CreateLayerDialog.h" />
<ClInclude Include="..\..\radiant\ui\LongRunningOperationHandler.h" />
Expand Down
9 changes: 9 additions & 0 deletions tools/msvc/DarkRadiant.vcxproj.filters
Expand Up @@ -170,6 +170,9 @@
<Filter Include="src\ui\statusbar">
<UniqueIdentifier>{ef5c6dc4-3f56-434e-b371-f2804f9088ed}</UniqueIdentifier>
</Filter>
<Filter Include="src\ui\gl">
<UniqueIdentifier>{360f8d9f-f078-4296-9633-913d79de1b79}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\radiant\main.cpp">
Expand Down Expand Up @@ -667,6 +670,9 @@
<ClCompile Include="..\..\radiant\settings\LocalisationModule.cpp">
<Filter>src\settings</Filter>
</ClCompile>
<ClCompile Include="..\..\radiant\ui\gl\WxGLWidgetManager.cpp">
<Filter>src\ui\gl</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\radiant\camera\Camera.h">
Expand Down Expand Up @@ -1296,6 +1302,9 @@
<ClInclude Include="..\..\radiant\ui\SelectionModeToggle.h">
<Filter>src\ui</Filter>
</ClInclude>
<ClInclude Include="..\..\radiant\ui\gl\WxGLWidgetManager.h">
<Filter>src\ui\gl</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\radiant\darkradiant.rc" />
Expand Down
1 change: 1 addition & 0 deletions tools/msvc/include.vcxproj
Expand Up @@ -192,6 +192,7 @@
<ClInclude Include="..\..\include\iuimanager.h" />
<ClInclude Include="..\..\include\iundo.h" />
<ClInclude Include="..\..\include\ivolumetest.h" />
<ClInclude Include="..\..\include\iwxgl.h" />
<ClInclude Include="..\..\include\mapfile.h" />
<ClInclude Include="..\..\include\modelskin.h" />
<ClInclude Include="..\..\include\ModResource.h" />
Expand Down

0 comments on commit 564f6c3

Please sign in to comment.