diff --git a/2dGameProject/SpriteRenderer.cpp b/2dGameProject/SpriteRenderer.cpp index 8843816..9611b62 100644 --- a/2dGameProject/SpriteRenderer.cpp +++ b/2dGameProject/SpriteRenderer.cpp @@ -40,10 +40,10 @@ SpriteRenderer::SpriteRenderer() { //Initialize Resources float vertexData[] = { - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f + 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f }; unsigned int indices[]{ @@ -56,19 +56,20 @@ SpriteRenderer::SpriteRenderer() { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)0); - glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (void*)(3 * sizeof(float))); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); - glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)0); - glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 4)); - glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 8)); - glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(sizeof(float) * 12)); + glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(16 * sizeof(float))); + glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)0); + glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 4)); + glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 8)); + glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 20 * sizeof(float), (void*)(sizeof(float) * 12)); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glEnableVertexAttribArray(3); glEnableVertexAttribArray(4); glEnableVertexAttribArray(5); + glVertexAttribDivisor(1, 1); glVertexAttribDivisor(2, 1); glVertexAttribDivisor(3, 1); glVertexAttribDivisor(4, 1); @@ -131,13 +132,13 @@ SpriteRenderer::~SpriteRenderer() { glDeleteProgram(shaderProgram); } -void SpriteRenderer::drawSprite(glm::mat4 transform) { - matrices.push_back(transform); +void SpriteRenderer::drawSprite(glm::mat4 transform, glm::vec4 color) { + matrices.push_back(instance{transform, color}); } void SpriteRenderer::flush() { glBindBuffer(GL_ARRAY_BUFFER, instanceVBO); - glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * matrices.size(), matrices.data(), GL_STREAM_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(instance) * matrices.size(), matrices.data(), GL_STREAM_DRAW); glBindVertexArray(VAO); glUseProgram(shaderProgram); glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, matrices.size()); diff --git a/2dGameProject/SpriteRenderer.h b/2dGameProject/SpriteRenderer.h index a7ea745..97bfaf5 100644 --- a/2dGameProject/SpriteRenderer.h +++ b/2dGameProject/SpriteRenderer.h @@ -2,15 +2,20 @@ #include #include +struct instance { + glm::mat4 model; + glm::vec4 color; +}; + class SpriteRenderer { private: unsigned int VAO, VBO, EBO, instanceVBO, shaderProgram; - std::vector matrices; + std::vector matrices; public: SpriteRenderer(); ~SpriteRenderer(); - void drawSprite(glm::mat4 transform); + void drawSprite(glm::mat4 transform, glm::vec4 color); void flush(); }; diff --git a/2dGameProject/Square.cpp b/2dGameProject/Square.cpp index 9449b86..668e455 100644 --- a/2dGameProject/Square.cpp +++ b/2dGameProject/Square.cpp @@ -22,5 +22,5 @@ void Square::Draw(SpriteRenderer* renderer) { //glBindVertexArray(VAO); //glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //glBindVertexArray(NULL); - renderer->drawSprite(model_transform); + renderer->drawSprite(model_transform, color); } \ No newline at end of file diff --git a/2dGameProject/main.cpp b/2dGameProject/main.cpp index 38f00eb..1c6822a 100644 --- a/2dGameProject/main.cpp +++ b/2dGameProject/main.cpp @@ -91,8 +91,6 @@ void renderInit() { glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4)*2, new matricies{glm::ortho(0.0f, 800.0f, 600.0f, 0.0f), glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))}, GL_STATIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); glBindBufferBase(GL_UNIFORM_BUFFER, PROJ_MAT_UNIFORM_BUFFER, uniformBuffer); - - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } void deinit() { @@ -103,18 +101,17 @@ void render() { INFO("Render thread starting"); renderInit(); SpriteRenderer* renderer = new SpriteRenderer(); - std::vector squares; - for (int i = 0; i < 100 * 100; i++) { - int x = i % 100; - int y = i / 100; - squares.push_back(new Square({x*6, y*6, 0}, {6, 6, 1}, {0, 0, 1, 1})); - } + Square square1(glm::vec3(100, 100, 0), glm::vec3(100, 100, 1), glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); + Square square2(glm::vec3(600, 100, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); + Square square3(glm::vec3(100, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); + Square square4(glm::vec3(600, 400, 0), glm::vec3(100, 100, 1), glm::vec4(0.7f, 0.7f, 0.3f, 1.0f)); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); window->beginRender(); - for (auto square : squares) { - square->Draw(renderer); - } + square1.Draw(renderer); + square2.Draw(renderer); + square3.Draw(renderer); + square4.Draw(renderer); renderer->flush(); window->endRender(); }