From 7bdcab67bf5063d9f159fc68546ce69b7721f6aa Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Fri, 24 Aug 2018 18:18:17 +0200 Subject: [PATCH] Make the non-preview layout 3D maps renders work again --- src/3d/qgslayoutitem3dmap.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/3d/qgslayoutitem3dmap.cpp b/src/3d/qgslayoutitem3dmap.cpp index 35344505c1f..507bbb45872 100644 --- a/src/3d/qgslayoutitem3dmap.cpp +++ b/src/3d/qgslayoutitem3dmap.cpp @@ -69,8 +69,11 @@ void QgsLayoutItem3DMap::draw( QgsLayoutItemRenderContext &context ) // we do not have a cached image of the rendered scene - let's request one from the engine - painter->drawText( r, Qt::AlignCenter, tr( "Loading" ) ); - painter->restore(); + if ( mLayout->renderContext().isPreviewRender() ) + { + painter->drawText( r, Qt::AlignCenter, tr( "Loading" ) ); + painter->restore(); + } QSizeF sizePixels = mLayout->renderContext().measurementConverter().convert( sizeWithUnits(), QgsUnitTypes::LayoutPixels ).toQSizeF(); QSize sizePixelsInt = QSize( static_cast( std::ceil( sizePixels.width() ) ), @@ -94,7 +97,23 @@ void QgsLayoutItem3DMap::draw( QgsLayoutItemRenderContext &context ) mScene->cameraController()->setCameraPose( mCameraPose ); - onSceneStateChanged(); + if ( mLayout->renderContext().isPreviewRender() ) + { + onSceneStateChanged(); + } + else + { + // we can't just request a capture and hope it will arrive at some point later. + // this is not a preview, we need the rendered scene now! + if ( mDrawing ) + return; + mDrawing = true; + Qgs3DUtils::captureSceneImage( *mEngine.get(), mScene ); + QImage img = Qgs3DUtils::captureSceneImage( *mEngine.get(), mScene ); + painter->drawImage( r, img ); + painter->restore(); + mDrawing = false; + } } void QgsLayoutItem3DMap::onImageCaptured( const QImage &img )