aboutsummaryrefslogtreecommitdiffstats
path: root/yage/render/spritebatch.h
blob: abefa93dae5666dfafeef0b1773f37936a36bbd3 (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
/** ---------------------------------------------------------------------------
 * @file: spritebatch.h
 *
 * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com>
 * MIT License, see LICENSE file for more details.
 * ----------------------------------------------------------------------------
 */

#pragma once

#include "../data/vertex.h"

#include <glad/glad.h>
#include <glm/glm.hpp>

#include <vector>

namespace yage
{

namespace details
{

struct RenderBatch {
    GLint offset;
    GLsizei num_vertices;
    GLuint texture;

    RenderBatch(GLint offset_i, GLsizei num_vertices_i, GLuint texture_i)
        : offset(offset_i), num_vertices(num_vertices_i), texture(texture_i)
    {
    }
};

/** Glyph with information of the texture.
 */
struct Glyph {
    GLuint texture;
    float depth;
    Vertex top_left;
    Vertex top_right;
    Vertex bottom_right;
    Vertex bottom_left;

    Glyph(GLuint texture_i, float depth_i, const Vertex &top_left_i,
          const Vertex &top_right_i, const Vertex &bottom_right_i,
          const Vertex &bottom_left_i)
        : texture(texture_i), depth(depth_i), top_left(top_left_i),
          top_right(top_right_i), bottom_right(bottom_right_i),
          bottom_left(bottom_left_i)
    {
    }
};

} // namespace details

class SpriteBatch
{
public:
    static const int NUM_VERTICES = 6;

private:
    GLuint vao_;
    GLuint vbo_;
    std::vector<details::Glyph> glyphs_;
    std::vector<details::Glyph *> glyph_ptrs_;
    std::vector<details::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 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 Colour &colour, float depth);
    // render the batch
    void render();

private:
    void createRenderBatches();
    void sortGlyphs();
};

} // namespace yage