diff options
Diffstat (limited to 'in_practice/breakout/sprite.c')
-rw-r--r-- | in_practice/breakout/sprite.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/in_practice/breakout/sprite.c b/in_practice/breakout/sprite.c new file mode 100644 index 0000000..07a357f --- /dev/null +++ b/in_practice/breakout/sprite.c @@ -0,0 +1,48 @@ +#include "sprite.h" +#include "shader.h" + +sprite_renderer_t init_renderer(u32 shader) +{ + sprite_renderer_t renderer = {0}; + renderer.shader = shader; + f32 vertices[] = { + 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + + 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f + }; + u32 vao, vbo; + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glBindVertexArray(vao); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 4, GL_FLOAT, 0, 4 * sizeof(f32), 0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + renderer.vao = vao; + return renderer; +} + +void render_sprite(sprite_renderer_t renderer, u32 texture, v2 pos, v2 size, f32 rotate, v3 color) +{ + glUseProgram(renderer.shader); + mat model = mat_identity; + model = scale_mat(model, (v3){size.x, size.y, 0.0f}); + model = translate_mat(model, (v3){-0.5f * size.x, -0.5f * size.y, 0.0f}); + model = rotate_mat(model, (v3){0.0f, 0.0f, rotate}); + model = translate_mat(model, (v3){0.5f * size.x, 0.5f * size.y, 0.0f}); + model = translate_mat(model, (v3){pos.x, pos.y, 0.0f}); + uniform_mat(renderer.shader, "model", model); + uniform_v3(renderer.shader, "color", color); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture); + glBindVertexArray(renderer.vao); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + glUseProgram(0); +} |