61 lines
1.6 KiB
C++
Executable file
61 lines
1.6 KiB
C++
Executable file
#include "renderwindow.h"
|
|
|
|
#include <QVulkanInstance>
|
|
#include <QResizeEvent>
|
|
|
|
#include "renderer.h"
|
|
#include "worldmanager.h"
|
|
|
|
RendererWindow::RendererWindow(Context& context) : QWindow(), context(context) {
|
|
setSurfaceType(SurfaceType::VulkanSurface);
|
|
}
|
|
|
|
void RendererWindow::exposeEvent(QExposeEvent*) {
|
|
if (isExposed() && !initialized) {
|
|
init();
|
|
render();
|
|
|
|
initialized = true;
|
|
}
|
|
}
|
|
|
|
bool RendererWindow::event(QEvent* event) {
|
|
switch(event->type()) {
|
|
case QEvent::UpdateRequest:
|
|
render();
|
|
break;
|
|
case QEvent::PlatformSurface:
|
|
{
|
|
if(static_cast<QPlatformSurfaceEvent*>(event)->surfaceEventType() == QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed)
|
|
context.renderer->destroyRenderTarget(target);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return QWindow::event(event);
|
|
}
|
|
|
|
void RendererWindow::init() {
|
|
surface = QVulkanInstance::surfaceForWindow(this);
|
|
|
|
target = context.renderer->createSurfaceRenderTarget(surface);
|
|
}
|
|
|
|
void RendererWindow::render() {
|
|
const auto width = size().width();
|
|
const auto height = size().height();
|
|
|
|
if(target->extent.width != width || target->extent.height != height)
|
|
target = context.renderer->createSurfaceRenderTarget(surface, target);
|
|
|
|
RenderExtraInfo extraInfo;
|
|
extraInfo.selectedEntities = context.selectedEntities.data();
|
|
extraInfo.numSelectedEntities = context.selectedEntities.size();
|
|
|
|
context.renderer->render(*worldManager.getCurrentWorld(), target, &extraInfo);
|
|
|
|
vulkanInstance()->presentQueued(this);
|
|
requestUpdate();
|
|
}
|