CoriEngine
Loading...
Searching...
No Matches
Renderer2D.hpp
Go to the documentation of this file.
1#pragma once
2#include "Buffers.hpp"
3#include "VertexArray.hpp"
4#include "ShaderProgram.hpp"
5#include "Texture.hpp"
6#include "CameraComponent.hpp"
7#include "API.hpp"
9#include "Font.hpp"
10#include "Utility/UTF.hpp"
11
12#ifndef CORI_SPACES_PER_TAB
13 #define CORI_SPACES_PER_TAB 4
14#endif
15
16namespace Cori {
17 namespace Graphics {
24 class Renderer2D {
25 public:
29 enum TextAlignment : uint8_t {
33 };
34 private:
35 struct QuadInstance {
36 glm::mat3 m_Transform{ 0.0f };
37 glm::vec2 m_Size{ 0.0f };
38 uint8_t m_Depth{ 0 };
39 Texture2D* m_Texture{ nullptr };
40 glm::vec4 m_UVs{ 0.0f };
41 glm::vec4 m_TintColor{ 0.0f };
42
43 QuadInstance() = default;
44
45 QuadInstance(const glm::mat3& transform, const glm::vec2 size, const glm::vec4& tintColor, Texture2D* texture, const glm::vec4& uvs, const uint8_t layer) :
46 m_Transform(transform), m_Size(size), m_Depth(layer), m_Texture(texture), m_UVs(uvs), m_TintColor(tintColor) {}
47 };
48
49 struct TextInstance {
50 glm::mat3 m_Transform{ 0.0f };
51 float m_FontSize{ 0.0f };
52 std::u32string m_Text;
53 Font* m_Font{ nullptr };
54 glm::vec4 m_Color{ 0.0f };
55 float m_LineSpacing{ 0.0f };
56 float m_Kerning{ 0.0f };
57 float m_LimitX{ -1.0f };
58 uint8_t m_Depth{ 0 };
59 TextAlignment m_Alignment{};
60
61 TextInstance() = default;
62
63 TextInstance(const TextAlignment alignment, const glm::mat3& transform, const float fontSize,const std::u32string_view& text, const glm::vec4& color, Font* font, const uint8_t depth, const float limitX, const float lineSpacing, const float kerning) :
64 m_Transform(transform), m_FontSize(fontSize), m_Text(text), m_Font(font), m_Color(color), m_LineSpacing(lineSpacing), m_Kerning(kerning), m_LimitX(limitX), m_Depth(depth), m_Alignment(alignment) {}
65
66 TextInstance(const TextAlignment alignment, const glm::mat3& transform, const float fontSize,const std::string_view& text, const glm::vec4& color, Font* font, const uint8_t depth, const float limitX, const float lineSpacing, const float kerning) :
67 m_Transform(transform), m_FontSize(fontSize), m_Text(Utility::Utf8ToUtf32(text)), m_Font(font), m_Color(color), m_LineSpacing(lineSpacing), m_Kerning(kerning), m_LimitX(limitX), m_Depth(depth), m_Alignment(alignment) {}
68 };
69
70 public:
71 struct Statistics {
72 uint32_t DrawCalls{ 0 };
73 uint32_t QuadCount{ 0 };
74 uint32_t CharCount{ 0 };
75 };
76
88
96
97
113 static void SubmitQuad(const DrawSpace space, const ObjectTransparency transparencyMode,
114 const glm::mat3& transform, const glm::vec2 halfSize, const glm::vec4& tintColor,
115 Texture2D* texture, const UVs& uvs, const uint8_t depth, const bool flipX,
116 const bool flipY, const bool flatColored);
117
126 static void SubmitColoredQuad(const DrawSpace space, const glm::vec2 position, const glm::vec2 halfSize, const glm::vec3& color);
127
134 static void SubmitAABB(const Utility::AABB& aabb, const float lineThickness, const glm::vec3& color);
135
155 static void SubmitText(const DrawSpace space, const TextAlignment alignment, const glm::mat3& transform,
156 const float fontSize, const std::u32string_view& text, const glm::vec4& color,
157 Font* font, const uint8_t depth, const float limitX, const float lineSpacing,
158 const float kerning);
159
179 static void SubmitText(const DrawSpace space, const TextAlignment alignment, const glm::mat3& transform,
180 const float fontSize, const std::string_view& text, const glm::vec4& color,
181 Font* font, const uint8_t depth, const float limitX, const float lineSpacing,
182 const float kerning);
183
188 static Statistics GetStatistics();
189
190 // void DrawCircle(...);
191 // void DrawLine(...);
192 static void StartFrame();
193 static void EndFrame();
194
195 static void BeginScene(const World::Components::Scene::Camera& camera);
196 static void EndScene();
197
198 private:
199 friend World::Scene;
200 friend Internal::API;
201
202 static void SubmitScene(World::Scene* scene);
203 static void Init();
204 static void Shutdown();
205
206 struct Quad {
207 glm::mat3 m_Transform{ 0.0f };
208 glm::vec4 m_TexturePosition{ 0.0f };
209 glm::vec2 m_Size{ 0.0f };
210 glm::vec4 m_TintColor{ 0.0f };
211 float m_Layer{ 0 };
212
213 Quad() = default;
214
215 Quad(const glm::mat3& transform, const glm::vec2& size, const glm::vec4& tintColor, const glm::vec4& uvs, const float layer) :
216 m_Transform(transform), m_TexturePosition(uvs), m_Size(size), m_TintColor(tintColor), m_Layer(layer) {}
217 };
218
219 struct Char {
220 glm::mat3 m_Transform{ 0.0f };
221 glm::vec4 m_TexturePosition{ 0.0f };
222 glm::vec4 m_CharQuad{ 0.0f };
223 glm::vec4 m_Color{ 0.0f };
224 float m_Layer{ 0 };
225
226 Char() = default;
227
228 Char(const glm::mat3& transform, const glm::vec4& charQuad, const glm::vec4& color, const glm::vec4& uvs, const float layer) :
229 m_Transform(transform), m_TexturePosition(uvs), m_CharQuad(charQuad), m_Color(color), m_Layer(layer) {}
230 };
231
232 struct RendererData {
233 // generic
234 static constexpr uint32_t MaxInstanceCount{ 6144 };
235 static constexpr uint32_t MaxCharInstanceCount{ 16384 };
236
237 Texture2D* CurrentTexture{nullptr};
238 VertexArray* CurrentVertexArray{nullptr};
239 VertexBuffer* CurrentVertexBuffer{nullptr};
240 IndexBuffer* CurrentIndexBuffer{nullptr};
241 ShaderProgram* CurrentShader{nullptr};
242 DrawSpace CurrentDrawSpace{ UNSPECIFIED };
243
244 Statistics Stats;
245
246 std::shared_ptr<Texture2D> WhiteTexture;
247 Texture2D* NecessaryTexture{nullptr};
248
249 glm::mat4 CurrentViewProjectionMatrix{ 1.0f };
250 glm::mat4 WorldSpaceViewProjectionMatrix{ 1.0f };
251 glm::mat4 ScreenSpaceViewProjectionMatrix{ 1.0f };
252
253 // vvv quad specific
254
255 std::shared_ptr<VertexArray> QuadInstanceVertexArray;
256 std::shared_ptr<VertexBuffer> QuadInstanceVertexBuffer;
257 std::shared_ptr<IndexBuffer> QuadInstanceIndexBuffer;
258 std::shared_ptr<ShaderProgram> QuadInstanceShader;
259
260 uint32_t QuadInstanceCount{ 0 };
261 Quad* QuadInstanceBufferBase{nullptr};
262 Quad* QuadInstanceBufferPtr{nullptr};
263
264 static constexpr uint32_t WorldSpaceTransparentQuadQueueInitialSize{ 1024 };
265 static constexpr uint32_t WorldSpaceOpaqueQuadQueueInitialSize{ 6144 };
266 std::vector<QuadInstance> WorldSpaceTransparentQuadQueue;
267 std::vector<QuadInstance> WorldSpaceOpaqueQuadQueue;
268
269 static constexpr uint32_t ScreenSpaceTransparentQuadQueueInitialSize{ 128 };
270 static constexpr uint32_t ScreenSpaceOpaqueQuadQueueInitialSize{ 128 };
271 std::vector<QuadInstance> ScreenSpaceTransparentQuadQueue;
272 std::vector<QuadInstance> ScreenSpaceOpaqueQuadQueue;
273
274 // vvv text specific
275
276 std::shared_ptr<VertexArray> CharInstanceVertexArray;
277 std::shared_ptr<VertexBuffer> CharInstanceVertexBuffer;
278 std::shared_ptr<IndexBuffer> CharInstanceIndexBuffer;
279 std::shared_ptr<ShaderProgram> CharInstanceShader;
280
281 uint32_t CharInstanceCount{ 0 };
282 Char* CharInstanceBufferBase{ nullptr };
283 Char* CharInstanceBufferPtr{ nullptr };
284
285 static constexpr uint32_t WorldSpaceTransparentTextQueueInitialSize{ 96 };
286 std::vector<TextInstance> WorldSpaceTransparentTextQueue;
287
288 static constexpr uint32_t ScreenSpaceTransparentTextQueueInitialSize{ 96 };
289 std::vector<TextInstance> ScreenSpaceTransparentTextQueue;
290 };
291
292 enum TransparentQueueTypes : uint8_t {
293 WORLD_SPACE_QUAD,
294 SCREEN_SPACE_QUAD,
295 WORLD_SPACE_TEXT,
296 SCREEN_SPACE_TEXT
297 };
298
299 using ElementVariantPtr = std::variant<const QuadInstance*, const TextInstance*>;
300
301 struct ElementView {
302 ElementVariantPtr m_ElementVariant;
303 uint8_t m_Depth;
304 TransparentQueueTypes m_QueueType;
305
306 bool operator>(const ElementView& other) const {
307 return m_Depth > other.m_Depth;
308 }
309 };
310
311 static RendererData* s_Data;
312
313 static void FlushRenderQueues();
314
315 static void BeginQuadInstancedSet();
316 static void EndQuadInstancedSet();
317
318 static void BeginCharInstancedSet();
319 static void EndCharInstancedSet(Texture2D* atlas, const glm::mat3& modelMatrix);
320
321 static void SubmitQuadToQueue(std::vector<QuadInstance>& queue, const glm::mat3& transform, const glm::vec2 halfSize, const glm::vec4& tintColor, Texture2D* texture, const UVs& uvs, const uint8_t depth, const bool flipX, const bool flipY, const bool flatColored);
322
323 static void SubmitTextToQueue(std::vector<TextInstance>& queue, const TextAlignment alignment, const glm::mat3& transform, const float fontSize, const std::u32string_view& text, const glm::vec4& color, Font* font, const uint8_t depth, const float limitX, const float lineSpacing, const float kerning);
324
325 static void SubmitTextToQueue(std::vector<TextInstance>& queue, const TextAlignment alignment, const glm::mat3& transform, const float fontSize, const std::string_view& text, const glm::vec4& color, Font* font, const uint8_t depth, const float limitX, const float lineSpacing, const float kerning);
326
327 static bool BeginWorldSpacePass();
328
329 static bool BeginScreenSpacePass();
330
331 static void DrawQuadInstanced(const QuadInstance& quad);
332
333 static void DrawTextInstanced(const TextInstance& text);
334
335 static void StartNewQuadInstancedSet();
336
337 static void FlushOpaqueQueues();
338
339 static void FlushTransparentQueues();
340
341 static void FlushInstancedQuads();
342
343 static void FlushInstancedChars(Texture2D* atlas, const glm::mat3& modelMatrix);
344 };
345 }
346}
Font asset to be used when rendering text. Pretty expensive to create if not cached,...
Definition Font.hpp:15
The main engine renderer.
static void SubmitText(const DrawSpace space, const TextAlignment alignment, const glm::mat3 &transform, const float fontSize, const std::u32string_view &text, const glm::vec4 &color, Font *font, const uint8_t depth, const float limitX, const float lineSpacing, const float kerning)
Draws a UTF-32 fixed length encoded string.
DrawSpace
Defines where to draw the object, in what space.
static void SubmitColoredQuad(const DrawSpace space, const glm::vec2 position, const glm::vec2 halfSize, const glm::vec3 &color)
Convenience function mainly for debugging, draws a plain colored quad.
static Statistics GetStatistics()
Gives you the rendering stats of the last rendered frame.
static void SubmitAABB(const Utility::AABB &aabb, const float lineThickness, const glm::vec3 &color)
Draws the AABB, also a debug convenience function, always draws in world space.
static void SubmitQuad(const DrawSpace space, const ObjectTransparency transparencyMode, const glm::mat3 &transform, const glm::vec2 halfSize, const glm::vec4 &tintColor, Texture2D *texture, const UVs &uvs, const uint8_t depth, const bool flipX, const bool flipY, const bool flatColored)
Submits the quad to the render queue.
TextAlignment
Available text alignment options.
static void BeginScene(const World::Components::Scene::Camera &camera)
A regular 2D texture with 1 layer.
Definition Texture.hpp:99
A scene in a game world.
Definition Scene.hpp:20
std::u32string Utf8ToUtf32(const std::string_view &view)
Converts a UTF-8 variable length encoded string to a UTF-32 fixed length encoded string.
Definition UTF.hpp:11
Global engine namespace.
Axis-Aligned bounding box.
Definition AABB.hpp:11
A Scene context component with all the graphical camera data.