#pragma once #include "../Renderer.hpp" #include "forward.hpp" namespace render::vk { class SwapChain; class Pipeline; class CommandPool; /// Vulkan rendering class Renderer final: public render::Renderer { public: virtual ~Renderer(); static bool Load(Window& window, const renderOptions& options); void loadUI(Window &) override; static _FORCE_INLINE_ Renderer *Get() { return static_cast(render::Renderer::Get()); } void beginFrame() override; std::function beginWorldPass() override; std::function &)> beginEntityPass() override; size_t drawIndicatorCube(glm::mat4 model) override; void endPass() override; void swapBuffer(Window&) override; void setClearColor(glm::vec4) override; void setCurvature(glm::vec4, float) override; /// Apply camera matrices void lookFrom(const Camera &) override; void reloadShaders(const passOptions &) override; void reloadTextures(const std::string &, float mipMapLOD, float anisotropy) override; void setResized() { framebufferResized = true; } private: Renderer(VkInstance, VkDevice, const PhysicalDeviceInfo &, const renderOptions &); renderOptions options; VkInstance instance; VkSurfaceKHR surface; VkDevice device; VkQueue graphicsQueue; VkQueue presentQueue; std::unique_ptr physicalInfo; std::unique_ptr swapChain; std::unique_ptr pipeline; std::unique_ptr commandPool; size_t currentFrame = 0; uint32_t currentImage = UINT32_MAX; std::vector imageAvailableSemaphores; std::vector renderFinishedSemaphores; std::vector inFlightFences; bool framebufferResized = false; void recreateSwapChain(); void destroySwapChain(); }; }