diff --git a/mdlviewer/src/mainwindow.cpp b/mdlviewer/src/mainwindow.cpp index 18d5472..4b1f358 100644 --- a/mdlviewer/src/mainwindow.cpp +++ b/mdlviewer/src/mainwindow.cpp @@ -1,10 +1,12 @@ #include "mainwindow.h" -#include +#include #include #include #include #include +#include +#include #include "gamedata.h" #include "exhparser.h" @@ -23,6 +25,10 @@ public: if (isExposed()) { if (!m_initialized) { m_initialized = true; + + auto surface = m_instance->surfaceForWindow(this); + m_renderer->initSwapchain(surface, width(), height()); + render(); } } @@ -32,11 +38,18 @@ public: if (e->type() == QEvent::UpdateRequest) render(); + if (e->type() == QEvent::Resize) { + QResizeEvent* resizeEvent = (QResizeEvent*)e; + auto surface = m_instance->surfaceForWindow(this); + m_renderer->resize(surface, resizeEvent->size().width(), resizeEvent->size().height()); + } + return QWindow::event(e); } void render() { m_renderer->render(); + m_instance->presentQueued(this); requestUpdate(); } @@ -52,24 +65,30 @@ MainWindow::MainWindow(GameData& data) : data(data) { auto dummyWidget = new QWidget(); setCentralWidget(dummyWidget); - auto layout = new QHBoxLayout(); + auto layout = new QVBoxLayout(); dummyWidget->setLayout(layout); + QLineEdit* pathEdit = new QLineEdit(); + layout->addWidget(pathEdit); + renderer = new Renderer(); - QVulkanInstance inst; - inst.setVkInstance(renderer->instance); - inst.setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect); - inst.create(); + QVulkanInstance* inst = new QVulkanInstance(); + inst->setVkInstance(renderer->instance); + inst->setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect); + inst->create(); - VulkanWindow* vkWindow = new VulkanWindow(renderer, &inst); - vkWindow->show(); - vkWindow->setVulkanInstance(&inst); - - auto surface = inst.surfaceForWindow(vkWindow); - renderer->initSwapchain(surface); + VulkanWindow* vkWindow = new VulkanWindow(renderer, inst); + vkWindow->setVulkanInstance(inst); auto widget = QWidget::createWindowContainer(vkWindow); + //widget->resize(640, 480); layout->addWidget(widget); + //vkWindow->show(); + + //auto surface = inst.surfaceForWindow(vkWindow); + //renderer->initSwapchain(surface); + + } \ No newline at end of file diff --git a/renderer/include/renderer.hpp b/renderer/include/renderer.hpp index 7d06130..970c728 100644 --- a/renderer/include/renderer.hpp +++ b/renderer/include/renderer.hpp @@ -8,7 +8,8 @@ class Renderer { public: Renderer(); - void initSwapchain(VkSurfaceKHR surface); + void initSwapchain(VkSurfaceKHR surface, int width, int height); + void resize(VkSurfaceKHR surface, int width, int height); void render(); diff --git a/renderer/src/renderer.cpp b/renderer/src/renderer.cpp index b79436b..f3ae8e3 100644 --- a/renderer/src/renderer.cpp +++ b/renderer/src/renderer.cpp @@ -136,8 +136,8 @@ Renderer::Renderer() { fmt::print("Initialized renderer!\n"); } -void Renderer::initSwapchain(VkSurfaceKHR surface) { - fmt::print("Creating swapchain...\n"); +void Renderer::initSwapchain(VkSurfaceKHR surface, int width, int height) { + vkQueueWaitIdle(presentQueue); // TODO: fix this pls VkBool32 supported; @@ -198,8 +198,8 @@ void Renderer::initSwapchain(VkSurfaceKHR surface) { createInfo.minImageCount = imageCount; createInfo.imageFormat = swapchainSurfaceFormat.format; createInfo.imageColorSpace = swapchainSurfaceFormat.colorSpace; - createInfo.imageExtent.width = capabilities.currentExtent.width; - createInfo.imageExtent.height = capabilities.currentExtent.height; + createInfo.imageExtent.width = width; + createInfo.imageExtent.height = height; createInfo.imageArrayLayers = 1; createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; @@ -208,9 +208,16 @@ void Renderer::initSwapchain(VkSurfaceKHR surface) { createInfo.presentMode = swapchainPresentMode; createInfo.clipped = VK_TRUE; + VkSwapchainKHR oldSwapchain = swapchain; + createInfo.oldSwapchain = oldSwapchain; + vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapchain); - swapchainExtent = capabilities.currentExtent; + if(oldSwapchain != VK_NULL_HANDLE) + vkDestroySwapchainKHR(device, oldSwapchain, nullptr); + + swapchainExtent.width = width; + swapchainExtent.height = height; vkGetSwapchainImagesKHR(device, swapchain, &imageCount, nullptr); @@ -319,6 +326,10 @@ void Renderer::initSwapchain(VkSurfaceKHR surface) { } } +void Renderer::resize(VkSurfaceKHR surface, int width, int height) { + initSwapchain(surface, width, height); +} + void Renderer::render() { vkWaitForFences( device, 1,