From d1963f08c6fd9a1d8475e2ca75825236ae690c81 Mon Sep 17 00:00:00 2001 From: Nigel Date: Wed, 19 Oct 2022 17:30:18 +0200 Subject: [PATCH] Rendering sprites --- .gitattributes | 1 + shader.fs | 11 ++++++++ shader.vs | 13 +++++++++ src/game.cpp | 20 +++++++++++-- src/game.h | 5 +++- src/spriterenderer.cpp | 61 ++++++++++++++++++++++++++++++++++++++++ src/spriterenderer.h | 28 ++++++++++++++++++ textures/awesomeface.png | 3 ++ 8 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 .gitattributes create mode 100644 shader.fs create mode 100644 shader.vs create mode 100644 src/spriterenderer.cpp create mode 100644 src/spriterenderer.h create mode 100644 textures/awesomeface.png diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..24a8e87 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.png filter=lfs diff=lfs merge=lfs -text diff --git a/shader.fs b/shader.fs new file mode 100644 index 0000000..747455f --- /dev/null +++ b/shader.fs @@ -0,0 +1,11 @@ +#version 330 core +in vec2 TexCoords; +out vec4 color; + +uniform sampler2D image; +uniform vec3 spriteColor; + +void main() +{ + color = vec4(spriteColor, 1.0) * texture(image, TexCoords); +} \ No newline at end of file diff --git a/shader.vs b/shader.vs new file mode 100644 index 0000000..f3f2e96 --- /dev/null +++ b/shader.vs @@ -0,0 +1,13 @@ +#version 330 core +layout (location=0) in vec4 vertex; + +out vec2 TexCoords; + +uniform mat4 model; +uniform mat4 projection; + +void main() +{ + TexCoords = vertex.zw; + gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/src/game.cpp b/src/game.cpp index dfa5ec1..7bef586 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1,18 +1,32 @@ #include "game.h" +#include + +SpriteRenderer* Renderer; + Game::~Game() { - + delete Renderer; } Game::Game(unsigned int width, unsigned int height) + : State(GAME_ACTIVE), Keys(), Width(width), Height(height) { } void Game::Init() { - + // Load shaders + ResourceManager::LoadShader("shader.vs", "shader.fs", nullptr, "sprite"); + // configure shaders + glm::mat4 projection = glm::ortho(0.0f, static_cast(this->Width), static_cast(this->Height), 0.0f, -1.0f, 1.0f); + ResourceManager::GetShader("sprite").Use().SetInteger("image", 0); + ResourceManager::GetShader("sprite").SetMatrix4("projection", projection); + // set render-specific controls + Renderer = new SpriteRenderer(ResourceManager::GetShader("sprite")); + // load textures + ResourceManager::LoadTexture("textures/awesomeface.png", true, "face"); } @@ -29,5 +43,5 @@ void Game::Update(float dt) void Game::Render() { - + Renderer->DrawSprite(ResourceManager::GetTexture("face"), glm::vec2(200.0f, 200.0f), glm::vec2(300.0f, 400.0f), 45.0f, glm::vec3(0.0f, 1.0f,0.0f)); } \ No newline at end of file diff --git a/src/game.h b/src/game.h index d91bb2d..63acc7c 100644 --- a/src/game.h +++ b/src/game.h @@ -1,4 +1,7 @@ #pragma once +#include "spriterenderer.h" +#include "resourcemanager.h" + // Represent the curreent state of the game enum GameState { GAME_ACTIVE, @@ -10,7 +13,7 @@ class Game { // game state GameState State; bool Keys[1024]; - unsigned int width, height; + unsigned int Width, Height; // constructor / destructor Game(unsigned int width, unsigned int height); ~Game(); diff --git a/src/spriterenderer.cpp b/src/spriterenderer.cpp new file mode 100644 index 0000000..9e82ea4 --- /dev/null +++ b/src/spriterenderer.cpp @@ -0,0 +1,61 @@ +#include "spriterenderer.h" + +SpriteRenderer::SpriteRenderer(const Shader& shader) +{ + this->shader = shader; + this->initRenderData(); +} + +SpriteRenderer::~SpriteRenderer() +{ + glDeleteVertexArrays(1, &this->quadVAO); +} +void SpriteRenderer::initRenderData() +{ + unsigned int VBO; + float vertices [] = { + 0.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + + 0.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 0.0f + }; + + glGenVertexArrays(1, &this->quadVAO); + glGenBuffers(1, &VBO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glBindVertexArray(this->quadVAO); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); +} + +void SpriteRenderer::DrawSprite(const Texture2D& texture, glm::vec2 position, glm::vec2 size, float rotate, glm::vec3 color ) +{ + // prepare transformations + this->shader.Use(); + glm::mat4 model = glm::mat4(1.0f); + model = glm::translate(model, glm::vec3(position, 0.0f)); + + model = glm::translate(model, glm::vec3(0.5f * size.x , 0.5f * size.y, 0.0f)); + model = glm::rotate(model, glm::radians(rotate), glm::vec3(0.0f,0.0f, 1.0f)); + model = glm::translate(model, glm::vec3(-0.5 * size.x ,-0.5 * size.y, 0.0f)); + + model = glm::scale(model, glm::vec3(size, 1.0f)); + + this->shader.SetMatrix4("model", model); + this->shader.SetVector3f("spriteColor", color); + + glActiveTexture(GL_TEXTURE0); + texture.Bind(); + + glBindVertexArray(this->quadVAO); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); +} \ No newline at end of file diff --git a/src/spriterenderer.h b/src/spriterenderer.h new file mode 100644 index 0000000..5324189 --- /dev/null +++ b/src/spriterenderer.h @@ -0,0 +1,28 @@ +#pragma once +#include + +#include "glm/glm.hpp" +#include "shader.h" +#include "texture2d.h" + +class SpriteRenderer +{ + public: + SpriteRenderer(const Shader& shader); + ~SpriteRenderer(); + + void DrawSprite( + const Texture2D& texture, + glm::vec2 position, + glm::vec2 size = glm::vec2(10.0f, 10.0f), + float rotate = 0.0f, + glm::vec3 color = glm::vec3(1.0f) + ); + + private: + Shader shader; + unsigned int quadVAO; + + void initRenderData(); + +}; \ No newline at end of file diff --git a/textures/awesomeface.png b/textures/awesomeface.png new file mode 100644 index 0000000..592dd09 --- /dev/null +++ b/textures/awesomeface.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dc155999348fd0bdf8add6ffee11feb853dd2fcf556a97804a38301bd0bdb13 +size 59277