1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-24 21:07:46 +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 <QHBoxLayout>
#include <QVBoxLayout>
#include <QTableWidget>
#include <fmt/core.h>
#include <QListWidget>
#include <QVulkanWindow>
#include <QLineEdit>
#include <QResizeEvent>
#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);
}

View file

@ -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();

View file

@ -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,