diff options
Diffstat (limited to 'src/RendererWidget.cpp')
-rw-r--r-- | src/RendererWidget.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/RendererWidget.cpp b/src/RendererWidget.cpp new file mode 100644 index 0000000..6b732e3 --- /dev/null +++ b/src/RendererWidget.cpp @@ -0,0 +1,76 @@ +#include "RendererWidget.hpp" + +const GLfloat vertices[] = { + 0.0f,0.0f,0.0f, + 1.0f,1.0f,0.0f, + 0.0f,1.0f,0.0f, + + 0.0f,0.0f,0.0f, + 1.0f,0.0f,0.0f, + 1.0f,1.0f,0.0f, +}; + +const GLfloat uvs[] = { + 0.0f,0.0f, + 1.0f,1.0f, + 0.0f,1.0f, + + 0.0f,0.0f, + 1.0f,0.0f, + 1.0f,1.0f, +}; + +static GLuint VboVertices, VboUvs, Vao; +static Shader* guiShader = nullptr; + +RendererWidget::RendererWidget(RootWidget *widget) { + this->tree = widget; + + if (guiShader == nullptr) { + guiShader = new Shader("./shaders/gui.vs", "./shaders/gui.fs"); + guiShader->Use(); + glUniform1i(glGetUniformLocation(guiShader->Program, "textureAtlas"), 0); + + glGenBuffers(1, &VboVertices); + glBindBuffer(GL_ARRAY_BUFFER, VboVertices); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glGenBuffers(1, &VboUvs); + glBindBuffer(GL_ARRAY_BUFFER, VboUvs); + glBufferData(GL_ARRAY_BUFFER, sizeof(uvs), uvs, GL_STATIC_DRAW); + + glGenVertexArrays(1, &Vao); + glBindVertexArray(Vao); + { + glBindBuffer(GL_ARRAY_BUFFER, VboVertices); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); + glEnableVertexAttribArray(0); + + glBindBuffer(GL_ARRAY_BUFFER, VboUvs); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); + glEnableVertexAttribArray(1); + } + glBindVertexArray(0); + } +} + +RendererWidget::~RendererWidget() { + +} + +void RendererWidget::Render(RenderState &state) { + state.SetActiveVao(Vao); + state.SetActiveShader(guiShader->Program); + + auto toRender = tree->GetRenderList(); + for (auto& it : toRender) { + auto[x, y, w, h] = it->GetTexture(); + glUniform4f(glGetUniformLocation(guiShader->Program, "widgetTexture"), x, y, w, h); + + glUniform4f(glGetUniformLocation(guiShader->Program, "transform"), it->x, it->y, it->w, it->h); + + glDrawArrays(GL_TRIANGLES, 0, 36); + } + + glCheckError(); +}
\ No newline at end of file |