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:
parent
7aadf086de
commit
fd9ce7c361
3 changed files with 49 additions and 18 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Reference in a new issue