/****************************************************************************** * File - renderer2D.h * Author - Joey Pollack * Date - 2022/07/13 (y/m/d) * Mod Date - 2022/07/13 (y/m/d) * Description - The main 2D render class ******************************************************************************/ #ifndef LUNARIUM_RENDERER_2D_H_ #define LUNARIUM_RENDERER_2D_H_ #include #include "render_common.h" #include #include "text_renderer.h" #include #include namespace lunarium { class OrthographicCamera; class Texture; class Renderer2D { public: struct FrameStats { int NumVerts = 0; int NumTris = 0; int DrawCalls = 0; }; Texture* GetDebugTexture(); void SetClearColor(Color color); Color GetClearColor(); void ResetFrameStats(); FrameStats GetFrameStats() const; void BeginDraw(OrthographicCamera* pCamera); void EndDraw(); // Draw methods /// sub_texture_area is the area of the texture to draw /// position is the top-left corner of the quad void DrawSprite(Texture* texture, glm::vec2 position, Rectangle sub_texture_area, Color color = Color::White(), float angle = 0.0f); /// sub_texture_area is the area of the texture to draw void DrawQuad(Rectangle quad, Color color, Texture* texture = nullptr, float angle = 0.0f, Rectangle sub_texture_area = Rectangle(-1, -1, -1, -1)); void DrawLine(glm::vec2 point_a, glm::vec2 point_b, Color color, float thickness = 1.0f, float angle = 0.0f); void DrawBox(Rectangle box, Color color, float thickness = 1.0f, float angle = 0.0f); void DrawEllipse(glm::vec2 center_point, glm::vec2 radii, Color color, bool filled = false, float thickness = 1.0f, float angle = 0.0f); void DrawString(const char* string, Rectangle bounding_box, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float scale = 1.0f, int font = -1); // DEBUG: Texture* GetTextDebugTexture(); private: friend class RenderContext; OpRes Initialize(); void Shutdown(); enum FlushMode { Quads = 0x01, Lines = 0x02, Ellipses = 0x04, All = 0xFF }; void Flush(int flush_mode = FlushMode::All); private: Renderer2D(); Renderer2D(const Renderer2D&) = delete; Renderer2D(const Renderer2D&&) = delete; Renderer2D operator=(const Renderer2D&) = delete; private: // Helpers OpRes InitQuadData(); OpRes InitLineData(); OpRes InitEllipseData(); void ResetDrawingData(); private: // data TextRenderer mTextAPI; int mDefaultFont; Color mClearColor; OrthographicCamera* mpCamera; FrameStats mFrameStats; ///////////////////////////////////////////////////////////////////// // QUAD DATA QUAD DATA ///////////////////////////////////////////////////////////////////// struct QuadData { bool MarkedForReset = false; int NumQuads = 0; const int MaxQuads = 10000; const int MaxVertices = MaxQuads * 4; const int MaxIndices = MaxQuads * 6; const int TextureSlots = 32; std::vector LoadedTextures; Texture* WhiteTexture; const glm::vec4 vert_pos[4] = { { -0.5f, -0.5f, 0.0f, 1.0f }, { 0.5f, -0.5f, 0.0f, 1.0f }, { 0.5f, 0.5f, 0.0f, 1.0f }, { -0.5f, 0.5f, 0.0f, 1.0f } }; const glm::vec2 vert_tex[4] = { { 0.0f, 0.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f }, { 0.0f, 1.0f }, }; struct Vertex { glm::vec3 pos; glm::vec2 tex_coord; glm::vec4 color; float tex_slot; glm::vec3 translation; float angle; glm::vec3 scale; float tex_is_grey_scale; // 0 or 1, this is mostly used for text rendering }; const u32 indices[6] = { 0, 1, 2, 2, 3, 0 }; Vertex* RawVertexBuffer; int RawBufferIndex; BufferLayout BufferLayout; VertexBuffer* VertexBuffer; Shader* QuadShader; Shader* WireFrameShader; } mQuadData; ///////////////////////////////////////////////////////////////////// // ELLIPSE DATA ELLIPSE DATA ///////////////////////////////////////////////////////////////////// struct EllipseData { bool MarkedForReset = false; int NumEllipses = 0; const int MaxVertices = 60000; struct Vertex { glm::vec2 pos; glm::vec4 color; }; Vertex* RawVertexBuffer; int RawBufferIndex; BufferLayout BufferLayout; VertexBuffer* VertexBuffer; Shader* Shader; } mEllipseData; ///////////////////////////////////////////////////////////////////// // LINE DATA LINE DATA ///////////////////////////////////////////////////////////////////// struct LineData { bool MarkedForReset = false; int NumLines = 0; const int MaxLines = 30000; const int MaxVertices = MaxLines * 2; float Thickness = 1.0f; struct Vertex { glm::vec2 pos; glm::vec4 color; }; Vertex* RawVertexBuffer; int RawBufferIndex; BufferLayout BufferLayout; VertexBuffer* VertexBuffer; Shader* Shader; } mLineData; /// DEBUG STUFF u32 mTVAO; u32 mTVBO; }; } #endif // LUNARIUM_RENDERER_2D_H_