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);