Files
UwU-Engine/UwURenderEngine/RenderEngine/UwURenderEngine.hpp
T
2026-07-11 19:06:48 +07:00

116 lines
3.7 KiB
C++

#pragma once
#include "RenderEngineBase.hpp"
#include "ModelManager.hpp"
#include <vector>
#include <memory>
#include <mutex>
#define GLM_FORCE_RADIANS
#include <glm/glm.hpp>
#include "UniformBuffer.hpp"
#include "VkObjects/DescriptorSetLayout.hpp"
#include "VkObjects/Device.hpp"
#include "VkObjects/Instance.hpp"
#include "VkObjects/PhysicalDevice.hpp"
#include "VkObjects/Pipeline.hpp"
#include "VkObjects/RenderPass.hpp"
#include "VkObjects/Surface.hpp"
#include "VkObjects/Swapchain.hpp"
class Camera;
class GPU_GarbageCollector;
#define GET_RENDER_ENGINE static_cast<UwURenderEngine*>(GetWorld()->GetGameInstance().GetCore().GetRenderEngine())
class UwURenderEngine final : public RenderEngineBase
{
struct UniformBufferObject {
glm::mat4 model;
glm::mat4 view;
glm::mat4 proj;
};
const std::vector<ModelManager::Vertex> vertices_ = {
{{-0.5f, -0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, -0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
{{0.5f, 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}},
{{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
{{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}}
};
const std::vector<uint16_t> indices_ = {
0, 1, 2, 2, 3, 0,
2, 1, 5, 5, 6, 2,
0, 3, 7, 7, 4, 0,
3, 2, 6, 6, 7, 3,
7, 6, 5, 5, 4, 7,
4, 5, 1, 1, 0, 4
};
const std::vector<const char*> deviceExtensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME
};
// Counting frame from the beginning
unsigned int current_frame_ = 0;
CoreInstance& core_;
std::shared_ptr<ModelManager> model_manager_;
std::shared_ptr<GPU_GarbageCollector> garbage_collector_;
std::weak_ptr<Camera> active_camera_;
std::mutex m_active_camera_;
VkObjects::Instance instance_;
VkObjects::Surface surface_;
VkObjects::PhysicalDevice physical_device_;
VkObjects::Device device_;
VkObjects::Swapchain swapchain_;
VkObjects::RenderPass render_pass_;
VkObjects::DescriptorSetLayout layout_binding_;
VkDescriptorPool descriptor_pool_ = VK_NULL_HANDLE;
std::vector<VkDescriptorSet> descriptor_sets_;
VkObjects::Pipeline pipeline_;
std::vector<VkFramebuffer> framebuffers_;
VkCommandPool command_pool_ = VK_NULL_HANDLE;
std::vector<VkCommandBuffer> command_buffers_;
VkBuffer vertex_buffer_ = VK_NULL_HANDLE;
VkDeviceMemory vertex_buffer_memory_ = VK_NULL_HANDLE;
VkBuffer index_buffer_ = VK_NULL_HANDLE;
VkDeviceMemory index_buffer_memory_ = VK_NULL_HANDLE;
std::vector<std::unique_ptr<UniformBuffer<UniformBufferObject>>> uniform_buffers_;
// Sync objects
std::vector<VkSemaphore> image_available_semaphores_, render_finished_semaphores_;
std::vector<VkFence> in_flight_fences_;
void create_uniform_buffers();
void create_descriptor_pool();
void update_descriptor_sets();
void create_framebuffers();
void create_command_pool();
void allocate_command_buffers();
void create_sync_objects();
void allocate_vertex_buffer();
void allocate_index_buffer();
void record_command_buffer(VkCommandBuffer command_buffer, uint32_t image_index) const;
void update_uniform_buffer(uint32_t current_frame) const;
void draw_frame();
public:
// Can throw the exception
explicit UwURenderEngine(CoreInstance& core);
~UwURenderEngine() override;
void start() override;
void stop_render() const override;
std::shared_ptr<ModelManager> GetModelManager() const { return model_manager_; }
void SetActiveCamera(const std::weak_ptr<Camera>& camera);
};