From 123c198e19423499784e07cb5065af3a99388d9f Mon Sep 17 00:00:00 2001 From: viktorljung Date: Mon, 14 Dec 2015 14:48:24 +0100 Subject: [PATCH] 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);