diff --git a/include/ishaders.h b/include/ishaders.h index 64f6e04d58..82a131f781 100644 --- a/include/ishaders.h +++ b/include/ishaders.h @@ -414,9 +414,6 @@ class MaterialManager */ virtual void setActiveShaderUpdates(bool val) = 0; - virtual void attach(ModuleObserver& observer) = 0; - virtual void detach(ModuleObserver& observer) = 0; - virtual void setLightingEnabled(bool enabled) = 0; virtual const char* getTexturePrefix() const = 0; diff --git a/plugins/shaders/Doom3ShaderSystem.cpp b/plugins/shaders/Doom3ShaderSystem.cpp index e602514b0c..b547259e79 100644 --- a/plugins/shaders/Doom3ShaderSystem.cpp +++ b/plugins/shaders/Doom3ShaderSystem.cpp @@ -46,7 +46,6 @@ Doom3ShaderSystem::Doom3ShaderSystem() : _defLoader(std::bind(&Doom3ShaderSystem::loadMaterialFiles, this)), _enableActiveUpdates(true), _realised(false), - _observers(getName()), _currentOperation(nullptr) {} @@ -120,7 +119,6 @@ void Doom3ShaderSystem::realise() _defLoader.start(); _signalDefsLoaded.emit(); - _observers.realise(); _realised = true; } } @@ -130,7 +128,6 @@ void Doom3ShaderSystem::unrealise() if (_realised) { _signalDefsUnloaded.emit(); - _observers.unrealise(); freeShaders(); _realised = false; } @@ -208,26 +205,6 @@ void Doom3ShaderSystem::foreachShaderName(const ShaderNameCallback& callback) _library->foreachShaderName(callback); } -void Doom3ShaderSystem::attach(ModuleObserver& observer) -{ - _observers.attach(observer); - - if (_realised) - { - observer.realise(); - } -} - -void Doom3ShaderSystem::detach(ModuleObserver& observer) -{ - if (_realised) - { - observer.unrealise(); - } - - _observers.detach(observer); -} - void Doom3ShaderSystem::setLightingEnabled(bool enabled) { ensureDefsLoaded(); diff --git a/plugins/shaders/Doom3ShaderSystem.h b/plugins/shaders/Doom3ShaderSystem.h index 8ff6ce0252..b4de396aef 100644 --- a/plugins/shaders/Doom3ShaderSystem.h +++ b/plugins/shaders/Doom3ShaderSystem.h @@ -7,7 +7,6 @@ #include "icommandsystem.h" #include -#include "moduleobservers.h" #include "ShaderLibrary.h" #include "TableDefinition.h" @@ -44,10 +43,6 @@ class Doom3ShaderSystem : // TRUE if the material files have been parsed bool _realised; - // The observers that are attached to this system. These get - // notified upon realisation of this class. - ModuleObservers _observers; - // Signals for module subscribers sigc::signal _signalDefsLoaded; sigc::signal _signalDefsUnloaded; @@ -96,9 +91,6 @@ class Doom3ShaderSystem : _enableActiveUpdates = v; } - void attach(ModuleObserver& observer) override; - void detach(ModuleObserver& observer) override; - void setLightingEnabled(bool enabled) override; const char* getTexturePrefix() const override; diff --git a/radiant/render/OpenGLRenderSystem.cpp b/radiant/render/OpenGLRenderSystem.cpp index 54133dc5dc..3c0fc9ccd7 100644 --- a/radiant/render/OpenGLRenderSystem.cpp +++ b/radiant/render/OpenGLRenderSystem.cpp @@ -48,7 +48,10 @@ OpenGLRenderSystem::OpenGLRenderSystem() : // hence it will be attached in initialiseModule(). if (module::ModuleRegistry::Instance().moduleExists(MODULE_SHADERSYSTEM)) { - GlobalMaterialManager().attach(*this); + _materialDefsLoaded = GlobalMaterialManager().signal_DefsLoaded().connect( + sigc::mem_fun(*this, &OpenGLRenderSystem::realise)); + _materialDefsUnloaded = GlobalMaterialManager().signal_DefsUnloaded().connect( + sigc::mem_fun(*this, &OpenGLRenderSystem::unrealise)); } // If the openGL module is already initialised and a shared context is created @@ -62,12 +65,8 @@ OpenGLRenderSystem::OpenGLRenderSystem() : OpenGLRenderSystem::~OpenGLRenderSystem() { - // The static default rendersystem won't use this, it will detach itself - // in the shutdownModule() method. - if (module::ModuleRegistry::Instance().moduleExists(MODULE_SHADERSYSTEM)) - { - GlobalMaterialManager().detach(*this); - } + _materialDefsLoaded.disconnect(); + _materialDefsUnloaded.disconnect(); } ShaderPtr OpenGLRenderSystem::capture(const std::string& name) @@ -524,7 +523,10 @@ void OpenGLRenderSystem::initialiseModule(const ApplicationContext& ctx) { rMessage() << getName() << "::initialiseModule called." << std::endl; - GlobalMaterialManager().attach(*this); + _materialDefsLoaded = GlobalMaterialManager().signal_DefsLoaded().connect( + sigc::mem_fun(*this, &OpenGLRenderSystem::realise)); + _materialDefsUnloaded = GlobalMaterialManager().signal_DefsUnloaded().connect( + sigc::mem_fun(*this, &OpenGLRenderSystem::unrealise)); // greebo: Don't realise the module yet, this must wait // until the shared GL context has been created (this @@ -533,7 +535,8 @@ void OpenGLRenderSystem::initialiseModule(const ApplicationContext& ctx) void OpenGLRenderSystem::shutdownModule() { - GlobalMaterialManager().detach(*this); + _materialDefsLoaded.disconnect(); + _materialDefsUnloaded.disconnect(); } // Define the static ShaderCache module diff --git a/radiant/render/OpenGLRenderSystem.h b/radiant/render/OpenGLRenderSystem.h index 5f48b95052..5721a4a609 100644 --- a/radiant/render/OpenGLRenderSystem.h +++ b/radiant/render/OpenGLRenderSystem.h @@ -1,6 +1,7 @@ #pragma once #include "irender.h" +#include #include #include "imodule.h" #include "backend/OpenGLStateManager.h" @@ -20,8 +21,7 @@ typedef std::shared_ptr GLProgramFactoryPtr; */ class OpenGLRenderSystem : public RenderSystem, - public OpenGLStateManager, - public ModuleObserver + public OpenGLStateManager { private: // Map of named Shader objects @@ -51,6 +51,9 @@ class OpenGLRenderSystem sigc::signal _sigExtensionsInitialised; + sigc::connection _materialDefsLoaded; + sigc::connection _materialDefsUnloaded; + private: void propagateLightChangedFlagToAllLights();