// // Created by sebastian on 11.02.26. // #include "TextRenderer.h" #include "../core/Application.h" #include "../core/Window.h" #include "../core/gui/text/Font.h" #include "glm/ext/matrix_clip_space.hpp" void TextRenderer::renderTexts(const std::vector &textsToRender) { shader.start(); shader.loadProjectionMatrix(calculateOrthographicProjectionMatrix()); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (const auto &text : textsToRender) { renderText(*text); } glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); shader.stop(); } void TextRenderer::renderText(const UiText &textToRender) { const Dimensions& d = textToRender.uiPositioner.screenSpace; const Font& font = textToRender.getFont(); const std::string& text = textToRender.getText(); float screenX = d.x * Application::getInstance().getWindow().GetWidth(); float screenY = d.y * Application::getInstance().getWindow().GetHeight(); float x = screenX; float y = screenY; float scale = 1.0f; shader.loadTextColor(textToRender.getColor()); for (char c : text) { const Font::Character& ch = font.getCharacter(c); float xpos = x + static_cast(ch.bearing.x) * scale; float ypos = y - static_cast(ch.size.y - ch.bearing.y) * scale; float w = static_cast(ch.size.x) * scale; float h = static_cast(ch.size.y) * scale; float vertices[6][4] = { { xpos, ypos + h, 0.0f, 0.0f }, { xpos, ypos, 0.0f, 1.0f }, { xpos + w, ypos, 1.0f, 1.0f }, { xpos, ypos + h, 0.0f, 0.0f }, { xpos + w, ypos, 1.0f, 1.0f }, { xpos + w, ypos + h, 1.0f, 0.0f } }; glBindVertexArray(textModel.vaoID); glEnableVertexAttribArray(0); glBindTexture(GL_TEXTURE_2D, ch.textureID); glBindBuffer(GL_ARRAY_BUFFER, textModel.vboID); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glDrawArrays(GL_TRIANGLES, 0, 6); x+= static_cast(ch.advance >> 6) * scale; glBindVertexArray(0); glDisableVertexAttribArray(0); } } glm::mat4 TextRenderer::calculateOrthographicProjectionMatrix() { const auto screenWidth = static_cast(Application::getInstance().getWindow().GetWidth()); const auto screenHeight = static_cast(Application::getInstance().getWindow().GetHeight()); const glm::mat4 projectionMat = glm::ortho(0.f, screenWidth, 0.0f, screenHeight); return projectionMat; }