1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-25 05:17:44 +00:00

Properly handle window resize events in mdlview renderer

This commit is contained in:
Joshua Goins 2022-04-12 00:30:17 -04:00
parent 7aadf086de
commit fd9ce7c361
3 changed files with 49 additions and 18 deletions

View file

@ -1,10 +1,12 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QHBoxLayout> #include <QVBoxLayout>
#include <QTableWidget> #include <QTableWidget>
#include <fmt/core.h> #include <fmt/core.h>
#include <QListWidget> #include <QListWidget>
#include <QVulkanWindow> #include <QVulkanWindow>
#include <QLineEdit>
#include <QResizeEvent>
#include "gamedata.h" #include "gamedata.h"
#include "exhparser.h" #include "exhparser.h"
@ -23,6 +25,10 @@ public:
if (isExposed()) { if (isExposed()) {
if (!m_initialized) { if (!m_initialized) {
m_initialized = true; m_initialized = true;
auto surface = m_instance->surfaceForWindow(this);
m_renderer->initSwapchain(surface, width(), height());
render(); render();
} }
} }
@ -32,11 +38,18 @@ public:
if (e->type() == QEvent::UpdateRequest) if (e->type() == QEvent::UpdateRequest)
render(); 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); return QWindow::event(e);
} }
void render() { void render() {
m_renderer->render(); m_renderer->render();
m_instance->presentQueued(this);
requestUpdate(); requestUpdate();
} }
@ -52,24 +65,30 @@ MainWindow::MainWindow(GameData& data) : data(data) {
auto dummyWidget = new QWidget(); auto dummyWidget = new QWidget();
setCentralWidget(dummyWidget); setCentralWidget(dummyWidget);
auto layout = new QHBoxLayout(); auto layout = new QVBoxLayout();
dummyWidget->setLayout(layout); dummyWidget->setLayout(layout);
QLineEdit* pathEdit = new QLineEdit();
layout->addWidget(pathEdit);
renderer = new Renderer(); renderer = new Renderer();
QVulkanInstance inst; QVulkanInstance* inst = new QVulkanInstance();
inst.setVkInstance(renderer->instance); inst->setVkInstance(renderer->instance);
inst.setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect); inst->setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect);
inst.create(); inst->create();
VulkanWindow* vkWindow = new VulkanWindow(renderer, &inst); VulkanWindow* vkWindow = new VulkanWindow(renderer, inst);
vkWindow->show(); vkWindow->setVulkanInstance(inst);
vkWindow->setVulkanInstance(&inst);
auto surface = inst.surfaceForWindow(vkWindow);
renderer->initSwapchain(surface);
auto widget = QWidget::createWindowContainer(vkWindow); auto widget = QWidget::createWindowContainer(vkWindow);
//widget->resize(640, 480);
layout->addWidget(widget); layout->addWidget(widget);
//vkWindow->show();
//auto surface = inst.surfaceForWindow(vkWindow);
//renderer->initSwapchain(surface);
} }

View file

@ -8,7 +8,8 @@ class Renderer {
public: public:
Renderer(); Renderer();
void initSwapchain(VkSurfaceKHR surface); void initSwapchain(VkSurfaceKHR surface, int width, int height);
void resize(VkSurfaceKHR surface, int width, int height);
void render(); void render();

View file

@ -136,8 +136,8 @@ Renderer::Renderer() {
fmt::print("Initialized renderer!\n"); fmt::print("Initialized renderer!\n");
} }
void Renderer::initSwapchain(VkSurfaceKHR surface) { void Renderer::initSwapchain(VkSurfaceKHR surface, int width, int height) {
fmt::print("Creating swapchain...\n"); vkQueueWaitIdle(presentQueue);
// TODO: fix this pls // TODO: fix this pls
VkBool32 supported; VkBool32 supported;
@ -198,8 +198,8 @@ void Renderer::initSwapchain(VkSurfaceKHR surface) {
createInfo.minImageCount = imageCount; createInfo.minImageCount = imageCount;
createInfo.imageFormat = swapchainSurfaceFormat.format; createInfo.imageFormat = swapchainSurfaceFormat.format;
createInfo.imageColorSpace = swapchainSurfaceFormat.colorSpace; createInfo.imageColorSpace = swapchainSurfaceFormat.colorSpace;
createInfo.imageExtent.width = capabilities.currentExtent.width; createInfo.imageExtent.width = width;
createInfo.imageExtent.height = capabilities.currentExtent.height; createInfo.imageExtent.height = height;
createInfo.imageArrayLayers = 1; createInfo.imageArrayLayers = 1;
createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
@ -208,9 +208,16 @@ void Renderer::initSwapchain(VkSurfaceKHR surface) {
createInfo.presentMode = swapchainPresentMode; createInfo.presentMode = swapchainPresentMode;
createInfo.clipped = VK_TRUE; createInfo.clipped = VK_TRUE;
VkSwapchainKHR oldSwapchain = swapchain;
createInfo.oldSwapchain = oldSwapchain;
vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapchain); 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, vkGetSwapchainImagesKHR(device, swapchain, &imageCount,
nullptr); 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() { void Renderer::render() {
vkWaitForFences( vkWaitForFences(
device, 1, device, 1,