Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
1.7 kB · 60 lines
C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061#include "glextensions.hpp"
#include <osg/GraphicsContext>
namespace SceneUtil{ namespace { std::set<osg::observer_ptr<osg::GLExtensions>> sGLExtensions;
class GLExtensionsObserver : public osg::Observer { public: static GLExtensionsObserver sInstance;
~GLExtensionsObserver() override { for (auto& ptr : sGLExtensions) { osg::ref_ptr<osg::GLExtensions> ref; if (ptr.lock(ref)) ref->removeObserver(this); } }
void objectDeleted(void* referenced) override { sGLExtensions.erase(static_cast<osg::GLExtensions*>(referenced)); } };
// construct after sGLExtensions so this gets destroyed first. GLExtensionsObserver GLExtensionsObserver::sInstance{}; }
bool glExtensionsReady() { return !sGLExtensions.empty(); }
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<osg::GLExtensions>()); (*itr)->addObserver(&GLExtensionsObserver::sInstance); }}