#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(); }