1
0
Fork 0
Univerxel/src/client/render/vk/Renderer.hpp

64 lines
1.9 KiB
C++

#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<Renderer*>(render::Renderer::Get()); }
void beginFrame() override;
std::function<buffer::params(glm::mat4)> beginWorldPass() override;
std::function<buffer::params(const std::vector<glm::mat4> &)> 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<PhysicalDeviceInfo> physicalInfo;
std::unique_ptr<SwapChain> swapChain;
std::unique_ptr<Pipeline> pipeline;
std::unique_ptr<CommandPool> commandPool;
size_t currentFrame = 0;
uint32_t currentImage = UINT32_MAX;
std::vector<VkSemaphore> imageAvailableSemaphores;
std::vector<VkSemaphore> renderFinishedSemaphores;
std::vector<VkFence> inFlightFences;
bool framebufferResized = false;
void recreateSwapChain();
void destroySwapChain();
};
}