Skip to main content

OpenGLDevice Class

OpenGL implementation of `RenderingDevice`. More...

Declaration

class helios::ext::opengl::rendering::OpenGLDevice { ... }

Base class

classRenderingDevice

Abstract interface for a low-level rendering device. More...

Public Constructors Index

OpenGLDevice (std::unique_ptr< helios::ext::opengl::rendering::OpenGLMeshRenderer > meshRenderer, std::unique_ptr< helios::ext::opengl::rendering::OpenGLGlyphTextRenderer > textRenderer, std::unique_ptr< helios::rendering::text::FontResourceProvider > fontResourceProvider)

Constructs an OpenGLDevice with the given renderers and font provider. More...

Public Destructor Index

~OpenGLDevice () override=default

Public Member Functions Index

voidinit () override

Initializes the OpenGL device to access modern OpenGL. More...

voidbeginRenderPass (helios::rendering::RenderPass &renderPass) const noexcept override

Begins a new render pass. More...

voiddoRender (helios::rendering::RenderPass &renderPass) const noexcept override

Processes render commands and draws geometry and text. More...

voidrenderMeshCommands (const helios::rendering::RenderPass &renderPass) const noexcept

Renders all mesh commands in the render pass. More...

voidrenderTextCommands (const helios::rendering::RenderPass &renderPass) const noexcept

Renders all text commands in the render pass. More...

voidendRenderPass (helios::rendering::RenderPass &renderPass) const noexcept override

Ends the specified render pass. More...

helios::rendering::text::TextRenderer &textRenderer () const noexcept

Returns a reference to the text renderer. More...

helios::rendering::text::FontResourceProvider &fontResourceProvider () const noexcept override

Returns a reference to the font resource provider. More...

Private Member Attributes Index

std::unique_ptr< helios::ext::opengl::rendering::OpenGLGlyphTextRenderer >textRenderer_

Text renderer for FreeType-based glyph rendering. More...

std::unique_ptr< helios::ext::opengl::rendering::OpenGLMeshRenderer >meshRenderer_

Mesh renderer for geometry rendering. More...

std::unique_ptr< helios::rendering::text::FontResourceProvider >fontResourceProvider_

Font resource provider for loading fonts and retrieving glyph data. More...

Description

OpenGL implementation of `RenderingDevice`.

`OpenGLDevice` is the concrete OpenGL backend for the helios rendering system. It handles all OpenGL-specific operations including mesh rendering, shader management, and text rendering via `OpenGLGlyphTextRenderer`.

## Responsibilities

  • **Initialization:** Load OpenGL function pointers via GLAD.
  • **Render Pass Execution:** Configure viewport, clear buffers, and process render commands.
  • **Mesh Rendering:** Bind VAOs and issue draw calls for geometry.
  • **Text Rendering:** Delegate text commands to `OpenGLGlyphTextRenderer`.

## Usage

```cpp auto textRenderer = std::make_unique<OpenGLGlyphTextRenderer>(); auto device = std::make_unique<OpenGLDevice>(std::move(textRenderer));

// After creating OpenGL context device->init();

// Load fonts via the text renderer device->textRenderer().addFontFamily(FontId{1}, "fonts/arial.ttf"); ```

See Also

RenderingDevice

See Also

OpenGLGlyphTextRenderer

Definition at line 66 of file OpenGLDevice.ixx.

Public Constructors

OpenGLDevice()

helios::ext::opengl::rendering::OpenGLDevice::OpenGLDevice (std::unique_ptr< helios::ext::opengl::rendering::OpenGLMeshRenderer > meshRenderer, std::unique_ptr< helios::ext::opengl::rendering::OpenGLGlyphTextRenderer > textRenderer, std::unique_ptr< helios::rendering::text::FontResourceProvider > fontResourceProvider)
inline explicit

Constructs an OpenGLDevice with the given renderers and font provider.

Parameters
meshRenderer

The mesh renderer for geometry rendering.

textRenderer

The text renderer for glyph-based text rendering.

fontResourceProvider

The font resource provider for loading fonts.

Definition at line 95 of file OpenGLDevice.ixx.

95 explicit OpenGLDevice(
96 std::unique_ptr<helios::ext::opengl::rendering::OpenGLMeshRenderer> meshRenderer,
97 std::unique_ptr<helios::ext::opengl::rendering::OpenGLGlyphTextRenderer> textRenderer,
98 std::unique_ptr<helios::rendering::text::FontResourceProvider> fontResourceProvider
99 ) :
100 meshRenderer_(std::move(meshRenderer)),
101 textRenderer_(std::move(textRenderer)),
102 fontResourceProvider_(std::move(fontResourceProvider)){}

