From dbe56280a66e5adb3cca9974e150185f7a36f208 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 19 Jan 2016 11:45:34 +0100 Subject: [PATCH] Resolution fixed and Centered text --- include/Engine/Rendering/Font.h | 1 + include/Engine/Rendering/TextRenderer.h | 2 +- resources/Schema/Components/Text.xml | 2 +- resources/Schema/Entities/RenderingWorld.xml | 52 ++++++++++++++++---- src/Engine/Rendering/Font.cpp | 10 ++-- src/Engine/Rendering/PickingPass.cpp | 4 +- src/Engine/Rendering/PickingPassState.cpp | 1 + src/Engine/Rendering/Renderer.cpp | 1 + src/Engine/Rendering/TextRenderer.cpp | 37 ++++++++++---- 9 files changed, 80 insertions(+), 30 deletions(-) diff --git a/include/Engine/Rendering/Font.h b/include/Engine/Rendering/Font.h index 08341c1e..5a1a6bdd 100644 --- a/include/Engine/Rendering/Font.h +++ b/include/Engine/Rendering/Font.h @@ -27,6 +27,7 @@ public: FT_Face Face; + int FontSize = 16; ~Font(); diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index a755fd30..e7323deb 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -25,7 +25,7 @@ private: GLuint VAO, VBO; - void RenderText(std::string text, Font* font, GLfloat scale, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); + void RenderText(std::string text, Font* font, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); ShaderProgram* m_TextProgram; diff --git a/resources/Schema/Components/Text.xml b/resources/Schema/Components/Text.xml index 45bed531..ecf9bac8 100644 --- a/resources/Schema/Components/Text.xml +++ b/resources/Schema/Components/Text.xml @@ -1,7 +1,7 @@ Text - Fonts/DroidSans.ttf + true \ No newline at end of file diff --git a/resources/Schema/Entities/RenderingWorld.xml b/resources/Schema/Entities/RenderingWorld.xml index 73c0e474..f35747c4 100644 --- a/resources/Schema/Entities/RenderingWorld.xml +++ b/resources/Schema/Entities/RenderingWorld.xml @@ -13,28 +13,58 @@ Models/Camera.obj - false - - + + - + + + + + Camera 1 + Fonts/DroidSans.ttf,24 + + + + + + + + + ActionCamera + Models/Camera.obj + false - + + - + + + + + Camera 2 + Fonts/DroidSans.ttf,24 + + + + + + + + + @@ -42,7 +72,7 @@ Models/Core/UnitPlane.obj - + @@ -60,10 +90,12 @@ - asdasdasdasdasd - Fonts/DroidSans.ttf + Welcome! + Fonts/DroidSans.ttf,64 - + + + diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp index 5f4984a7..ba99ee31 100644 --- a/src/Engine/Rendering/Font.cpp +++ b/src/Engine/Rendering/Font.cpp @@ -7,7 +7,6 @@ Font::Font(std::string path) boost::char_separator sep(","); tokenizer tok(path, sep); - int fontSize = 16; tokenizer::iterator it = tok.begin(); std::string filePath = ""; @@ -17,7 +16,7 @@ Font::Font(std::string path) it++; if (it != tok.end()) { try { - fontSize = boost::lexical_cast((*it).c_str()); + FontSize = boost::lexical_cast((*it).c_str()); } catch (boost::bad_lexical_cast const&) { LOG_ERROR("input string did not have a valid font resolution"); } @@ -39,8 +38,8 @@ Font::Font(std::string path) return; } - FT_Set_Char_Size(Face, 0, fontSize*64, 300, 300); // temp - FT_Set_Pixel_Sizes(Face, 0, fontSize); // + FT_Set_Char_Size(Face, 0, FontSize*64, 300, 300); // temp + FT_Set_Pixel_Sizes(Face, 0, FontSize); // if (FT_Load_Char(Face, 'X', FT_LOAD_RENDER)) { LOG_ERROR("FreeType error: loading char"); @@ -88,14 +87,13 @@ Font::Font(std::string path) m_Characters.insert(std::pair(c, character)); } - - FT_Done_Face(Face); FT_Done_FreeType(library); GLERROR("Font Load"); } Font::~Font() { + FT_Done_Face(Face); for (auto c : m_Characters) { glDeleteTextures(1, &c.second.TextureID); } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 7470f029..f925d248 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -74,9 +74,9 @@ void PickingPass::Draw(RenderScene& scene) m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]); if (m_ColorCounter[0] > 255) { m_ColorCounter[0] = 0; - m_ColorCounter[1]++;; + m_ColorCounter[1]++; } else { - m_ColorCounter[0]++;; + m_ColorCounter[0]++; } } diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index 2b4f30c4..0c4f4aca 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -8,6 +8,7 @@ PickingPassState::PickingPassState(GLuint frameBuffer) GLERROR("---3"); Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); + Disable(GL_BLEND); glm::vec4 clearColor = glm::vec4(0.f); //ClearColor(clearColor); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 754baf55..b168a8a3 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -117,6 +117,7 @@ void Renderer::Draw(RenderFrame& frame) m_TextRenderer->Draw(*scene); } + m_ImGuiRenderPass->Draw(); glfwSwapBuffers(m_Window); diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index 6f34de5b..5b51c063 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -34,21 +34,39 @@ void TextRenderer::Draw(RenderScene& scene) for (auto &job : scene.TextJobs) { auto textJob = std::dynamic_pointer_cast(job); if (textJob) { - RenderText(textJob->Content, textJob->Resource, 0.01f, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); + RenderText(textJob->Content, textJob->Resource, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); } } } -void TextRenderer::RenderText(std::string text, Font* font, GLfloat scale, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) +void TextRenderer::RenderText(std::string text, Font* font, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { - GLfloat x = 0; - GLfloat y = 0; + GLfloat penX = 0; + GLfloat penY = 0; + float scale = 1.0/font->FontSize; + FT_Bool use_kerning = FT_HAS_KERNING(font->Face); + FT_UInt previous = 0; + FT_UInt num_glyphs = 0; + FT_UInt glyph_index; + + FT_Vector pos[128]; + + GLfloat stringWidth = 0.f; + + for (std::string::const_iterator c = text.begin(); c != text.end(); c++) { + Font::Character ch = font->m_Characters[*c]; + stringWidth += (ch.Advance >> 6) * scale; + } + + penX = -stringWidth/2.f; + // Activate corresponding render state glEnable(GL_BLEND); glDisable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); m_TextProgram->Bind(); @@ -59,13 +77,12 @@ void TextRenderer::RenderText(std::string text, Font* font, GLfloat scale, glm:: glActiveTexture(GL_TEXTURE0); glBindVertexArray(VAO); - // Iterate through all characters - std::string::const_iterator c; - for (c = text.begin(); c != text.end(); c++) { + + for (std::string::const_iterator c = text.begin(); c != text.end(); c++) { Font::Character ch = font->m_Characters[*c]; - GLfloat xpos = x + ch.Bearing.x * scale; - GLfloat ypos = y - (ch.Size.y - ch.Bearing.y) * scale; + GLfloat xpos = penX + ch.Bearing.x * scale; + GLfloat ypos = penY - (ch.Size.y - ch.Bearing.y) * scale; GLfloat w = ch.Size.x * scale; GLfloat h = ch.Size.y * scale; @@ -89,7 +106,7 @@ void TextRenderer::RenderText(std::string text, Font* font, GLfloat scale, glm:: // Render quad glDrawArrays(GL_TRIANGLES, 0, 6); // Now advance cursors for next glyph (note that advance is number of 1/64 pixels) - x += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) + penX += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) } glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0);