#include "glextensions.hpp" #include namespace SceneUtil { namespace { std::set> sGLExtensions; class GLExtensionsObserver : public osg::Observer { public: static GLExtensionsObserver sInstance; void objectDeleted(void* referenced) override { sGLExtensions.erase(static_cast(referenced)); } }; GLExtensionsObserver GLExtensionsObserver::sInstance{}; } osg::GLExtensions& getGLExtensions() { if (sGLExtensions.empty()) throw std::runtime_error( "GetGLExtensionsOperation was not used when the current context was created or there is no current " "context"); return **sGLExtensions.begin(); } GetGLExtensionsOperation::GetGLExtensionsOperation() : GraphicsOperation("GetGLExtensionsOperation", false) { } void GetGLExtensionsOperation::operator()(osg::GraphicsContext* graphicsContext) { auto [itr, _] = sGLExtensions.emplace(graphicsContext->getState()->get()); (*itr)->addObserver(&GLExtensionsObserver::sInstance); } }