References fontResourceProvider and textRenderer.

Public Destructor

~OpenGLDevice()

helios::ext::opengl::rendering::OpenGLDevice::~OpenGLDevice ()
default

Definition at line 86 of file OpenGLDevice.ixx.

Public Member Functions

beginRenderPass()

void helios::ext::opengl::rendering::OpenGLDevice::beginRenderPass (helios::rendering::RenderPass & renderPass)
inline noexcept virtual

Begins a new render pass.

This implementation makes sure that the rendering surface is cleared with the current clear color, which can be configured via `clearColor()`.

Parameters
renderPass

The render pass to begin.

See Also

clear()

See Also

clearColor()

Definition at line 147 of file OpenGLDevice.ixx.

147 void beginRenderPass(helios::rendering::RenderPass& renderPass) const noexcept override {
148 meshRenderer_->beginRenderPass(renderPass);
149 textRenderer_->beginRenderPass(renderPass);
150
151 const auto& viewport = renderPass.viewport();
152
153 assert(viewport.renderTarget() && "Unexpected missing render target for viewport");
154
155 const helios::rendering::RenderTarget& renderTarget = *(viewport.renderTarget());
156 const auto viewportBounds = viewport.bounds();
157 const auto col = viewport.clearColor();
158 glViewport(static_cast<int>(renderTarget.width() * viewportBounds[0]),
159 static_cast<int>(renderTarget.height() * viewportBounds[1]),
160 static_cast<int>(renderTarget.width() * viewportBounds[2]),
161 static_cast<int>(renderTarget.height() * viewportBounds[3]));
162
163
164 // this is equally important for the GlpyhTextRenderer
165 // enable blending since the font's fragment shader uses the alpha channel
166 glEnable(GL_BLEND);
167 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
168
169
170 glClearColor(col[0], col[1], col[2], col[3]);
171
172 const int clearFlags = viewport.clearFlags();
173 glClear(((clearFlags & std::to_underlying(helios::rendering::ClearFlags::Color)) ? GL_COLOR_BUFFER_BIT : 0) |
174 ((clearFlags & std::to_underlying(helios::rendering::ClearFlags::Depth)) ? GL_DEPTH_BUFFER_BIT : 0) |
175 ((clearFlags & std::to_underlying(helios::rendering::ClearFlags::Stencil)) ? GL_STENCIL_BUFFER_BIT
176 : 0));
177 }

References helios::rendering::Color, helios::rendering::Depth, helios::rendering::RenderTarget::height, helios::rendering::Stencil and helios::rendering::RenderTarget::width.

doRender()

void helios::ext::opengl::rendering::OpenGLDevice::doRender (helios::rendering::RenderPass & renderPass)
inline noexcept virtual

Processes render commands and draws geometry and text.

Iterates through all render commands in the render queue, binds the appropriate shaders and VAOs, applies uniform values, and issues draw calls. After processing geometry, delegates any text render commands to `renderTextCommands()`.

Parameters
renderPass

The render pass containing the render queue to be processed.

See Also

renderTextCommands()

Definition at line 190 of file OpenGLDevice.ixx.

190 void doRender(helios::rendering::RenderPass& renderPass) const noexcept override {
191 const auto& renderQueue = renderPass.renderQueue();
192
193 if (renderQueue.meshRenderCommandsSize() > 0) {
194 renderMeshCommands(renderPass);
195 }
196
197 if (renderQueue.textRenderCommandsSize() > 0) {
198 renderTextCommands(renderPass);
199 }
200 }

References renderMeshCommands and renderTextCommands.

endRenderPass()

void helios::ext::opengl::rendering::OpenGLDevice::endRenderPass (helios::rendering::RenderPass & renderPass)
inline noexcept virtual

Ends the specified render pass.

The current implementation does nothing.

Parameters
renderPass

The render pass to end.

Definition at line 243 of file OpenGLDevice.ixx.

243 void endRenderPass(helios::rendering::RenderPass& renderPass) const noexcept override {
244 glBindVertexArray(0);
245 }

fontResourceProvider()

helios::rendering::text::FontResourceProvider & helios::ext::opengl::rendering::OpenGLDevice::fontResourceProvider ()
inline nodiscard noexcept virtual

Returns a reference to the font resource provider.

Use this to load fonts before creating `TextRenderPrototype` instances.

Returns

Reference to the `FontResourceProvider` implementation.

Definition at line 267 of file OpenGLDevice.ixx.

268 return *fontResourceProvider_;
269 }

Referenced by OpenGLDevice.

init()

void helios::ext::opengl::rendering::OpenGLDevice::init ()
inline virtual

Initializes the OpenGL device to access modern OpenGL.

