From f9ca7d90aac90a6c7201b4773d6a350cd1708d61 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 23 Jan 2022 09:00:04 +0100 Subject: [PATCH] #5584: Clients can request their text renderers with a certain font style and size --- include/irender.h | 7 ++-- .../rendersystem/OpenGLRenderSystem.cpp | 37 +++++++++++++------ radiantcore/rendersystem/OpenGLRenderSystem.h | 5 ++- .../rendersystem/backend/TextRenderer.h | 17 ++++----- .../manipulators/RotateManipulator.cpp | 7 ++-- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/include/irender.h b/include/irender.h index 33a0e603fa..b4647cd670 100644 --- a/include/irender.h +++ b/include/irender.h @@ -558,10 +558,11 @@ class RenderSystem virtual ShaderPtr capture(const std::string& name) = 0; /** - * Retrieves an ITextRenderer instance that will rasterize text - * in a certain colours at a certain positions. + * Retrieves an ITextRenderer instance with the given font style and size. + * This renderer will accept IRenderableText instances which define + * the actual text, colour and position. */ - virtual ITextRenderer::Ptr captureTextRenderer() = 0; + virtual ITextRenderer::Ptr captureTextRenderer(IGLFont::Style style, std::size_t size) = 0; /** * \brief diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.cpp b/radiantcore/rendersystem/OpenGLRenderSystem.cpp index b5190e03cb..cdf6f490da 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.cpp +++ b/radiantcore/rendersystem/OpenGLRenderSystem.cpp @@ -44,7 +44,6 @@ OpenGLRenderSystem::OpenGLRenderSystem() : _shaderProgramsAvailable(false), _glProgramFactory(std::make_shared()), _currentShaderProgram(SHADER_PROGRAM_NONE), - _textRenderer(new TextRenderer), _time(0), m_traverseRenderablesMutex(false) { @@ -87,9 +86,20 @@ OpenGLRenderSystem::~OpenGLRenderSystem() _materialDefsUnloaded.disconnect(); } -ITextRenderer::Ptr OpenGLRenderSystem::captureTextRenderer() +ITextRenderer::Ptr OpenGLRenderSystem::captureTextRenderer(IGLFont::Style style, std::size_t size) { - return _textRenderer; + // Try to find an existing text renderer with this combination + auto fontKey = std::make_pair(style, size); + + auto existing = _textRenderers.find(fontKey); + + if (existing == _textRenderers.end()) + { + auto font = GlobalOpenGL().getFont(fontKey.first, fontKey.second); + existing = _textRenderers.emplace(fontKey, std::make_shared(font)).first; + } + + return existing->second; } ShaderPtr OpenGLRenderSystem::capture(const std::string& name) @@ -227,8 +237,11 @@ void OpenGLRenderSystem::render(RenderViewType renderViewType, pair.second->clearRenderables(); } - // Render any text - _textRenderer->render(); + // Render all text + for (const auto& [_, textRenderer] : _textRenderers) + { + textRenderer->render(); + } glPopAttrib(); } @@ -409,13 +422,11 @@ const std::string& OpenGLRenderSystem::getName() const const StringSet& OpenGLRenderSystem::getDependencies() const { - static StringSet _dependencies; - - if (_dependencies.empty()) - { - _dependencies.insert(MODULE_SHADERSYSTEM); - _dependencies.insert(MODULE_SHARED_GL_CONTEXT); - } + static StringSet _dependencies + { + MODULE_SHADERSYSTEM, + MODULE_SHARED_GL_CONTEXT, + }; return _dependencies; } @@ -446,6 +457,8 @@ void OpenGLRenderSystem::initialiseModule(const IApplicationContext& ctx) void OpenGLRenderSystem::shutdownModule() { + _textRenderers.clear(); + _sharedContextCreated.disconnect(); _sharedContextDestroyed.disconnect(); _materialDefsLoaded.disconnect(); diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.h b/radiantcore/rendersystem/OpenGLRenderSystem.h index 10762d000e..9dbc09a953 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.h +++ b/radiantcore/rendersystem/OpenGLRenderSystem.h @@ -41,7 +41,8 @@ class OpenGLRenderSystem // Map of OpenGLState references, with access functions. OpenGLStates _state_sorted; - std::shared_ptr _textRenderer; + using FontKey = std::pair; + std::map> _textRenderers; // Render time std::size_t _time; @@ -64,7 +65,7 @@ class OpenGLRenderSystem /* RenderSystem implementation */ - ITextRenderer::Ptr captureTextRenderer() override; + ITextRenderer::Ptr captureTextRenderer(IGLFont::Style style, std::size_t size) override; ShaderPtr capture(const std::string& name) override; void render(RenderViewType renderViewType, RenderStateFlags globalstate, diff --git a/radiantcore/rendersystem/backend/TextRenderer.h b/radiantcore/rendersystem/backend/TextRenderer.h index 785e8c24ee..28bfbcfb40 100644 --- a/radiantcore/rendersystem/backend/TextRenderer.h +++ b/radiantcore/rendersystem/backend/TextRenderer.h @@ -14,12 +14,15 @@ class TextRenderer final : Slot _freeSlotMappingHint; - IGLFont::Ptr _glFont; + IGLFont::Ptr _font; public: - TextRenderer() : + TextRenderer(const IGLFont::Ptr& font) : + _font(font), _freeSlotMappingHint(0) - {} + { + assert(_font); + } Slot addText(IRenderableText& text) override { @@ -44,12 +47,6 @@ class TextRenderer final : void render() { - if (!_glFont) - { - // TODO: make size and style configurable - _glFont = GlobalOpenGL().getFont(IGLFont::Style::Sans, 14); - } - for (const auto& [_, ref] : _slots) { auto& renderable = ref.get(); @@ -60,7 +57,7 @@ class TextRenderer final : glColor4dv(renderable.getColour()); glRasterPos3dv(renderable.getWorldPosition()); - _glFont->drawString(text); + _font->drawString(text); } } diff --git a/radiantcore/selection/manipulators/RotateManipulator.cpp b/radiantcore/selection/manipulators/RotateManipulator.cpp index 70d3ddfc65..c8c78704e7 100644 --- a/radiantcore/selection/manipulators/RotateManipulator.cpp +++ b/radiantcore/selection/manipulators/RotateManipulator.cpp @@ -108,10 +108,11 @@ void RotateManipulator::onPreRender(const RenderSystemPtr& renderSystem, const V if (!_textRenderer) { - /*auto manipulatorFontStyle = registry::getValue(RKEY_MANIPULATOR_FONTSTYLE) == "Sans" ? + auto fontStyle = registry::getValue(RKEY_MANIPULATOR_FONTSTYLE) == "Sans" ? IGLFont::Style::Sans : IGLFont::Style::Mono; - auto manipulatorFontSize = registry::getValue(RKEY_MANIPULATOR_FONTSIZE);*/ - _textRenderer = renderSystem->captureTextRenderer(); + auto fontSize = registry::getValue(RKEY_MANIPULATOR_FONTSIZE); + + _textRenderer = renderSystem->captureTextRenderer(fontStyle, fontSize); } _pivot2World.update(_pivot.getMatrix4(), volume.GetModelview(), volume.GetProjection(), volume.GetViewport());