#include "renderwindow.h" #include #include #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(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(); }