Program Listing for File renderer.hpp

Return to documentation for file (inexor/vulkan-renderer/renderer.hpp)

#pragma once

#include "inexor/vulkan-renderer/camera.hpp"
#include "inexor/vulkan-renderer/fps_counter.hpp"
#include "inexor/vulkan-renderer/imgui.hpp"
#include "inexor/vulkan-renderer/msaa_target.hpp"
#include "inexor/vulkan-renderer/octree_gpu_vertex.hpp"
#include "inexor/vulkan-renderer/time_step.hpp"
#include "inexor/vulkan-renderer/wrapper/instance.hpp"
#include "inexor/vulkan-renderer/wrapper/uniform_buffer.hpp"
#include "inexor/vulkan-renderer/wrapper/window.hpp"
#include "inexor/vulkan-renderer/wrapper/window_surface.hpp"

namespace inexor::vulkan_renderer {

class VulkanRenderer {
protected:
    std::vector<VkPipelineShaderStageCreateInfo> m_shader_stages;

    VkDebugReportCallbackEXT m_debug_report_callback{VK_NULL_HANDLE};

    bool m_debug_report_callback_initialised{false};

    TimeStep m_time_step;

    std::uint32_t m_window_width{0};
    std::uint32_t m_window_height{0};
    wrapper::Window::Mode m_window_mode{wrapper::Window::Mode::WINDOWED};

    std::string m_window_title;

    FPSCounter m_fps_counter;

    bool m_vsync_enabled{false};

    std::unique_ptr<Camera> m_camera;

    std::unique_ptr<wrapper::Window> m_window;
    std::unique_ptr<wrapper::Instance> m_instance;
    std::unique_ptr<wrapper::Device> m_device;
    std::unique_ptr<wrapper::WindowSurface> m_surface;
    std::unique_ptr<wrapper::Swapchain> m_swapchain;
    std::unique_ptr<ImGUIOverlay> m_imgui_overlay;
    std::unique_ptr<RenderGraph> m_render_graph;

    std::vector<wrapper::Shader> m_shaders;
    std::vector<wrapper::GpuTexture> m_textures;
    std::vector<wrapper::UniformBuffer> m_uniform_buffers;
    std::vector<wrapper::ResourceDescriptor> m_descriptors;
    std::vector<OctreeGpuVertex> m_octree_vertices;
    std::vector<std::uint32_t> m_octree_indices;

    TextureResource *m_back_buffer{nullptr};

    // Render graph buffers for octree geometry.
    BufferResource *m_index_buffer{nullptr};
    BufferResource *m_vertex_buffer{nullptr};

    void setup_render_graph();
    void generate_octree_indices();
    void recreate_swapchain();
    void render_frame();

public:
    VulkanRenderer() = default;
    VulkanRenderer(const VulkanRenderer &) = delete;
    VulkanRenderer(VulkanRenderer &&) = delete;
    ~VulkanRenderer();

    VulkanRenderer &operator=(const VulkanRenderer &) = delete;
    VulkanRenderer &operator=(VulkanRenderer &&) = delete;

    bool m_window_resized{false};

    float m_time_passed{0.0f};

    TimeStep m_stopwatch;
};

} // namespace inexor::vulkan_renderer