Skip to content

Commit

Permalink
#5584: Clients can request their text renderers with a certain font s…
Browse files Browse the repository at this point in the history
…tyle and size
  • Loading branch information
codereader committed Jan 23, 2022
1 parent 20a58d3 commit f9ca7d9
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 30 deletions.
7 changes: 4 additions & 3 deletions include/irender.h
Expand Up @@ -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
Expand Down
37 changes: 25 additions & 12 deletions radiantcore/rendersystem/OpenGLRenderSystem.cpp
Expand Up @@ -44,7 +44,6 @@ OpenGLRenderSystem::OpenGLRenderSystem() :
_shaderProgramsAvailable(false),
_glProgramFactory(std::make_shared<GLProgramFactory>()),
_currentShaderProgram(SHADER_PROGRAM_NONE),
_textRenderer(new TextRenderer),
_time(0),
m_traverseRenderablesMutex(false)
{
Expand Down Expand Up @@ -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<TextRenderer>(font)).first;
}

return existing->second;
}

ShaderPtr OpenGLRenderSystem::capture(const std::string& name)
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -446,6 +457,8 @@ void OpenGLRenderSystem::initialiseModule(const IApplicationContext& ctx)

void OpenGLRenderSystem::shutdownModule()
{
_textRenderers.clear();

_sharedContextCreated.disconnect();
_sharedContextDestroyed.disconnect();
_materialDefsLoaded.disconnect();
Expand Down
5 changes: 3 additions & 2 deletions radiantcore/rendersystem/OpenGLRenderSystem.h
Expand Up @@ -41,7 +41,8 @@ class OpenGLRenderSystem
// Map of OpenGLState references, with access functions.
OpenGLStates _state_sorted;

std::shared_ptr<TextRenderer> _textRenderer;
using FontKey = std::pair<IGLFont::Style, std::size_t>;
std::map<FontKey, std::shared_ptr<TextRenderer>> _textRenderers;

// Render time
std::size_t _time;
Expand All @@ -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,
Expand Down
17 changes: 7 additions & 10 deletions radiantcore/rendersystem/backend/TextRenderer.h
Expand Up @@ -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
{
Expand All @@ -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();
Expand All @@ -60,7 +57,7 @@ class TextRenderer final :
glColor4dv(renderable.getColour());
glRasterPos3dv(renderable.getWorldPosition());

_glFont->drawString(text);
_font->drawString(text);
}
}

Expand Down
7 changes: 4 additions & 3 deletions radiantcore/selection/manipulators/RotateManipulator.cpp
Expand Up @@ -108,10 +108,11 @@ void RotateManipulator::onPreRender(const RenderSystemPtr& renderSystem, const V

if (!_textRenderer)
{
/*auto manipulatorFontStyle = registry::getValue<std::string>(RKEY_MANIPULATOR_FONTSTYLE) == "Sans" ?
auto fontStyle = registry::getValue<std::string>(RKEY_MANIPULATOR_FONTSTYLE) == "Sans" ?
IGLFont::Style::Sans : IGLFont::Style::Mono;
auto manipulatorFontSize = registry::getValue<int>(RKEY_MANIPULATOR_FONTSIZE);*/
_textRenderer = renderSystem->captureTextRenderer();
auto fontSize = registry::getValue<int>(RKEY_MANIPULATOR_FONTSIZE);

_textRenderer = renderSystem->captureTextRenderer(fontStyle, fontSize);
}

_pivot2World.update(_pivot.getMatrix4(), volume.GetModelview(), volume.GetProjection(), volume.GetViewport());
Expand Down

0 comments on commit f9ca7d9

Please sign in to comment.