blob: d47672ef321b3c2c6075c691601fb56900021782 (
plain)
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
99
100
|
/* ----------------------------------------------------------------------------
* spritebatch.hpp
*
* Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License
* See file LICENSE for more details
* ----------------------------------------------------------------------------
*/
#ifndef YAGE_SPRITE_BATCH_HPP
#define YAGE_SPRITE_BATCH_HPP
#include "vertex.hpp"
#include <GL/glew.h>
#include <glm/glm.hpp>
#include <vector>
namespace yage {
class SpriteBatch;
/** Glyph with information of the texture.
*/
class Glyph {
private:
GLuint texture_;
float depth_;
Vertex top_left_;
Vertex top_right_;
Vertex bottom_right_;
Vertex bottom_left_;
public:
Glyph(GLuint texture, float depth, const Vertex& top_left,
const Vertex& top_right, const Vertex& bottom_right,
const Vertex& bottom_left);
GLuint texture() const { return texture_; }
float depth() const { return depth_; }
Vertex top_left() const { return top_left_; }
Vertex top_right() const { return top_right_; }
Vertex bottom_right() const { return bottom_right_; }
Vertex bottom_left() const { return bottom_left_; }
};
class RenderBatch {
friend SpriteBatch;
private:
GLsizei num_vertices_;
GLint offset_;
GLuint texture_;
public:
RenderBatch(GLint offset, GLsizei num_vertices, GLuint texture);
GLint offset() const { return offset_; }
GLsizei num_vertices() const { return num_vertices_; }
GLuint texture() const { return texture_; }
};
class SpriteBatch {
public:
static const int NUM_VERTICES = 6;
private:
GLuint vbo_ = 0;
GLuint vao_ = 0;
std::vector<Glyph> glyphs_;
std::vector<Glyph*> glyph_ptrs_;
std::vector<RenderBatch> render_batches_;
public:
SpriteBatch();
SpriteBatch(const SpriteBatch&) = delete;
SpriteBatch(SpriteBatch&&) = delete;
~SpriteBatch();
SpriteBatch& operator=(const SpriteBatch&) = delete;
SpriteBatch& operator=(SpriteBatch&&) = delete;
// initialize vaos and vbos
void init();
void begin();
void end();
// adds a sprite to the sprite batch to be rendered later
void draw(const glm::vec4& destination_rect, const glm::vec4& uv_rect,
GLuint texture, const Color& color, float depth);
// render the batch
void render();
private:
void createVertexArray();
void createRenderBatches();
void sortGlyphs();
};
} // namespace yage
#endif
|