From dc66891d60fda1e257e9b6ef3329f0ce51c1004f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 10 Dec 2015 11:22:56 +0100 Subject: [PATCH 01/12] Added Freetype 2.62 --- deps | 2 +- src/Engine/CMakeLists.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/deps b/deps index 1b478d31..dd54b115 160000 --- a/deps +++ b/deps @@ -1 +1 @@ -Subproject commit 1b478d3159f12273059a684ee8e187f4a25c89f0 +Subproject commit dd54b115127d9de536ec22c23e9ba51eaae7daf4 diff --git a/src/Engine/CMakeLists.txt b/src/Engine/CMakeLists.txt index de24b9cf..181f179b 100644 --- a/src/Engine/CMakeLists.txt +++ b/src/Engine/CMakeLists.txt @@ -8,6 +8,7 @@ find_package(assimp REQUIRED) find_package(ZLIB REQUIRED) find_package(PNG REQUIRED) find_package(Xerces REQUIRED) +find_package(Freetype REQUIRED) # Because FindOpenAL is retarded #set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "${CMAKE_SOURCE_DIR}/deps/include/AL") #find_package(OpenAL REQUIRED) @@ -25,6 +26,7 @@ include_directories( ${assimp_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS} ${Xerces_INCLUDE_DIRS} + ${FREETYPE_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIR} ${X11_INCLUDE_DIRS} ) @@ -88,6 +90,7 @@ set(LIBRARIES ${assimp_LIBRARIES} ${PNG_LIBRARIES} ${Xerces_LIBRARIES} + ${FREETYPE_LIBRARIES} ${OPENAL_LIBRARY} ${X11_LIBRARIES} ) From 46854a63dd9c29a6490923ac9524e342db9923d2 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Dec 2015 10:54:52 +0100 Subject: [PATCH 02/12] Text rendering includes --- include/Engine/Rendering/TextRenderer.h | 16 ++++++++++++++++ src/Engine/Rendering/TextRenderer.cpp | 0 2 files changed, 16 insertions(+) create mode 100644 include/Engine/Rendering/TextRenderer.h create mode 100644 src/Engine/Rendering/TextRenderer.cpp diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h new file mode 100644 index 00000000..5250d066 --- /dev/null +++ b/include/Engine/Rendering/TextRenderer.h @@ -0,0 +1,16 @@ +#ifndef TextRenderer_h__ +#define TextRenderer_h__ + +#include +#include FT_FREETYPE_H + +class TextRenderer +{ +public: + +private: + +}; + + +#endif \ No newline at end of file diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp new file mode 100644 index 00000000..e69de29b From 4c2ce3882e98cef66fcc0ed5fa815f29f8dde3b4 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Dec 2015 11:07:22 +0100 Subject: [PATCH 03/12] Added fonts folder and font --- assets | 2 +- tools/deploy.bat | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets b/assets index b3746822..1434cdcb 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit b37468222e45ec0b2116f1543c578cb9784d43f2 +Subproject commit 1434cdcb2139e2158d5b50b986bc48569b1ec5b8 diff --git a/tools/deploy.bat b/tools/deploy.bat index 5ef074ef..9f70f34d 100755 --- a/tools/deploy.bat +++ b/tools/deploy.bat @@ -11,6 +11,8 @@ RMDIR "%DeployLocation%\Textures" MKLINK "%DeployLocation%\Textures\" "assets\Textures\" /J RMDIR "%DeployLocation%\Audio" MKLINK "%DeployLocation%\Audio\" "assets\Audio\" /J +RMDIR "%DeployLocation%\Fonts" +MKLINK "%DeployLocation%\Fonts\" "assets\Fonts\" /J ECHO Deploying resources to %DeployLocation% :: Schemas From 8f007f6daf7a40d9809e86c40a8c01557c2137fe Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Dec 2015 11:26:41 +0100 Subject: [PATCH 04/12] Added Freetype 2.62 config and option files --- deps | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps b/deps index dd54b115..75149166 160000 --- a/deps +++ b/deps @@ -1 +1 @@ -Subproject commit dd54b115127d9de536ec22c23e9ba51eaae7daf4 +Subproject commit 75149166e1898e3d42ccaa578598e5fef5beac19 From a8a38716bd5ccbcd86f794be26741aece9f16996 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Dec 2015 16:12:29 +0100 Subject: [PATCH 05/12] Text renderer up and working, needs more work to be compatible with the ResourceManager and the Entity Component system --- assets | 2 +- include/Engine/Rendering/Renderer.h | 3 + include/Engine/Rendering/ShaderProgram.h | 5 + include/Engine/Rendering/TextRenderer.h | 28 ++++ resources/Shaders/Text.frag.glsl | 12 ++ resources/Shaders/Text.vert.glsl | 13 ++ src/Engine/Rendering/Renderer.cpp | 7 +- src/Engine/Rendering/TextRenderer.cpp | 171 +++++++++++++++++++++++ 8 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 resources/Shaders/Text.frag.glsl create mode 100644 resources/Shaders/Text.vert.glsl diff --git a/assets b/assets index 1434cdcb..fa95bf43 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 1434cdcb2139e2158d5b50b986bc48569b1ec5b8 +Subproject commit fa95bf4383e558a5cb86e35e9d20362e5cb2dcb6 diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 76de0818..7f692a3c 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -14,6 +14,8 @@ #include "../Core/EventBroker.h" #include "EPicking.h" +#include "TextRenderer.h" + class Renderer : public IRenderer { public: @@ -28,6 +30,7 @@ public: private: //----------------------Variables----------------------// EventBroker* m_EventBroker; + TextRenderer* m_TextRenderer; Texture* m_ErrorTexture; Texture* m_WhiteTexture; diff --git a/include/Engine/Rendering/ShaderProgram.h b/include/Engine/Rendering/ShaderProgram.h index 1b87650e..6fb17b61 100644 --- a/include/Engine/Rendering/ShaderProgram.h +++ b/include/Engine/Rendering/ShaderProgram.h @@ -1,4 +1,7 @@ +#ifndef ShaderProgram_h__ +#define ShaderProgram_h__ + #include "../Common.h" #include "../OpenGL.h" #include @@ -79,3 +82,5 @@ private: GLuint m_ShaderProgramHandle; std::vector> m_Shaders; }; + +#endif diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index 5250d066..99852b4b 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -4,12 +4,40 @@ #include #include FT_FREETYPE_H +#include "OpenGL.h" +#include "GLM.h" +#include "ShaderProgram.h" + class TextRenderer { public: + TextRenderer(); + void Initialize(); + void Update(); + void Draw(glm::mat4 projection, glm::mat4 view); private: + + struct Character { + GLuint TextureID; // ID handle of the glyph texture + glm::ivec2 Size; // Size of glyph + glm::ivec2 Bearing; // Offset from baseline to left/top of glyph + GLuint Advance; // Offset to advance to next glyph + }; + + std::map Characters; + + + GLuint VAO, VBO; + + void RenderText(std::string text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, glm::mat4 projection, glm::mat4 view); + + ShaderProgram m_TextProgram; + + std::string text = ""; + + int counter = 0; }; diff --git a/resources/Shaders/Text.frag.glsl b/resources/Shaders/Text.frag.glsl new file mode 100644 index 00000000..2726b5d1 --- /dev/null +++ b/resources/Shaders/Text.frag.glsl @@ -0,0 +1,12 @@ +#version 430 +in vec2 TexCoords; +out vec4 color; + +uniform sampler2D text; +uniform vec3 textColor; + +void main() +{ + vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); + color = vec4(textColor, 1.0) * sampled; +} \ No newline at end of file diff --git a/resources/Shaders/Text.vert.glsl b/resources/Shaders/Text.vert.glsl new file mode 100644 index 00000000..43c86795 --- /dev/null +++ b/resources/Shaders/Text.vert.glsl @@ -0,0 +1,13 @@ +#version 430 +layout (location = 0) in vec4 vertex; // +out vec2 TexCoords; + +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; + +void main() +{ + gl_Position = P * V * M * vec4(vertex.xy, 0.0, 1.0); + TexCoords = vertex.zw; +} \ No newline at end of file diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 6f4235d2..3ee559c5 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -15,6 +15,9 @@ void Renderer::Initialize() InitializeTextures(); InitializeFrameBuffers(); + m_TextRenderer = new TextRenderer(); + m_TextRenderer->Initialize(); + m_ScreenQuad = ResourceManager::Load("Models/Core/ScreenQuad.obj"); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); @@ -142,6 +145,7 @@ void Renderer::Update(double dt) { m_EventBroker->Process(); InputUpdate(dt); + m_TextRenderer->Update(); } @@ -149,9 +153,10 @@ void Renderer::Draw(RenderQueueCollection& rq) { //TODO: Renderer: Kanske borde vara längst upp i update. PickingPass(rq); - DrawScreenQuad(m_PickingTexture); + // DrawScreenQuad(m_PickingTexture); DrawScene(rq); + m_TextRenderer->Draw(m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); glfwSwapBuffers(m_Window); } diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index e69de29b..0fd46f32 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -0,0 +1,171 @@ +#include "Rendering/TextRenderer.h" + +TextRenderer::TextRenderer() +{ + +} + +void TextRenderer::Initialize() +{ + FT_Library library; + FT_Face face; + + if (FT_Init_FreeType(&library)) { + LOG_ERROR("FreeType error: init failed"); + } + + if (FT_New_Face(library, "fonts/arial.ttf", 0, &face)) { + LOG_ERROR("FreeType error: loading font"); + } + + FT_Set_Pixel_Sizes(face, 0, 48); + + if (FT_Load_Char(face, 'X', FT_LOAD_RENDER)) { + LOG_ERROR("FreeType error: loading char"); + } + + + + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + for (GLubyte c = 0; c < 128; c++) { + //Load character glyph + if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { + continue; + } + printf("Char: %c\n", c); + //Generate texture + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RED, + face->glyph->bitmap.width, + face->glyph->bitmap.rows, + 0, + GL_RED, + GL_UNSIGNED_BYTE, + face->glyph->bitmap.buffer + ); + // Set texture options + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // Now store character for later use + Character character = { + texture, + glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), + glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), + face->glyph->advance.x + }; + Characters.insert(std::pair(c, character)); + } + + FT_Done_Face(face); + FT_Done_FreeType(library); + + + + + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 6 * 4, NULL, GL_DYNAMIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + + + m_TextProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); + m_TextProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); + m_TextProgram.Compile(); + m_TextProgram.Link(); +} + +void TextRenderer::Update() +{ + +} + +void TextRenderer::Draw(glm::mat4 projection, glm::mat4 view) +{ + if(counter > 2) { + if (text == "") { + text = text + "~wub "; + } else if (text == "~wub ") { + text = text + "wub "; + } else if (text == "~wub wub ") { + text = ""; + } + counter = 0; + } else { + counter++; + } + + RenderText(text, 0.f, 0.f, 1.0f, glm::vec3(1.f, 1.f, 1.f), projection, view); +} + +void TextRenderer::RenderText(std::string text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, glm::mat4 projection, glm::mat4 view) +{ + + glm::mat4 modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.5f, 0.3f, 0.f)) * glm::toMat4(glm::quat()) * glm::scale(glm::vec3(0.01f)); + + // Activate corresponding render state + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + m_TextProgram.Bind(); + glUniform3f(glGetUniformLocation(m_TextProgram.GetHandle(), "textColor"), color.x, color.y, color.z); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(view)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projection)); + glActiveTexture(GL_TEXTURE0); + glBindVertexArray(VAO); + + // Iterate through all characters + std::string::const_iterator c; + for (c = text.begin(); c != text.end(); c++) { + Character ch = Characters[*c]; + + GLfloat xpos = x + ch.Bearing.x * scale; + GLfloat ypos = y - (ch.Size.y - ch.Bearing.y) * scale; + + GLfloat w = ch.Size.x * scale; + GLfloat h = ch.Size.y * scale; + // Update VBO for each character + GLfloat vertices[6][4] = { + { xpos, ypos + h, 0.0, 0.0 }, + { xpos, ypos, 0.0, 1.0 }, + { xpos + w, ypos, 1.0, 1.0 }, + + { xpos, ypos + h, 0.0, 0.0 }, + { xpos + w, ypos, 1.0, 1.0 }, + { xpos + w, ypos + h, 1.0, 0.0 } + }; + + // Render glyph texture over quad + glBindTexture(GL_TEXTURE_2D, ch.TextureID); + // Update content of VBO memory + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); + glBindBuffer(GL_ARRAY_BUFFER, 0); + // 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) + } + glBindVertexArray(0); + glBindTexture(GL_TEXTURE_2D, 0); + + GLERROR("Text rendering Error"); +} + From 9bd3da409deae4aeaa380ef39765185fff64495d Mon Sep 17 00:00:00 2001 From: viktorljung Date: Fri, 11 Dec 2015 16:53:51 +0100 Subject: [PATCH 06/12] Added Font to ResourceManager --- include/Engine/Rendering/Font.h | 28 ++++++++++ include/Engine/Rendering/TextRenderer.h | 18 ++---- include/Engine/Rendering/Texture.h | 1 + include/Game/Game.h | 1 + src/Engine/Rendering/Font.cpp | 73 +++++++++++++++++++++++++ src/Engine/Rendering/TextRenderer.cpp | 67 ++--------------------- src/Game/Game.cpp | 1 + 7 files changed, 113 insertions(+), 76 deletions(-) create mode 100644 include/Engine/Rendering/Font.h create mode 100644 src/Engine/Rendering/Font.cpp diff --git a/include/Engine/Rendering/Font.h b/include/Engine/Rendering/Font.h new file mode 100644 index 00000000..03f15a49 --- /dev/null +++ b/include/Engine/Rendering/Font.h @@ -0,0 +1,28 @@ +#ifndef Font_h__ +#define Font_h__ + +#include +#include FT_FREETYPE_H + +#include "../OpenGL.h" +#include "../GLM.h" +#include "../Core/ResourceManager.h" + +class Font : public Resource +{ + friend class ResourceManager; +private: + Font(std::string path); + +public: + struct Character { + GLuint TextureID; // ID handle of the glyph texture + glm::ivec2 Size; // Size of glyph + glm::ivec2 Bearing; // Offset from baseline to left/top of glyph + GLuint Advance; // Offset to advance to next glyph + }; + ~Font(); + + std::map m_Characters; +}; +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index 99852b4b..41298843 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -4,9 +4,11 @@ #include #include FT_FREETYPE_H -#include "OpenGL.h" -#include "GLM.h" +#include "../OpenGL.h" +#include "../GLM.h" #include "ShaderProgram.h" +#include "Font.h" +#include "../Core/ResourceManager.h" class TextRenderer { @@ -17,17 +19,7 @@ public: void Draw(glm::mat4 projection, glm::mat4 view); private: - - - struct Character { - GLuint TextureID; // ID handle of the glyph texture - glm::ivec2 Size; // Size of glyph - glm::ivec2 Bearing; // Offset from baseline to left/top of glyph - GLuint Advance; // Offset to advance to next glyph - }; - - std::map Characters; - + Font* font; GLuint VAO, VBO; diff --git a/include/Engine/Rendering/Texture.h b/include/Engine/Rendering/Texture.h index 16892afc..0fe650b3 100644 --- a/include/Engine/Rendering/Texture.h +++ b/include/Engine/Rendering/Texture.h @@ -18,6 +18,7 @@ public: void Bind(GLenum textureUnit = GL_TEXTURE0); GLuint m_Texture = 0; + }; #endif diff --git a/include/Game/Game.h b/include/Game/Game.h index 500ecf3a..f448415f 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -13,6 +13,7 @@ #include "Core/EntityXMLFile.h" #include "Core/SystemPipeline.h" #include "RaptorCopterSystem.h" +#include "Rendering/Font.h" class Game { diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp new file mode 100644 index 00000000..d7454fe8 --- /dev/null +++ b/src/Engine/Rendering/Font.cpp @@ -0,0 +1,73 @@ +#include "Rendering/Font.h" + + +Font::Font(std::string path) +{ + FT_Library library; + FT_Face face; + + if (FT_Init_FreeType(&library)) { + LOG_ERROR("FreeType error: init failed"); + } + + if (FT_New_Face(library, path.c_str(), 0, &face)) { + LOG_ERROR("FreeType error: loading font"); + } + + FT_Set_Pixel_Sizes(face, 0, 48); + + if (FT_Load_Char(face, 'X', FT_LOAD_RENDER)) { + LOG_ERROR("FreeType error: loading char"); + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + for (GLubyte c = 0; c < 128; c++) { + //Load character glyph + if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { + continue; + } + printf("Char: %c\n", c); + //Generate texture + GLuint texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RED, + face->glyph->bitmap.width, + face->glyph->bitmap.rows, + 0, + GL_RED, + GL_UNSIGNED_BYTE, + face->glyph->bitmap.buffer + ); + // Set texture options + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // Now store character for later use + Character character = { + texture, + glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), + glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), + face->glyph->advance.x + }; + + m_Characters.insert(std::pair(c, character)); + } + + FT_Done_Face(face); + FT_Done_FreeType(library); + GLERROR("Font Load"); +} + +Font::~Font() +{ + for (auto c : m_Characters) { + glDeleteTextures(1, &c.second.TextureID); + } +} diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index 0fd46f32..9863b54f 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -7,67 +7,7 @@ TextRenderer::TextRenderer() void TextRenderer::Initialize() { - FT_Library library; - FT_Face face; - - if (FT_Init_FreeType(&library)) { - LOG_ERROR("FreeType error: init failed"); - } - - if (FT_New_Face(library, "fonts/arial.ttf", 0, &face)) { - LOG_ERROR("FreeType error: loading font"); - } - - FT_Set_Pixel_Sizes(face, 0, 48); - - if (FT_Load_Char(face, 'X', FT_LOAD_RENDER)) { - LOG_ERROR("FreeType error: loading char"); - } - - - - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - for (GLubyte c = 0; c < 128; c++) { - //Load character glyph - if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { - continue; - } - printf("Char: %c\n", c); - //Generate texture - GLuint texture; - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RED, - face->glyph->bitmap.width, - face->glyph->bitmap.rows, - 0, - GL_RED, - GL_UNSIGNED_BYTE, - face->glyph->bitmap.buffer - ); - // Set texture options - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // Now store character for later use - Character character = { - texture, - glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), - glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), - face->glyph->advance.x - }; - Characters.insert(std::pair(c, character)); - } - - FT_Done_Face(face); - FT_Done_FreeType(library); + @@ -115,7 +55,8 @@ void TextRenderer::Draw(glm::mat4 projection, glm::mat4 view) void TextRenderer::RenderText(std::string text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, glm::mat4 projection, glm::mat4 view) { - + font = ResourceManager::Load("fonts/arial.ttf"); + glm::mat4 modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.5f, 0.3f, 0.f)) * glm::toMat4(glm::quat()) * glm::scale(glm::vec3(0.01f)); // Activate corresponding render state @@ -134,7 +75,7 @@ void TextRenderer::RenderText(std::string text, GLfloat x, GLfloat y, GLfloat sc // Iterate through all characters std::string::const_iterator c; for (c = text.begin(); c != text.end(); c++) { - Character ch = Characters[*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; diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index bff6aebc..af6445f7 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -6,6 +6,7 @@ Game::Game(int argc, char* argv[]) ResourceManager::RegisterType("Model"); ResourceManager::RegisterType("Texture"); ResourceManager::RegisterType("EntityXMLFile"); + ResourceManager::RegisterType("FontFile"); m_Config = ResourceManager::Load("Config.ini"); LOG_LEVEL = static_cast<_LOG_LEVEL>(m_Config->Get("Debug.LogLevel", 1)); From 123c198e19423499784e07cb5065af3a99388d9f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 14 Dec 2015 14:48:24 +0100 Subject: [PATCH 07/12] Text component added and Text render queue --- include/Engine/Rendering/RenderQueue.h | 17 +++++++++ include/Engine/Rendering/RenderQueueFactory.h | 1 + include/Engine/Rendering/TextRenderer.h | 5 ++- resources/Schema/Components.xsd | 1 + resources/Schema/Components/Text.xml | 6 +++ resources/Schema/Components/Text.xsd | 27 +++++++++++++ resources/Schema/Entities/Test.xml | 11 ++++++ resources/Schema/Types/Entity.xsd | 1 + src/Engine/Rendering/Font.cpp | 2 +- src/Engine/Rendering/RenderQueueFactory.cpp | 33 ++++++++++++++++ src/Engine/Rendering/Renderer.cpp | 3 +- src/Engine/Rendering/TextRenderer.cpp | 38 ++++++------------- 12 files changed, 115 insertions(+), 30 deletions(-) create mode 100644 resources/Schema/Components/Text.xml create mode 100644 resources/Schema/Components/Text.xsd diff --git a/include/Engine/Rendering/RenderQueue.h b/include/Engine/Rendering/RenderQueue.h index 2942c743..4e3f703c 100644 --- a/include/Engine/Rendering/RenderQueue.h +++ b/include/Engine/Rendering/RenderQueue.h @@ -8,6 +8,7 @@ #include "../GLM.h" #include "../Core/Util/Rectangle.h" #include "../Core/Entity.h" +#include "Font.h" class Model; class Skeleton; @@ -80,6 +81,19 @@ struct SpriteJob : RenderJob } }; +struct TextJob : RenderJob +{ + glm::mat4 ModelMatrix; + glm::vec4 Color; + std::string Content; + Font* Resource; + + void CalculateHash() override + { + Hash = 0; + } +}; + struct PointLightJob : RenderJob { glm::vec3 Position; @@ -137,17 +151,20 @@ struct RenderQueueCollection { RenderQueue Forward; RenderQueue Lights; + RenderQueue Text; void Clear() { Forward.Clear(); Lights.Clear(); + Text.Clear(); } void Sort() { Forward.Sort(); Lights.Sort(); + Text.Sort(); } }; diff --git a/include/Engine/Rendering/RenderQueueFactory.h b/include/Engine/Rendering/RenderQueueFactory.h index b273b672..1f9adc46 100644 --- a/include/Engine/Rendering/RenderQueueFactory.h +++ b/include/Engine/Rendering/RenderQueueFactory.h @@ -20,6 +20,7 @@ private: void FillModels(World* world, RenderQueue* renderQueue); void FillLights(World* world, RenderQueue* renderQueue); + void FillText(World* world, RenderQueue* renderQueue); glm::mat4 ModelMatrix(World* world, EntityID entity); diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index 41298843..2aac6500 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -9,6 +9,7 @@ #include "ShaderProgram.h" #include "Font.h" #include "../Core/ResourceManager.h" +#include "RenderQueue.h" class TextRenderer { @@ -16,14 +17,14 @@ public: TextRenderer(); void Initialize(); void Update(); - void Draw(glm::mat4 projection, glm::mat4 view); + void Draw(RenderQueue &rq, glm::mat4 projection, glm::mat4 view); private: Font* font; GLuint VAO, VBO; - void RenderText(std::string text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, glm::mat4 projection, glm::mat4 view); + void RenderText(std::string text, Font* font, GLfloat scale, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); ShaderProgram m_TextProgram; diff --git a/resources/Schema/Components.xsd b/resources/Schema/Components.xsd index d4160700..a854f96d 100644 --- a/resources/Schema/Components.xsd +++ b/resources/Schema/Components.xsd @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/resources/Schema/Components/Text.xml b/resources/Schema/Components/Text.xml new file mode 100644 index 00000000..1d5a4927 --- /dev/null +++ b/resources/Schema/Components/Text.xml @@ -0,0 +1,6 @@ + + + + + true + \ No newline at end of file diff --git a/resources/Schema/Components/Text.xsd b/resources/Schema/Components/Text.xsd new file mode 100644 index 00000000..251d2e2e --- /dev/null +++ b/resources/Schema/Components/Text.xsd @@ -0,0 +1,27 @@ + + + + + + + + A visible font loaded from disk + + + + + the content of the string printed + + + font file + + + Color + + + Wether the text is visible or not + + + + + \ No newline at end of file diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 2c3ea18e..78908eb5 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -21,6 +21,17 @@ + + + + + + + Fonts/arial.ttf + Hej I am component text + + + diff --git a/resources/Schema/Types/Entity.xsd b/resources/Schema/Types/Entity.xsd index 695ae7d1..198f0cb7 100644 --- a/resources/Schema/Types/Entity.xsd +++ b/resources/Schema/Types/Entity.xsd @@ -14,6 +14,7 @@ + diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp index d7454fe8..12b1b97c 100644 --- a/src/Engine/Rendering/Font.cpp +++ b/src/Engine/Rendering/Font.cpp @@ -27,7 +27,7 @@ Font::Font(std::string path) if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { continue; } - printf("Char: %c\n", c); + //Generate texture GLuint texture; glGenTextures(1, &texture); diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 81d7391e..c52048aa 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -11,6 +11,7 @@ void RenderQueueFactory::Update(World* world) m_RenderQueues.Clear(); FillModels(world, &m_RenderQueues.Forward); FillLights(world, &m_RenderQueues.Lights); + FillText(world, &m_RenderQueues.Text); } glm::mat4 RenderQueueFactory::ModelMatrix(World* world, EntityID entity) @@ -71,6 +72,9 @@ void RenderQueueFactory::FillModels(World* world, RenderQueue* renderQueue) } for (auto& modelC : *models) { + + + std::string resource = modelC["Resource"]; if (resource.empty()) { continue; @@ -103,3 +107,32 @@ void RenderQueueFactory::FillLights(World* world, RenderQueue* renderQueue) } +void RenderQueueFactory::FillText(World* world, RenderQueue* renderQueue) +{ + auto texts = world->GetComponents("Text"); + if (texts == nullptr) { + return; + } + + for (auto& textC : *texts) { + + + std::string resource = textC["Resource"]; + if (resource.empty()) { + continue; + } + Font* font = ResourceManager::Load(resource); + + glm::vec4 color = textC["Color"]; + std::string content = textC["Content"]; + + TextJob job; + job.Color = color; + job.Content = content; + job.Resource = font; + job.ModelMatrix = ModelMatrix(world, textC.EntityID); + + renderQueue->Add(job); + } +} + diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 3ee559c5..dc2f65df 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -156,7 +156,7 @@ void Renderer::Draw(RenderQueueCollection& rq) // DrawScreenQuad(m_PickingTexture); DrawScene(rq); - m_TextRenderer->Draw(m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + m_TextRenderer->Draw(rq.Text,m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); glfwSwapBuffers(m_Window); } @@ -272,6 +272,7 @@ void Renderer::PickingPass(RenderQueueCollection& rq) m_EventBroker->Publish(pickEvent); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index 9863b54f..697b6834 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -7,11 +7,6 @@ TextRenderer::TextRenderer() void TextRenderer::Initialize() { - - - - - glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); @@ -22,8 +17,6 @@ void TextRenderer::Initialize() glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); - - m_TextProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Text.vert.glsl"))); m_TextProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Text.frag.glsl"))); m_TextProgram.Compile(); @@ -35,40 +28,33 @@ void TextRenderer::Update() } -void TextRenderer::Draw(glm::mat4 projection, glm::mat4 view) +void TextRenderer::Draw(RenderQueue &rq, glm::mat4 projection, glm::mat4 view) { - if(counter > 2) { - if (text == "") { - text = text + "~wub "; - } else if (text == "~wub ") { - text = text + "wub "; - } else if (text == "~wub wub ") { - text = ""; + for (auto &job : rq) { + auto textJob = std::dynamic_pointer_cast(job); + if (textJob) { + RenderText(textJob->Content, textJob->Resource, 0.01f, textJob->Color, textJob->ModelMatrix, projection, view); } - counter = 0; - } else { - counter++; } - - RenderText(text, 0.f, 0.f, 1.0f, glm::vec3(1.f, 1.f, 1.f), projection, view); } -void TextRenderer::RenderText(std::string text, GLfloat x, GLfloat y, GLfloat scale, glm::vec3 color, glm::mat4 projection, glm::mat4 view) +void TextRenderer::RenderText(std::string text, Font* font, GLfloat scale, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { - font = ResourceManager::Load("fonts/arial.ttf"); + GLfloat x = 0; + GLfloat y = 0; - glm::mat4 modelMatrix = glm::translate(glm::mat4(), glm::vec3(0.5f, 0.3f, 0.f)) * glm::toMat4(glm::quat()) * glm::scale(glm::vec3(0.01f)); // Activate corresponding render state - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glEnable(GL_BLEND); + glDisable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); m_TextProgram.Bind(); glUniform3f(glGetUniformLocation(m_TextProgram.GetHandle(), "textColor"), color.x, color.y, color.z); glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(view)); - glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projection)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniformMatrix4fv(glGetUniformLocation(m_TextProgram.GetHandle(), "P"), 1, GL_FALSE, glm::value_ptr(projectionMatrix)); glActiveTexture(GL_TEXTURE0); glBindVertexArray(VAO); From 92553f1e932dfc211bb7540d6ab4de775fdc38f4 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 18 Jan 2016 17:17:12 +0100 Subject: [PATCH 08/12] text size can now be entered in the filepath with a comma separator, like this "filepath,16" --- include/Engine/Rendering/Font.h | 7 ++ include/Engine/Rendering/TextRenderer.h | 1 + resources/Schema/Entities/RenderingWorld.xml | 126 ++++++++++--------- src/Engine/Rendering/Font.cpp | 52 ++++++-- src/Engine/Rendering/PickingPass.cpp | 2 - 5 files changed, 118 insertions(+), 70 deletions(-) diff --git a/include/Engine/Rendering/Font.h b/include/Engine/Rendering/Font.h index 03f15a49..08341c1e 100644 --- a/include/Engine/Rendering/Font.h +++ b/include/Engine/Rendering/Font.h @@ -3,6 +3,9 @@ #include #include FT_FREETYPE_H +#include FT_GLYPH_H +#include +#include #include "../OpenGL.h" #include "../GLM.h" @@ -21,6 +24,10 @@ public: glm::ivec2 Bearing; // Offset from baseline to left/top of glyph GLuint Advance; // Offset to advance to next glyph }; + + FT_Face Face; + + ~Font(); std::map m_Characters; diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index 2e127e66..a755fd30 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -3,6 +3,7 @@ #include #include FT_FREETYPE_H +#include FT_GLYPH_H #include "../OpenGL.h" #include "../GLM.h" diff --git a/resources/Schema/Entities/RenderingWorld.xml b/resources/Schema/Entities/RenderingWorld.xml index 86a3090a..73c0e474 100644 --- a/resources/Schema/Entities/RenderingWorld.xml +++ b/resources/Schema/Entities/RenderingWorld.xml @@ -1,58 +1,72 @@ - + + - - - - - - - - - - - - - Models/Camera.obj - - - MainCamera - - - - - - - - - - Models/Camera.obj - - - ActionCamera - - - - - - - - - - - Models/Core/UnitPlane.obj - - - - - - - - - - An error - - - - - \ No newline at end of file + + + + + + + + MainCamera + + + Models/Camera.obj + false + + + + + + + + + + + + ActionCamera + + + Models/Camera.obj + + + + + + + + + + + Models/Core/UnitPlane.obj + + + + + + + + + + + + An error + + + + + + + + + asdasdasdasdasd + Fonts/DroidSans.ttf + + + + + + + + diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp index cf5cd691..f62205e3 100644 --- a/src/Engine/Rendering/Font.cpp +++ b/src/Engine/Rendering/Font.cpp @@ -3,22 +3,48 @@ Font::Font(std::string path) { + typedef boost::tokenizer> tokenizer; + boost::char_separator sep(","); + tokenizer tok(path, sep); + + int fontSize = 16; + + tokenizer::iterator it = tok.begin(); + std::string filePath = ""; + + if (it != tok.end()) { + filePath = (*it).c_str(); + it++; + if (it != tok.end()) { + try { + LOG_INFO("DFhdoölshöldsihjgf"); + fontSize = boost::lexical_cast((*it).c_str()); + } catch (boost::bad_lexical_cast const&) { + std::cout << "Error: input string was not valid" << std::endl; + } + } + } else { + return; + } + + + FT_Library library; - FT_Face face; if (FT_Init_FreeType(&library)) { LOG_ERROR("FreeType error: init failed"); return; } - if (FT_New_Face(library, path.c_str(), 0, &face)) { + if (FT_New_Face(library, filePath.c_str(), 0, &Face)) { LOG_ERROR("FreeType error: loading font"); return; } - FT_Set_Pixel_Sizes(face, 0, 48); + 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)) { + if (FT_Load_Char(Face, 'X', FT_LOAD_RENDER)) { LOG_ERROR("FreeType error: loading char"); return; } @@ -26,8 +52,10 @@ Font::Font(std::string path) glPixelStorei(GL_UNPACK_ALIGNMENT, 1); for (GLubyte c = 0; c < 128; c++) { + + //Load character glyph - if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { + if (FT_Load_Char(Face, c, FT_LOAD_RENDER)) { continue; } @@ -40,12 +68,12 @@ Font::Font(std::string path) GL_TEXTURE_2D, 0, GL_RED, - face->glyph->bitmap.width, - face->glyph->bitmap.rows, + Face->glyph->bitmap.width, + Face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE, - face->glyph->bitmap.buffer + Face->glyph->bitmap.buffer ); // Set texture options glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -55,15 +83,15 @@ Font::Font(std::string path) // Now store character for later use Character character = { texture, - glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), - glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), - face->glyph->advance.x + glm::ivec2(Face->glyph->bitmap.width, Face->glyph->bitmap.rows), + glm::ivec2(Face->glyph->bitmap_left, Face->glyph->bitmap_top), + Face->glyph->advance.x }; m_Characters.insert(std::pair(c, character)); } - FT_Done_Face(face); + FT_Done_Face(Face); FT_Done_FreeType(library); GLERROR("Font Load"); } diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp index 6800df1d..7470f029 100644 --- a/src/Engine/Rendering/PickingPass.cpp +++ b/src/Engine/Rendering/PickingPass.cpp @@ -46,10 +46,8 @@ void PickingPass::InitializeShaderPrograms() void PickingPass::Draw(RenderScene& scene) { PickingPassState* state = new PickingPassState(m_PickingBuffer.GetHandle()); - //TODO: Render: Add code for more jobs than modeljobs. - GLuint ShaderHandle = m_PickingProgram->GetHandle(); m_PickingProgram->Bind(); From c4594524da8261b13be21136659f60a46a44f0bb Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 18 Jan 2016 17:51:17 +0100 Subject: [PATCH 09/12] Better default values and documentation --- resources/Schema/Components/Text.xml | 4 ++-- resources/Schema/Components/Text.xsd | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/Schema/Components/Text.xml b/resources/Schema/Components/Text.xml index d9190aba..45bed531 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/Components/Text.xsd b/resources/Schema/Components/Text.xsd index 251d2e2e..c66acacd 100644 --- a/resources/Schema/Components/Text.xsd +++ b/resources/Schema/Components/Text.xsd @@ -13,7 +13,7 @@ the content of the string printed - font file + The asset file, font resolution, example: Fonts/font.ttf,16 Color From dbe56280a66e5adb3cca9974e150185f7a36f208 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 19 Jan 2016 11:45:34 +0100 Subject: [PATCH 10/12] 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); From f0763bc2a3f76e83953cb3c3cb0d72989376394f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Tue, 19 Jan 2016 17:18:18 +0100 Subject: [PATCH 11/12] Font loading crash fixed --- include/Engine/Rendering/TextJob.h | 21 +++ include/Engine/Rendering/TextRenderer.h | 2 +- resources/Schema/Components/Text.xml | 1 + resources/Schema/Components/Text.xsd | 15 ++ resources/Schema/Entities/RenderingWorld.xml | 166 ++++++++++++++----- src/Engine/Rendering/Font.cpp | 11 +- src/Engine/Rendering/RenderSystem.cpp | 13 +- src/Engine/Rendering/TextRenderer.cpp | 14 +- 8 files changed, 192 insertions(+), 51 deletions(-) diff --git a/include/Engine/Rendering/TextJob.h b/include/Engine/Rendering/TextJob.h index d6374d84..a11761d2 100644 --- a/include/Engine/Rendering/TextJob.h +++ b/include/Engine/Rendering/TextJob.h @@ -20,13 +20,34 @@ struct TextJob : RenderJob Color = (glm::vec4)textComponent["Color"]; Content = (std::string)textComponent["Content"]; Resource = font; + + if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) { + Alignment = AlignmentEnum::Left; + } else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Right")) { + Alignment = AlignmentEnum::Right; + } else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Center")) { + Alignment = AlignmentEnum::Center; + } else { + LOG_ERROR("Text alignment invalid"); + Alignment = AlignmentEnum::Left; + } + + }; + + enum class AlignmentEnum + { + Left, + Right, + Center }; glm::mat4 Matrix; glm::vec4 Color; std::string Content; Font* Resource; + AlignmentEnum Alignment; + void CalculateHash() override { diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index e7323deb..8094dda0 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, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); + void RenderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, 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 ecf9bac8..9ca629d1 100644 --- a/resources/Schema/Components/Text.xml +++ b/resources/Schema/Components/Text.xml @@ -4,4 +4,5 @@ true +
\ No newline at end of file diff --git a/resources/Schema/Components/Text.xsd b/resources/Schema/Components/Text.xsd index c66acacd..14e91a35 100644 --- a/resources/Schema/Components/Text.xsd +++ b/resources/Schema/Components/Text.xsd @@ -3,6 +3,18 @@ + + + + + + + + + + + + A visible font loaded from disk @@ -21,6 +33,9 @@ Wether the text is visible or not + + Text alignment + diff --git a/resources/Schema/Entities/RenderingWorld.xml b/resources/Schema/Entities/RenderingWorld.xml index f35747c4..6e4fbece 100644 --- a/resources/Schema/Entities/RenderingWorld.xml +++ b/resources/Schema/Entities/RenderingWorld.xml @@ -6,59 +6,29 @@ - - - - MainCamera - - - Models/Camera.obj - - - - - - - - - - - Camera 1 - Fonts/DroidSans.ttf,24 - - - - - - - - - - ActionCamera - Models/Camera.obj - false - - + + - Camera 2 - Fonts/DroidSans.ttf,24 + Camera #2 + Fonts/DroidSans.ttf,64 + 0 - + @@ -81,9 +51,11 @@ - An error + Models/Assault.obj - + + + @@ -91,7 +63,7 @@ Welcome! - Fonts/DroidSans.ttf,64 + Fonts/DroidSans.ttf,1280 @@ -99,6 +71,122 @@ + + + + 2 + + + + + + + + + + + + + 6 + + + + + + + + + + + + 6 + + + + + + + + + + + + 6 + + + + + + + + + + + 6 + + + + + + + + + + + + + 51 + 0.4999997615814209 + + + + + + + + + + + Models/Assault.obj + + + + + + + + + + + MainCamera + + + + Models/Camera.obj + false + + + + + + + + + + + Taiwan #1 + Fonts/DroidSans.ttf,64 + 0 + + + + + + + + + + diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp index ba99ee31..8af013e8 100644 --- a/src/Engine/Rendering/Font.cpp +++ b/src/Engine/Rendering/Font.cpp @@ -19,10 +19,11 @@ Font::Font(std::string path) FontSize = boost::lexical_cast((*it).c_str()); } catch (boost::bad_lexical_cast const&) { LOG_ERROR("input string did not have a valid font resolution"); + throw std::runtime_error(""); } } } else { - return; + throw std::runtime_error("");; } @@ -30,12 +31,12 @@ Font::Font(std::string path) if (FT_Init_FreeType(&library)) { LOG_ERROR("FreeType error: init failed"); - return; + throw std::runtime_error("");; } if (FT_New_Face(library, filePath.c_str(), 0, &Face)) { LOG_ERROR("FreeType error: loading font"); - return; + throw std::runtime_error("");; } FT_Set_Char_Size(Face, 0, FontSize*64, 300, 300); // temp @@ -43,7 +44,7 @@ Font::Font(std::string path) if (FT_Load_Char(Face, 'X', FT_LOAD_RENDER)) { LOG_ERROR("FreeType error: loading char"); - return; + throw std::runtime_error("");; } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); @@ -87,6 +88,8 @@ Font::Font(std::string path) m_Characters.insert(std::pair(c, character)); } + + FT_Done_FreeType(library); GLERROR("Font Load"); } diff --git a/src/Engine/Rendering/RenderSystem.cpp b/src/Engine/Rendering/RenderSystem.cpp index 20614781..0e411bd9 100644 --- a/src/Engine/Rendering/RenderSystem.cpp +++ b/src/Engine/Rendering/RenderSystem.cpp @@ -154,12 +154,17 @@ void RenderSystem::fillText(std::list>& jobs, World* continue; } - Font* font = ResourceManager::Load(textComponent["Resource"]); - if (font == nullptr) { - font = ResourceManager::Load("Fonts/DroidSans.ttf"); + Font* font; + try { + font = ResourceManager::Load(resource); + } catch (const std::exception&) { + try { + font = ResourceManager::Load("Fonts/DroidSans.ttf,16"); + } catch (const std::exception&) { + continue; + } } - glm::mat4 modelMatrix = Transform::ModelMatrix(textComponent.EntityID, world); std::shared_ptr modelJob = std::shared_ptr(new TextJob(modelMatrix, font, textComponent)); jobs.push_back(modelJob); diff --git a/src/Engine/Rendering/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index 5b51c063..0bd58465 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -34,12 +34,13 @@ void TextRenderer::Draw(RenderScene& scene) for (auto &job : scene.TextJobs) { auto textJob = std::dynamic_pointer_cast(job); if (textJob) { - RenderText(textJob->Content, textJob->Resource, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); + + RenderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); } } } -void TextRenderer::RenderText(std::string text, Font* font, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) +void TextRenderer::RenderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { GLfloat penX = 0; GLfloat penY = 0; @@ -60,7 +61,14 @@ void TextRenderer::RenderText(std::string text, Font* font, glm::vec4 color, glm stringWidth += (ch.Advance >> 6) * scale; } - penX = -stringWidth/2.f; + if(alignment == TextJob::AlignmentEnum::Center) { + penX = -stringWidth/2.f; + } else if (alignment == TextJob::AlignmentEnum::Right) { + penX = -stringWidth; + } else { + penX = 0; + } + // Activate corresponding render state From f3bfe388af515eb0997c144e07d78c1cfa3b0b19 Mon Sep 17 00:00:00 2001 From: viktorljung Date: Thu, 21 Jan 2016 10:16:03 +0100 Subject: [PATCH 12/12] Clean up --- assets | 2 +- include/Engine/Rendering/Font.h | 2 +- include/Engine/Rendering/TextRenderer.h | 13 +-- resources/Schema/Entities/RenderingWorld.xml | 84 +++++++++++++++++--- src/Engine/Rendering/Font.cpp | 29 ++++--- src/Engine/Rendering/TextRenderer.cpp | 24 ++---- 6 files changed, 99 insertions(+), 55 deletions(-) diff --git a/assets b/assets index 6ffb46e1..b6592dbb 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 6ffb46e155c8f013241cd1507098c94900ec2448 +Subproject commit b6592dbb0216bbac00ccea43a0afd0e27d0b185e diff --git a/include/Engine/Rendering/Font.h b/include/Engine/Rendering/Font.h index 5a1a6bdd..89a21eb0 100644 --- a/include/Engine/Rendering/Font.h +++ b/include/Engine/Rendering/Font.h @@ -25,7 +25,7 @@ public: GLuint Advance; // Offset to advance to next glyph }; - FT_Face Face; + int FontSize = 16; diff --git a/include/Engine/Rendering/TextRenderer.h b/include/Engine/Rendering/TextRenderer.h index 8094dda0..cdc1d8c7 100644 --- a/include/Engine/Rendering/TextRenderer.h +++ b/include/Engine/Rendering/TextRenderer.h @@ -2,8 +2,7 @@ #define TextRenderer_h__ #include -#include FT_FREETYPE_H -#include FT_GLYPH_H +#include FT_FREETYPE_H #include "../OpenGL.h" #include "../GLM.h" @@ -21,17 +20,11 @@ public: void Draw(RenderScene& scene); private: + void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); + Font* font; - GLuint VAO, VBO; - - void RenderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix); - ShaderProgram* m_TextProgram; - - std::string text = ""; - - int counter = 0; }; diff --git a/resources/Schema/Entities/RenderingWorld.xml b/resources/Schema/Entities/RenderingWorld.xml index 56bbd794..69b18982 100644 --- a/resources/Schema/Entities/RenderingWorld.xml +++ b/resources/Schema/Entities/RenderingWorld.xml @@ -11,14 +11,12 @@ ActionCamera - Models/Camera.obj - false - - + + @@ -81,7 +79,7 @@ - + @@ -96,7 +94,20 @@ - + + + + + + 8 + + + + + + + + @@ -109,7 +120,20 @@ - + + + + + + 8 + + + + + + + + @@ -122,7 +146,20 @@ - + + + + + + 8 + + + + + + + + @@ -134,7 +171,19 @@ - + + + + + 8 + + + + + + + + @@ -160,8 +209,8 @@ false - - + + @@ -192,7 +241,18 @@ - + + + + + + + + + Models/Core/UnitCube.obj + + + diff --git a/src/Engine/Rendering/Font.cpp b/src/Engine/Rendering/Font.cpp index 8af013e8..940694ea 100644 --- a/src/Engine/Rendering/Font.cpp +++ b/src/Engine/Rendering/Font.cpp @@ -15,6 +15,10 @@ Font::Font(std::string path) filePath = (*it).c_str(); it++; if (it != tok.end()) { + if((*it).c_str() == "") { + throw std::runtime_error(""); + } + try { FontSize = boost::lexical_cast((*it).c_str()); } catch (boost::bad_lexical_cast const&) { @@ -28,21 +32,22 @@ Font::Font(std::string path) FT_Library library; + FT_Face face; if (FT_Init_FreeType(&library)) { LOG_ERROR("FreeType error: init failed"); throw std::runtime_error("");; } - if (FT_New_Face(library, filePath.c_str(), 0, &Face)) { + if (FT_New_Face(library, filePath.c_str(), 0, &face)) { LOG_ERROR("FreeType error: loading font"); throw std::runtime_error("");; } - 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)) { + if (FT_Load_Char(face, 'X', FT_LOAD_RENDER)) { LOG_ERROR("FreeType error: loading char"); throw std::runtime_error("");; } @@ -53,7 +58,7 @@ Font::Font(std::string path) //Load character glyph - if (FT_Load_Char(Face, c, FT_LOAD_RENDER)) { + if (FT_Load_Char(face, c, FT_LOAD_RENDER)) { continue; } @@ -66,12 +71,12 @@ Font::Font(std::string path) GL_TEXTURE_2D, 0, GL_RED, - Face->glyph->bitmap.width, - Face->glyph->bitmap.rows, + face->glyph->bitmap.width, + face->glyph->bitmap.rows, 0, GL_RED, GL_UNSIGNED_BYTE, - Face->glyph->bitmap.buffer + face->glyph->bitmap.buffer ); // Set texture options glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -81,22 +86,22 @@ Font::Font(std::string path) // Now store character for later use Character character = { texture, - glm::ivec2(Face->glyph->bitmap.width, Face->glyph->bitmap.rows), - glm::ivec2(Face->glyph->bitmap_left, Face->glyph->bitmap_top), - Face->glyph->advance.x + glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), + glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), + face->glyph->advance.x }; 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/TextRenderer.cpp b/src/Engine/Rendering/TextRenderer.cpp index 0bd58465..a8dfc083 100644 --- a/src/Engine/Rendering/TextRenderer.cpp +++ b/src/Engine/Rendering/TextRenderer.cpp @@ -35,25 +35,17 @@ void TextRenderer::Draw(RenderScene& scene) auto textJob = std::dynamic_pointer_cast(job); if (textJob) { - RenderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); + renderText(textJob->Content, textJob->Resource, textJob->Alignment, textJob->Color, textJob->Matrix, scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix()); } } } -void TextRenderer::RenderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) +void TextRenderer::renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix) { 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++) { @@ -67,10 +59,7 @@ void TextRenderer::RenderText(std::string text, Font* font, TextJob::AlignmentEn penX = -stringWidth; } else { penX = 0; - } - - - // Activate corresponding render state + } glEnable(GL_BLEND); glDisable(GL_CULL_FACE); @@ -94,7 +83,7 @@ void TextRenderer::RenderText(std::string text, Font* font, TextJob::AlignmentEn GLfloat w = ch.Size.x * scale; GLfloat h = ch.Size.y * scale; - // Update VBO for each character + GLfloat vertices[6][4] = { { xpos, ypos + h, 0.0, 0.0 }, { xpos, ypos, 0.0, 1.0 }, @@ -105,15 +94,12 @@ void TextRenderer::RenderText(std::string text, Font* font, TextJob::AlignmentEn { xpos + w, ypos + h, 1.0, 0.0 } }; - // Render glyph texture over quad glBindTexture(GL_TEXTURE_2D, ch.TextureID); - // Update content of VBO memory + glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); glBindBuffer(GL_ARRAY_BUFFER, 0); - // Render quad glDrawArrays(GL_TRIANGLES, 0, 6); - // Now advance cursors for next glyph (note that advance is number of 1/64 pixels) penX += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) } glBindVertexArray(0);