Ember
A C++ 20 'game engine' built with SDL3 with wide platform support.
ember_gl.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "core/ember_core.h"
4 
5 // TODO: get this based on device?
6 constexpr int MAX_QUADS = 10000;
7 constexpr int MAX_VERTICES = MAX_QUADS * 4;
8 constexpr int MAX_INDICES = MAX_QUADS * 6;
9 
10 /*
11  * DESKTOP - 32
12  * WEBGL - 16
13  * ANDROID - 32
14  * IOS - 32
15  */
16 
17 constexpr int MAX_TEXTURE_SLOTS = 16;
18 
19 /*
20  @brief Opengl Renderer implementation
21  - Opengl 3.3
22  - Opengl ES 3.0
23 */
24 class OpenglRenderer final : public Renderer {
25 public:
26  OpenglRenderer() = default;
27 
28  OpenglShader* GetDefaultShader() override;
29 
30  OpenglShader* GetTextShader() override;
31 
32  void Initialize() override;
33 
34  void Flush() override;
35 
36  void FlushText() override;
37 
38  void Resize(int view_width, int view_height) override;
39 
40  void SetContext(const void* ctx) override;
41 
42  void* GetContext() override;
43 
44  void Destroy() override;
45 
46  Texture LoadTexture(const std::string& file_path) override;
47 
48  Font LoadFont(const std::string& file_path, int font_size) override;
49 
50  void UnloadFont(const Font& font) override;
51 
52  void UnloadTexture(const Texture& texture) override;
53 
54  void ClearBackground(const Color& color) override;
55 
56  void BeginDrawing(const glm::mat4& view_projection = 0) override;
57 
58  void EndDrawing() override;
59 
60  void DrawText(const Font& font, const std::string& text, const Transform2D& transform, Color color, float font_size,
61  const ShaderEffect& shader_effect = {}, float kerning = 0.0f) override;
62 
63  void DrawTexture(const Texture& texture, const Transform2D& transform, glm::vec2 size,
64  const Color& color = {255, 255, 255, 255}) override;
65 
66  void DrawTextureEx(const Texture& texture, const ember::Rectangle& source, const ember::Rectangle& dest,
67  glm::vec2 origin, float rotation,float zIndex = 0.0f, const Color& color = {255, 255, 255, 255} ) override;
68 
69  void DrawLine(glm::vec3 start, glm::vec3 end, const Color& color, float thickness) override;
70 
71  void DrawRect(const Transform2D& transform, glm::vec2 size, const Color& color, float thickness) override;
72 
73  void DrawRectFilled(const Transform2D& transform, glm::vec2 size, const Color& color, float thickness) override;
74 
75  void DrawTriangle(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, const Color& color) override;
76 
77  void DrawTriangleFilled(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, const Color& color) override;
78 
79  void DrawCircle(glm::vec3 position, float radius, const Color& color, int segments = 32) override;
80 
81  void DrawCircleFilled(glm::vec3 position, float radius, const Color& color, int segments = 32) override;
82 
83  void BeginMode2D(const Camera2D& camera) override;
84 
85  void EndMode2D() override;
86 
87  void BeginCanvas() override;
88 
89  void EndCanvas() override;
90 
93 
94 private:
95 
96 
97  float BindTexture(Uint32 slot = 0) override ;
98 
99  void Submit(const Transform2D& transform, glm::vec2 size, glm::vec4 color, Uint32 slot = UINT32_MAX) override;
100 
101  glm::mat4 Projection;
102 
103  GLuint _textVAO = 0, _textVBO = 0, _textEBO =0;
104  Vertex* _textBuffer = nullptr;
105  int _textQuadCount = 0;
106  int _textIndexCount = 0;
107  unsigned int _currentFontTextureID = 0;
108 
109 
110  GLuint VAO = 0, VBO = 0, EBO = 0;
111  Vertex* _buffer = nullptr;
112 
113  // OPENGL/ES HACK FIX
114  Uint32 _textureArrayBuffer = 0;
115 
116  std::array<unsigned int, MAX_TEXTURE_SLOTS> _textures = std::array<unsigned int, MAX_TEXTURE_SLOTS>();
117  int _textureCount = 0;
118  int _quadCount = 0;
119  int _indexCount = 0;
120 
121 
122  SDL_GLContext context = nullptr;
123 };
Definition: ember_gl.h:24
void Destroy() override
Definition: ember_gl.cpp:123
void EndDrawing() override
End of the drawing procedure (swap buffers)
Definition: ember_gl.cpp:225
void EndCanvas() override
End Canvas Procedure.
Definition: ember_gl.cpp:720
void DrawTextureEx(const Texture &texture, const ember::Rectangle &source, const ember::Rectangle &dest, glm::vec2 origin, float rotation, float zIndex=0.0f, const Color &color={255, 255, 255, 255}) override
Draw Texture quad extended.
Definition: ember_gl.cpp:536
void DrawTriangle(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, const Color &color) override
Definition: ember_gl.cpp:624
void DrawTexture(const Texture &texture, const Transform2D &transform, glm::vec2 size, const Color &color={255, 255, 255, 255}) override
Draw Texture quad at given Rectangle source.
Definition: ember_gl.cpp:523
void FlushText() override
Definition: ember_gl.cpp:201
void BeginCanvas() override
Begin Canvas Procedure.
Definition: ember_gl.cpp:688
void UnloadTexture(const Texture &texture) override
Unload the Texture from GPU (cleanup)
Definition: ember_gl.cpp:824
void Flush() override
Definition: ember_gl.cpp:789
Texture LoadTexture(const std::string &file_path) override
Load a texture on GPU given a file path.
Definition: ember_gl.cpp:237
void SetContext(const void *ctx) override
Definition: ember_gl.cpp:115
void DrawText(const Font &font, const std::string &text, const Transform2D &transform, Color color, float font_size, const ShaderEffect &shader_effect={}, float kerning=0.0f) override
Draw glyphs given a Loaded Font and text.
Definition: ember_gl.cpp:457
OpenglRenderer()=default
void DrawLine(glm::vec3 start, glm::vec3 end, const Color &color, float thickness) override
Draw Lines between two points.
Definition: ember_gl.cpp:586
OpenglShader * default_shader
Definition: ember_gl.h:91
OpenglShader * GetTextShader() override
Definition: ember_gl.cpp:10
void DrawRect(const Transform2D &transform, glm::vec2 size, const Color &color, float thickness) override
Draw rectangle.
Definition: ember_gl.cpp:600
void BeginDrawing(const glm::mat4 &view_projection=0) override
Starting of the drawing procedure.
Definition: ember_gl.cpp:159
void DrawCircleFilled(glm::vec3 position, float radius, const Color &color, int segments=32) override
Definition: ember_gl.cpp:665
void * GetContext() override
Definition: ember_gl.cpp:119
void DrawRectFilled(const Transform2D &transform, glm::vec2 size, const Color &color, float thickness) override
Draw rectangle filled.
Definition: ember_gl.cpp:620
Font LoadFont(const std::string &file_path, int font_size) override
Load a TTF font on GPU given a file path.
Definition: ember_gl.cpp:335
void DrawCircle(glm::vec3 position, float radius, const Color &color, int segments=32) override
Definition: ember_gl.cpp:652
void BeginMode2D(const Camera2D &camera) override
Begin 2D mode.
Definition: ember_gl.cpp:683
OpenglShader * GetDefaultShader() override
Definition: ember_gl.cpp:6
void DrawTriangleFilled(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2, const Color &color) override
Definition: ember_gl.cpp:632
void Initialize() override
Definition: ember_gl.cpp:14
void ClearBackground(const Color &color) override
Window background color.
Definition: ember_gl.cpp:151
OpenglShader * text_shader
Definition: ember_gl.h:92
void EndMode2D() override
End 2D mode.
Definition: ember_gl.cpp:685
void Resize(int view_width, int view_height) override
Definition: ember_gl.cpp:109
void UnloadFont(const Font &font) override
Unload the Font from CPU/GPU (cleanup)
Definition: ember_gl.cpp:819
Opengl Shader implementation.
Definition: shader_gl.h:19
Renderer struct.
Definition: ember_core.h:28
Definition: shader.h:5
constexpr int MAX_INDICES
Definition: ember_gl.h:8
constexpr int MAX_QUADS
Definition: ember_gl.h:6
constexpr int MAX_TEXTURE_SLOTS
Definition: ember_gl.h:17
constexpr int MAX_VERTICES
Definition: ember_gl.h:7
Camera2D component.
Definition: camera.h:14
Definition: engine_structs.h:34
Definition: engine_structs.h:54
Definition: engine_structs.h:12
Definition: transform.h:6
Vertex struct.
Definition: mesh.h:9
Definition: engine_structs.h:24