/****************************************************************************** * 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 #include namespace lunarium { class OrthographicCamera; class Renderer2D { public: struct FrameStats { 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 void DrawQuad(Rectangle quad, Color color, Texture* texture = nullptr, float angle = 0.0f); void DrawQuads(Rectangle* quads, u32 num_quads, Color* pColors); void DrawSprite(Texture& image, glm::vec2 position, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float angle = 0); void DrawSprite(Texture& image, Rectangle source, Rectangle destination, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float angle = 0); void DrawString(const char* string, Rectangle boundingArea, Color color = {1.0f, 1.0f, 1.0f, 1.0f}, float scale = 1.0f, int font = 0); private: friend class RenderContext; OpRes Initialize(); void Shutdown(); void Flush(); private: Renderer2D(); Renderer2D(const Renderer2D&) = delete; Renderer2D(const Renderer2D&&) = delete; Renderer2D operator=(const Renderer2D&) = delete; private: // data struct QuadData { int mNumQuads = 0; const int MaxQuads = 10000; const int MaxVertices = MaxQuads * 4; const int MaxIndices = MaxQuads * 6; const int TextureSlots = 32; // const glm::vec4 vert_pos[4] = { // { -0.5f, 0.5f, 0.0f, 1.0f }, // TOP LEFT // { 0.5f, 0.5f, 0.0f, 1.0f }, // TOP RIGHT // { 0.5f, -0.5f, 0.0f, 1.0f }, // BOTTOM RIGHT // { -0.5f, -0.5f, 0.0f, 1.0f } // BOTTOM LEFT // }; 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, 1.0f }, { 1.0f, 1.0f }, { 1.0f, 0.0f }, { 0.0f, 0.0f }, }; struct Vertex { glm::vec3 pos; glm::vec2 tex_coord; glm::vec4 color; int tex_slot; glm::vec3 translation; float angle; glm::vec3 scale; }; //const u32 indices[6] = { 0, 1, 2, 0, 2, 3 }; const u32 indices[6] = { 0, 1, 2, 2, 3, 0 }; Vertex* mRawVertexBuffer; int mRawBufferIndex; BufferLayout mBufferLayout; VertexBuffer* mVertexBuffer; //IndexBuffer* mIndexBuffer; Shader* mQuadShader; } mQuadData; FrameStats mFrameStats; OrthographicCamera* mpCamera; std::vector mLoadedTextures; Texture* mpDebugTexture; Color mClearColor; /// DEBUG STUFF u32 mTVAO; u32 mTVBO; }; } #endif // LUNARIUM_RENDERER_2D_H_