This method must be called **after** the helios application's `setCurrent()` was called for creating a current context. This OpenGL device will then load from this context.

This method uses the `gladLoadGL` method in conjunction with `glfwGetProcAddress`, which returns the address of the specific OpenGL core.

See Also

https://www.glfw.org/docs/latest/group__context.html#ga35f1837e6f666781842483937612f163

Todo

Provide abstraction for glfwGetProcAddress.

Definition at line 117 of file OpenGLDevice.ixx.

117 void init() override {
118 if (initialized_) {
119 return;
120 }
121 const GLADloadfunc procAddressLoader = glfwGetProcAddress;
122 const int gl_ver = gladLoadGL(procAddressLoader);
123
124 if (gl_ver == 0) {
125 logger_.error("Failed to load OpenGL");
126 throw std::runtime_error("Failed to load OpenGL");
127 }
128
129 textRenderer_->init();
130
131 logger_.info(std::format("OpenGL {0}.{1} loaded", GLAD_VERSION_MAJOR(gl_ver), GLAD_VERSION_MINOR(gl_ver)));
132
133 initialized_ = true;
134 }

References helios::rendering::RenderingDevice::initialized_ and helios::rendering::RenderingDevice::logger_.

renderMeshCommands()

void helios::ext::opengl::rendering::OpenGLDevice::renderMeshCommands (const helios::rendering::RenderPass & renderPass)
inline noexcept

Renders all mesh commands in the render pass.

Iterates through the mesh render commands in the render queue and delegates each command to the `OpenGLMeshRenderer` for rendering.

Parameters
renderPass

The render pass containing mesh render commands.

Definition at line 210 of file OpenGLDevice.ixx.

210 void renderMeshCommands(const helios::rendering::RenderPass& renderPass) const noexcept {
211
212 const auto& renderQueue = renderPass.renderQueue();
213
214 for (auto& rc: renderQueue.meshRenderCommands()) {
215 meshRenderer_->render(rc, renderPass.frameUniformValues());
216 }
217
218 }

Referenced by doRender.

renderTextCommands()

void helios::ext::opengl::rendering::OpenGLDevice::renderTextCommands (const helios::rendering::RenderPass & renderPass)
inline noexcept

Renders all text commands in the render pass.

Iterates through the text render commands in the render queue and delegates each command to the `OpenGLGlyphTextRenderer` for rendering.

Parameters
renderPass

The render pass containing text render commands.

Definition at line 228 of file OpenGLDevice.ixx.

228 void renderTextCommands(const helios::rendering::RenderPass& renderPass) const noexcept {
229 const auto& renderQueue = renderPass.renderQueue();
230
231 for (auto& rc: renderQueue.textRenderCommands()) {
232 textRenderer_->render(rc, renderPass.frameUniformValues());
233 }
234 }

Referenced by doRender.

textRenderer()

helios::rendering::text::TextRenderer & helios::ext::opengl::rendering::OpenGLDevice::textRenderer ()
inline nodiscard noexcept virtual

Returns a reference to the text renderer.

Use this to register font families before rendering text.

Returns

Reference to the `TextRenderer` interface.

See Also

OpenGLGlyphTextRenderer::addFontFamily()

Definition at line 256 of file OpenGLDevice.ixx.

256 [[nodiscard]] helios::rendering::text::TextRenderer& textRenderer() const noexcept {
257 return *textRenderer_;
258 }

Referenced by OpenGLDevice.

Private Member Attributes

fontResourceProvider_

std::unique_ptr<helios::rendering::text::FontResourceProvider> helios::ext::opengl::rendering::OpenGLDevice::fontResourceProvider_

Font resource provider for loading fonts and retrieving glyph data.

Definition at line 82 of file OpenGLDevice.ixx.

82 std::unique_ptr<helios::rendering::text::FontResourceProvider> fontResourceProvider_;

meshRenderer_

std::unique_ptr<helios::ext::opengl::rendering::OpenGLMeshRenderer> helios::ext::opengl::rendering::OpenGLDevice::meshRenderer_

Mesh renderer for geometry rendering.

Definition at line 77 of file OpenGLDevice.ixx.

77 std::unique_ptr<helios::ext::opengl::rendering::OpenGLMeshRenderer> meshRenderer_;

textRenderer_

std::unique_ptr<helios::ext::opengl::rendering::OpenGLGlyphTextRenderer> helios::ext::opengl::rendering::OpenGLDevice::textRenderer_

Text renderer for FreeType-based glyph rendering.

Definition at line 72 of file OpenGLDevice.ixx.

72 std::unique_ptr<helios::ext::opengl::rendering::OpenGLGlyphTextRenderer> textRenderer_;

The documentation for this class was generated from the following file:


Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.15.0.