From f83abe549383b238d07c5d2724212f8a88ceb83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Ko=C5=88a=C5=99=C3=ADk?= Date: Mon, 27 Jan 2025 16:48:51 +0100 Subject: [PATCH] Fix tests after 3D camera changes Part of the camera change handling now happens only once per frame, so we need to wait for a new frame to be rendered so the changes are applied. --- src/3d/qgs3dutils.cpp | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/3d/qgs3dutils.cpp b/src/3d/qgs3dutils.cpp index db6010839948..8f86c1bc9a74 100644 --- a/src/3d/qgs3dutils.cpp +++ b/src/3d/qgs3dutils.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) @@ -58,6 +59,17 @@ typedef Qt3DCore::QBuffer Qt3DQBuffer; // declared here as Qgs3DTypes has no cpp file const char *Qgs3DTypes::PROP_NAME_3D_RENDERER_FLAG = "PROP_NAME_3D_RENDERER_FLAG"; +static void waitForFrame( Qgs3DMapScene *scene ) +{ + // Wait for at least one frame to render + Qt3DLogic::QFrameAction *frameAction = new Qt3DLogic::QFrameAction(); + scene->addComponent( frameAction ); + QEventLoop evLoop; + QObject::connect( frameAction, &Qt3DLogic::QFrameAction::triggered, &evLoop, &QEventLoop::quit ); + evLoop.exec(); + scene->removeComponent( frameAction ); +} + QImage Qgs3DUtils::captureSceneImage( QgsAbstract3DEngine &engine, Qgs3DMapScene *scene ) { QImage resImage; @@ -66,13 +78,7 @@ QImage Qgs3DUtils::captureSceneImage( QgsAbstract3DEngine &engine, Qgs3DMapScene // We need to change render policy to RenderPolicy::Always, since otherwise render capture node won't work engine.renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::RenderPolicy::Always ); - auto requestImageFcn = [&engine, scene] { - if ( scene->sceneState() == Qgs3DMapScene::Ready ) - { - engine.renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::RenderPolicy::OnDemand ); - engine.requestCaptureImage(); - } - }; + waitForFrame( scene ); auto saveImageFcn = [&evLoop, &resImage]( const QImage &img ) { resImage = img; @@ -82,6 +88,14 @@ QImage Qgs3DUtils::captureSceneImage( QgsAbstract3DEngine &engine, Qgs3DMapScene const QMetaObject::Connection conn1 = QObject::connect( &engine, &QgsAbstract3DEngine::imageCaptured, saveImageFcn ); QMetaObject::Connection conn2; + auto requestImageFcn = [&engine, scene] { + if ( scene->sceneState() == Qgs3DMapScene::Ready ) + { + engine.renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::RenderPolicy::OnDemand ); + engine.requestCaptureImage(); + } + }; + if ( scene->sceneState() == Qgs3DMapScene::Ready ) { requestImageFcn(); @@ -110,6 +124,8 @@ QImage Qgs3DUtils::captureSceneDepthBuffer( QgsAbstract3DEngine &engine, Qgs3DMa // We need to change render policy to RenderPolicy::Always, since otherwise render capture node won't work engine.renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::RenderPolicy::Always ); + waitForFrame( scene ); + auto requestImageFcn = [&engine, scene] { if ( scene->sceneState() == Qgs3DMapScene::Ready ) {