Skip to content
Snippets Groups Projects
Commit e8406a9d authored by Sebastian Gaida's avatar Sebastian Gaida
Browse files

[#89] create Window and Swapchain Manager

parent b4a39a1b
No related branches found
No related tags found
1 merge request!90Resolve "Mehrere Fenster, Abhängigkeiten von Core zu Fenster+Swapchain etc"
......@@ -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
......
#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
#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
#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
#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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment