diff --git a/src/3d/qgs3dutils.cpp b/src/3d/qgs3dutils.cpp index 3ed254b0dc0..053c9458611 100644 --- a/src/3d/qgs3dutils.cpp +++ b/src/3d/qgs3dutils.cpp @@ -45,7 +45,6 @@ #include #include #include -#include #if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) @@ -59,17 +58,6 @@ 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; @@ -78,7 +66,13 @@ 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 ); - waitForFrame( scene ); + auto requestImageFcn = [&engine, scene] { + if ( scene->sceneState() == Qgs3DMapScene::Ready ) + { + engine.renderSettings()->setRenderPolicy( Qt3DRender::QRenderSettings::RenderPolicy::OnDemand ); + engine.requestCaptureImage(); + } + }; auto saveImageFcn = [&evLoop, &resImage]( const QImage &img ) { resImage = img; @@ -88,14 +82,6 @@ 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(); @@ -124,8 +110,6 @@ 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 ) {