-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSpriteRenderer.cpp
More file actions
98 lines (81 loc) · 2.83 KB
/
Copy pathSpriteRenderer.cpp
File metadata and controls
98 lines (81 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "SpriteRenderer.h"
// Vertices coordinates
GLfloat vertices[] =
{ // COORDINATES / TexCoord //
-1.f, -1.f, 0.0f, 1.0f, // Lower left corner
-1.f, 1.f, 0.0f, 0.0f, // Upper left corner
1.f, 1.f, 1.0f, 0.0f, // Upper right corner
1.f, -1.f, 1.0f, 1.0f // Lower right corner
};
// Indices for vertices order
GLuint indices[] =
{
0, 2, 1, // Upper triangle
0, 3, 2 // Lower triangle
};
SpriteRenderer::SpriteRenderer()
{
Init();
}
void SpriteRenderer::Init()
{
shaderDefault = std::make_shared<Shader>("default.vert", "default.frag");
shaderInverted = std::make_shared<Shader>("default.vert", "inverted.frag");
shaderRepeating = std::make_shared<Shader>("default.vert", "repeating.frag");
shaderMemeory = std::make_shared<Shader>("memeory.vert", "memeory.frag");
// Generates Vertex Array Object and binds it
vao = std::make_shared<VAO>();
vao->Bind();
// Generates Vertex Buffer Object and links it to vertices
vbo = std::make_shared<VBO>(vertices, sizeof(vertices));
// Generates Element Buffer Object and links it to indices
ebo = std::make_shared<EBO>(indices, sizeof(indices));
// Links VBO to VAO
vao->LinkAttrib(*vbo, 0, 2, GL_FLOAT, 4 * sizeof(float), (void*)0);
vao->LinkAttrib(*vbo, 1, 2, GL_FLOAT, 4 * sizeof(float), (void*)(2 * sizeof(float)));
// Unbind all to prevent accidentally modifying them
vao->Unbind();
vbo->Unbind();
ebo->Unbind();
}
void SpriteRenderer::DrawSprite(Texture& texture, glm::mat4 proj, glm::vec2 position,
glm::vec2 size, float rotate, glm::vec3 color, string shaderName)
{
std::shared_ptr<Shader> shader = shaderDefault;
if (shaderName == "inverted") {
shader = shaderInverted;
}
if (shaderName == "repeating") {
shader = shaderRepeating;
}
if (shaderName == "memeory") {
shader = shaderMemeory;
}
// prepare transformations
shader->Activate();
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.5f * size.x, -0.5f * size.y, 0.0f));
model = glm::scale(model, glm::vec3(size/2.0f, 1.0f));
shader->SetMatrix4("model", model);
shader->SetMatrix4("proj", proj);
shader->SetVector3f("tint", color);
shader->SetFloat("t", t);
glActiveTexture(GL_TEXTURE0);
texture.Bind();
vao->Bind();
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
vao->Unbind();
}
void SpriteRenderer::SetTime(float time) {
t = time;
}
void SpriteRenderer::Delete() {
vao->Delete();
vbo->Delete();
ebo->Delete();
shaderDefault->Delete();
shaderInverted->Delete();
}