diff --git a/config/Sources.cmake b/config/Sources.cmake index 41cd0c20f2106dc02700d9b23227f3e6c34a057a..66068e64cb3bd15cdaeab0c3c35515888223ca5f 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -75,6 +75,12 @@ set(vkcv_sources ${vkcv_source}/vkcv/SamplerManager.hpp ${vkcv_source}/vkcv/SamplerManager.cpp + + ${vkcv_include}/vkcv/WindowManager.hpp + ${vkcv_source}/vkcv/WindowManager.cpp + + ${vkcv_include}/vkcv/SwapchainManager.hpp + ${vkcv_source}/vkcv/SwapchainManager.cpp ${vkcv_include}/vkcv/DescriptorWrites.hpp diff --git a/include/vkcv/SwapchainManager.hpp b/include/vkcv/SwapchainManager.hpp new file mode 100644 index 0000000000000000000000000000000000000000..197bbc731133272f2731005e1d2f88add7a6109d --- /dev/null +++ b/include/vkcv/SwapchainManager.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include <vector> +#include <GLFW/glfw3.h> + +#include "vkcv/WindowManager.hpp" +#include "vkcv/Swapchain.hpp" +#include "vkcv/Handles.hpp" + +namespace vkcv { + class Core; + + class SwapchainManager { + friend class Core; + + friend class WindowManager; + + private: + + void destroySwapchainById(uint64_t id); + + public: + SwapchainManager() noexcept; + + ~SwapchainManager() noexcept; + + SwapchainManager(SwapchainManager &&other) = delete; + + SwapchainManager(const SwapchainManager &other) = delete; + + SwapchainManager &operator=(SwapchainManager &&other) = delete; + + SwapchainManager &operator=(const SwapchainManager &other) = delete; + + SwapchainHandle createSwapchain(Window &window, Context &context); + + [[nodiscard]] + Swapchain &getSwapchain(const SwapchainHandle handle) const; + + }; +} \ No newline at end of file diff --git a/include/vkcv/WindowManager.hpp b/include/vkcv/WindowManager.hpp new file mode 100644 index 0000000000000000000000000000000000000000..3fe66adeb15fd3802adadc985c4f6626dfbd3512 --- /dev/null +++ b/include/vkcv/WindowManager.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include <vector> +#include <GLFW/glfw3.h> + +#include "vkcv/Window.hpp" +#include "vkcv/Handles.hpp" + +namespace vkcv { + class Core; + + class WindowManager { + friend class Core; + + private: + + void destroyWindowById(uint64_t id); + + public: + WindowManager() noexcept; + + ~WindowManager() noexcept; + + WindowManager(WindowManager &&other) = delete; + + WindowManager(const WindowManager &other) = delete; + + WindowManager &operator=(WindowManager &&other) = delete; + + WindowManager &operator=(const WindowManager &other) = delete; + + WindowHandle createWindow(Core &core, const char *applicationName, uint32_t windowWidth, uint32_t windowHeight, + bool resizeable); + + [[nodiscard]] + Window &getWindow(const WindowHandle handle) const; + + /** + * Forwards the event poll to "vkcv/Window.hpp" + */ + static void pollEvents(); + + static bool hasOpenWindow(); + + static const Window getFocusedWindow(); + }; +} \ No newline at end of file diff --git a/src/vkcv/SwapchainManager.cpp b/src/vkcv/SwapchainManager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b97a645e6bf28d63d995473b607a80dd114e8930 --- /dev/null +++ b/src/vkcv/SwapchainManager.cpp @@ -0,0 +1,36 @@ +#include <vkcv/SwapchainManager.hpp> + +namespace vkcv { + static std::vector<Swapchain> m_swapchains; + + SwapchainManager::SwapchainManager() noexcept { + } + + SwapchainManager::~SwapchainManager() noexcept { + for (uint64_t id = 0; id < m_swapchains.size(); id++) { + destroySwapchainById(id); + } + m_swapchains.clear(); + } + + [[maybe_unused]] SwapchainHandle SwapchainManager::createSwapchain(Window &window, Context &context) { + const uint64_t id = m_swapchains.size(); + + Swapchain swapchain = Swapchain::create(window, context); + + m_swapchains.push_back(swapchain); + return SwapchainHandle(id, [&](uint64_t id) { destroySwapchainById(id); }); + } + + Swapchain &SwapchainManager::getSwapchain(const SwapchainHandle handle) const { + return m_swapchains[handle.getId()]; + } + + void SwapchainManager::destroySwapchainById(uint64_t id) { + + if (id >= m_swapchains.size()) { + vkcv_log(LogLevel::ERROR, "Invalid id"); + return; + } + } +} \ No newline at end of file diff --git a/src/vkcv/WindowManager.cpp b/src/vkcv/WindowManager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..73d9826680781486ba11ca0a6e0dbe666ed2c2df --- /dev/null +++ b/src/vkcv/WindowManager.cpp @@ -0,0 +1,71 @@ +#include "vkcv/WindowManager.hpp" +#include "vkcv/Core.hpp" + +namespace vkcv { + static std::vector<Window> m_windows; + + WindowManager::WindowManager() noexcept { + } + + WindowManager::~WindowManager() noexcept { + for (uint64_t id = 0; id < m_windows.size(); id++) { + destroyWindowById(id); + } + m_windows.clear(); + } + + WindowHandle WindowManager::createWindow( + Core &core, + const char *applicationName, + uint32_t windowWidth, + uint32_t windowHeight, + bool resizeable) { + const uint64_t id = m_windows.size(); + + vkcv::Window window = vkcv::Window(applicationName, windowWidth, windowHeight, resizeable); + + Swapchain swapChain = Swapchain::create(window, core.getContext()); + + if (resizeable) { + window.e_resize.add([&](int width, int height) { + // m_swapchain.signalSwapchainRecreation(); // swapchain signal + }); + } + + m_windows.push_back(window); + return WindowHandle(id, [&](uint64_t id) { destroyWindowById(id); }); + } + + Window &WindowManager::getWindow(const WindowHandle handle) const { + return m_windows[handle.getId()]; + } + + void WindowManager::destroyWindowById(uint64_t id) { + + if (id >= m_windows.size()) { + vkcv_log(LogLevel::ERROR, "Invalid id"); + return; + } + + Window &window = m_windows[id]; + window.destroyWindow(); + m_windows[id] = nullptr; + } + + void WindowManager::pollEvents() { + Window::pollEvents(); + } + + bool WindowManager::hasOpenWindow() { + for (auto &window : m_windows) { + if (window.isOpen()) { + return true; + } + } + return false; + } + + const Window WindowManager::getFocusedWindow() { + return Window::getFocusedWindow(); + } +} \ No newline at end of file