// IAEngine: 2D Game Engine by IA // Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #pragma once #include #include namespace ia::iae { class Renderer { public: STATIC CONSTEXPR FLOAT32 MIN_DEPTH = -2097152.0f; STATIC CONSTEXPR FLOAT32 MAX_DEPTH = 2097152.0f; struct Geometry { INT32 IndexCount{}; SDL_GPUBuffer *IndexBuffer; SDL_GPUBuffer *VertexBuffer; }; struct State { BOOL FlippedH{false}; BOOL FlippedV{false}; BOOL CameraRelative{true}; BOOL YSortingEnabled{false}; Color ColorOverlay{}; Vec2 TextureOffset{0.0f, 0.0f}; SDL_GPUTexture* ActiveTexture{nullptr}; Mat4 ModelMatrix{1.0f}; FLOAT32 PositionY{}; }; struct DrawEntry { UINT8 Layer{}; UINT16 SortIndex{}; State DrawState{}; Geometry* GeometryHandle{}; }; public: STATIC VOID Initialize(); STATIC VOID Terminate(); STATIC VOID BeginFrame(); STATIC VOID EndFrame(); STATIC VOID WaitForGPUIdle(); STATIC VOID OnScreenResize(IN INT32 newWidth, IN INT32 newHeight); public: STATIC Geometry* CreateGeometry(IN CONST Vector &vertices, IN CONST Vector &indices); STATIC VOID DestroyGeometry(IN Geometry* handle); STATIC VOID DrawGeometry(IN Geometry* handle, IN UINT8 layer, IN UINT16 sortIndex); STATIC SDL_GPUTextureFormat GetRenderTargetFormat(); STATIC SDL_GPUDevice *GetDevice() { return s_gpuDevice; } private: STATIC State s_state; STATIC INT32 s_screenWidth; STATIC INT32 s_screenHeight; STATIC SDL_GPUDevice *s_gpuDevice; STATIC SDL_GPUTexture *s_renderTargetSceneColor; STATIC SDL_GPUTexture *s_renderTargetDebugDrawColor; STATIC Pipeline* s_geometryPipeline; STATIC Pipeline* s_postprocessPipeline; STATIC Geometry* s_quadGeometry; STATIC Vector s_drawEntries; STATIC SDL_GPURenderPass* s_activeRenderPass; STATIC SDL_GPUCommandBuffer* s_activeCommandBuffer; STATIC SDL_GPUColorTargetInfo s_colorTargetInfo; STATIC class CameraComponent *s_activeCamera; STATIC SDL_Rect s_scissor; STATIC SDL_GPUViewport s_activeViewport; STATIC Vec2 s_sceneScaleFactor; friend class Engine; }; } // namespace ia::iae