summaryrefslogtreecommitdiff
path: root/in_practice/breakout/sprite.c
diff options
context:
space:
mode:
Diffstat (limited to 'in_practice/breakout/sprite.c')
-rw-r--r--in_practice/breakout/sprite.c48
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);
+}