#ifndef RENDERERCONTEXT_HPP #define RENDERERCONTEXT_HPP #include "renderercontext.h" template RendererContext::RendererContext(const IGraphicsDocument *doc, const QOpenGLContext *newOpenglContext) { Q_ASSERT(newOpenglContext != nullptr); if (newOpenglContext == nullptr) {qDebug() << "RendererContext::RendererContext" << ", " << "newOpenglContext == nullptr"; return;} m_document = const_cast(doc); m_newContext = const_cast(newOpenglContext); } template RendererContext::~RendererContext() { qDeleteAll(m_customValues.begin(), m_customValues.end()); qDeleteAll(m_displayListsManager.begin(), m_displayListsManager.end()); qDeleteAll(m_arrayObjectManagers.begin(), m_arrayObjectManagers.end()); } template bool RendererContext::makeCurrent() { if(getDocument() == nullptr) return false; QOpenGLWidget* w = getDocument()->getOpengWidgetWithContext(m_newContext); if((w == nullptr) || !w->isValid()) return false; w->makeCurrent(); return true; } template Shaders& RendererContext::getShaders() const { return const_cast(m_shaders); } template void RendererContext::destroyGLShaders() { m_shaders.destroyGL(); } template ChunkCustomUpdateValues* RendererContext::createOrGetChunkCustomUpdateValues(const void* object) { ChunkCustomUpdateValues* b = m_customValues.value((void*)object, nullptr); if(b == nullptr) { b = new ChunkCustomUpdateValues(); m_customValues.insert((void*)object, b); } return b; } template void RendererContext::destroyChunkCustomUpdateValues(void* object) { ChunkCustomUpdateValues* b = m_customValues.value(object, nullptr); if(b != nullptr) { m_customValues.remove(object); delete b; } } template void RendererContext::destroyGLBuffers(void *object) { ArrayObjectManagerType* aom = m_arrayObjectManagers.value(object, nullptr); if(aom != nullptr) { m_arrayObjectManagers.remove(object); delete aom; } getBufferObjectManager().deleteAllBOFor(object); } template GLuint RendererContext::createOrGetDisplayList(void* object, const size_t& uniqueIndex) { DisplayListManager* dlManager = m_displayListsManager.value(object, nullptr); if(dlManager == nullptr) { dlManager = new DisplayListManager(); m_displayListsManager.insert(object, dlManager); } return dlManager->createOrGetDisplayList(uniqueIndex); } template bool RendererContext::executeOrCreateAndCompileAndExecuteDisplayList(void* object, const size_t& uniqueIndex) { DisplayListManager* dlManager = m_displayListsManager.value(object, nullptr); if(dlManager == nullptr) { dlManager = new DisplayListManager(); m_displayListsManager.insert(object, dlManager); } return dlManager->executeOrCreateAndCompileAndExecuteDisplayList(uniqueIndex); } template void RendererContext::endDisplayList(void* object, const size_t& uniqueIndex) { DisplayListManager* dlManager = m_displayListsManager.value(object, nullptr); if(dlManager == nullptr) return; return dlManager->endDisplayList(uniqueIndex); } template void RendererContext::destroyAllDisplayList(void* object) { DisplayListManager* dlManager = m_displayListsManager.value(object, nullptr); if(dlManager == nullptr) return; delete dlManager; m_displayListsManager.remove(object); } template void RendererContext::destroyAll(void* object) { destroyGLBuffers(object); destroyAllDisplayList(object); destroyChunkCustomUpdateValues(object); } template void RendererContext::destroyGL() { destroyGLShaders(); getBufferObjectManager().deleteAllBO(); qDeleteAll(m_customValues.begin(), m_customValues.end()); m_customValues.clear(); qDeleteAll(m_arrayObjectManagers.begin(), m_arrayObjectManagers.end()); m_arrayObjectManagers.clear(); qDeleteAll(m_displayListsManager.begin(), m_displayListsManager.end()); m_displayListsManager.clear(); } template IGraphicsDocument* RendererContext::getDocument() const { return m_document; } template QOpenGLContext* RendererContext::getOpenglContext() const { return m_newContext; } template TextureManager& RendererContext::getTexturesManager() const { return const_cast(m_textureManager); } template BufferObjectManager& RendererContext::getBufferObjectManager() const { return AMKglEA->createOrGetBufferObjectManager(m_newContext); } template typename RendererContext::ArrayObjectManagerType& RendererContext::createOrGetArrayObjectManager(void* object) { ArrayObjectManagerType* b = m_arrayObjectManagers.value((void*)object, nullptr); if(b == nullptr) { b = new ArrayObjectManagerType(); m_arrayObjectManagers.insert((void*)object, b); } return *b; } #endif // RENDERERCONTEXT_HPP