36 glm::mat3 m_Transform{ 0.0f };
37 glm::vec2 m_Size{ 0.0f };
39 Texture2D* m_Texture{
nullptr };
40 glm::vec4 m_UVs{ 0.0f };
41 glm::vec4 m_TintColor{ 0.0f };
43 QuadInstance() =
default;
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) {}
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 };
61 TextInstance() =
default;
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) {}
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) {}
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);
126 static void SubmitColoredQuad(
const DrawSpace space,
const glm::vec2 position,
const glm::vec2 halfSize,
const glm::vec3& color);
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);
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);
204 static void Shutdown();
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 };
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) {}
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 };
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) {}
232 struct RendererData {
234 static constexpr uint32_t MaxInstanceCount{ 6144 };
235 static constexpr uint32_t MaxCharInstanceCount{ 16384 };
237 Texture2D* CurrentTexture{
nullptr};
238 VertexArray* CurrentVertexArray{
nullptr};
239 VertexBuffer* CurrentVertexBuffer{
nullptr};
240 IndexBuffer* CurrentIndexBuffer{
nullptr};
241 ShaderProgram* CurrentShader{
nullptr};
246 std::shared_ptr<Texture2D> WhiteTexture;
247 Texture2D* NecessaryTexture{
nullptr};
249 glm::mat4 CurrentViewProjectionMatrix{ 1.0f };
250 glm::mat4 WorldSpaceViewProjectionMatrix{ 1.0f };
251 glm::mat4 ScreenSpaceViewProjectionMatrix{ 1.0f };
255 std::shared_ptr<VertexArray> QuadInstanceVertexArray;
256 std::shared_ptr<VertexBuffer> QuadInstanceVertexBuffer;
257 std::shared_ptr<IndexBuffer> QuadInstanceIndexBuffer;
258 std::shared_ptr<ShaderProgram> QuadInstanceShader;
260 uint32_t QuadInstanceCount{ 0 };
261 Quad* QuadInstanceBufferBase{
nullptr};
262 Quad* QuadInstanceBufferPtr{
nullptr};
264 static constexpr uint32_t WorldSpaceTransparentQuadQueueInitialSize{ 1024 };
265 static constexpr uint32_t WorldSpaceOpaqueQuadQueueInitialSize{ 6144 };
266 std::vector<QuadInstance> WorldSpaceTransparentQuadQueue;
267 std::vector<QuadInstance> WorldSpaceOpaqueQuadQueue;
269 static constexpr uint32_t ScreenSpaceTransparentQuadQueueInitialSize{ 128 };
270 static constexpr uint32_t ScreenSpaceOpaqueQuadQueueInitialSize{ 128 };
271 std::vector<QuadInstance> ScreenSpaceTransparentQuadQueue;
272 std::vector<QuadInstance> ScreenSpaceOpaqueQuadQueue;
276 std::shared_ptr<VertexArray> CharInstanceVertexArray;
277 std::shared_ptr<VertexBuffer> CharInstanceVertexBuffer;
278 std::shared_ptr<IndexBuffer> CharInstanceIndexBuffer;
279 std::shared_ptr<ShaderProgram> CharInstanceShader;
281 uint32_t CharInstanceCount{ 0 };
282 Char* CharInstanceBufferBase{
nullptr };
283 Char* CharInstanceBufferPtr{
nullptr };
285 static constexpr uint32_t WorldSpaceTransparentTextQueueInitialSize{ 96 };
286 std::vector<TextInstance> WorldSpaceTransparentTextQueue;
288 static constexpr uint32_t ScreenSpaceTransparentTextQueueInitialSize{ 96 };
289 std::vector<TextInstance> ScreenSpaceTransparentTextQueue;
292 enum TransparentQueueTypes : uint8_t {
299 using ElementVariantPtr = std::variant<const QuadInstance*, const TextInstance*>;
302 ElementVariantPtr m_ElementVariant;
304 TransparentQueueTypes m_QueueType;
306 bool operator>(
const ElementView& other)
const {
307 return m_Depth > other.m_Depth;
311 static RendererData* s_Data;
313 static void FlushRenderQueues();
315 static void BeginQuadInstancedSet();
316 static void EndQuadInstancedSet();
318 static void BeginCharInstancedSet();
319 static void EndCharInstancedSet(Texture2D* atlas,
const glm::mat3& modelMatrix);
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);
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);
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);
327 static bool BeginWorldSpacePass();
329 static bool BeginScreenSpacePass();
331 static void DrawQuadInstanced(
const QuadInstance& quad);
333 static void DrawTextInstanced(
const TextInstance& text);
335 static void StartNewQuadInstancedSet();
337 static void FlushOpaqueQueues();
339 static void FlushTransparentQueues();
341 static void FlushInstancedQuads();
343 static void FlushInstancedChars(Texture2D* atlas,
const glm::mat3& modelMatrix);