Skip to content

Commit

Permalink
push frame graph and requestCaptureImage up into QgsAbstract3DEngine
Browse files Browse the repository at this point in the history
  • Loading branch information
NEDJIMAbelgacem authored and wonder-sk committed Mar 1, 2021
1 parent 7b3b729 commit ea2e7fa
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 45 deletions.
15 changes: 15 additions & 0 deletions src/3d/qgsabstract3dengine.cpp
Expand Up @@ -15,8 +15,23 @@

#include "qgsabstract3dengine.h"

#include "qgsshadowrenderingframegraph.h"

#include <Qt3DRender/QRenderCapture>

QgsAbstract3DEngine::QgsAbstract3DEngine( QObject *parent )
: QObject( parent )
{

}

void QgsAbstract3DEngine::requestCaptureImage()
{
Qt3DRender::QRenderCaptureReply *captureReply;
captureReply = mFrameGraph->renderCapture()->requestCapture();
connect( captureReply, &Qt3DRender::QRenderCaptureReply::completed, this, [ = ]
{
emit imageCaptured( captureReply->image() );
captureReply->deleteLater();
} );
}
7 changes: 5 additions & 2 deletions src/3d/qgsabstract3dengine.h
Expand Up @@ -87,7 +87,7 @@ class _3D_EXPORT QgsAbstract3DEngine : public QObject
* The function does not block - when the rendered image is captured, it is returned in imageCaptured() signal.
* Only one image request can be active at a time.
*/
virtual void requestCaptureImage() = 0;
void requestCaptureImage();

/**
* Returns the surface of the engine
Expand All @@ -101,11 +101,14 @@ class _3D_EXPORT QgsAbstract3DEngine : public QObject
*
* \since QGIS 3.18
*/
virtual QgsShadowRenderingFrameGraph *frameGraph() = 0;
QgsShadowRenderingFrameGraph *frameGraph() { return mFrameGraph; }

signals:
//! Emitted after a call to requestCaptureImage() to return the captured image.
void imageCaptured( const QImage &image );

protected:
QgsShadowRenderingFrameGraph *mFrameGraph = nullptr;
};


Expand Down
11 changes: 0 additions & 11 deletions src/3d/qgsoffscreen3dengine.cpp
Expand Up @@ -160,14 +160,3 @@ QSurface *QgsOffscreen3DEngine::surface() const
{
return mOffscreenSurface;
}

void QgsOffscreen3DEngine::requestCaptureImage()
{
Qt3DRender::QRenderCaptureReply *captureReply;
captureReply = mFrameGraph->renderCapture()->requestCapture();
connect( captureReply, &Qt3DRender::QRenderCaptureReply::completed, this, [ = ]
{
emit imageCaptured( captureReply->image() );
captureReply->deleteLater();
} );
}
10 changes: 4 additions & 6 deletions src/3d/qgsoffscreen3dengine.h
Expand Up @@ -80,10 +80,9 @@ class _3D_EXPORT QgsOffscreen3DEngine : public QgsAbstract3DEngine
Qt3DRender::QCamera *camera() override;
QSize size() const override;
QSurface *surface() const override;

void requestCaptureImage() override;

QgsShadowRenderingFrameGraph *frameGraph() override { return mFrameGraph; }
signals:
//! Emitted after a call to requestCaptureImage() to return the captured image.
void imageCaptured( const QImage &image );
private:

QSize mSize = QSize( 640, 480 );
Expand All @@ -98,8 +97,7 @@ class _3D_EXPORT QgsOffscreen3DEngine : public QgsAbstract3DEngine
Qt3DCore::QNode *mSceneRoot = nullptr; // The scene root, which becomes a child of the engine's root entity.
Qt3DCore::QEntity *mRoot = nullptr;

QgsShadowRenderingFrameGraph *mFrameGraph = nullptr;

// QgsShadowRenderingFrameGraph *mFrameGraph = nullptr;
};

#endif // QGSOFFSCREEN3DENGINE_H
27 changes: 8 additions & 19 deletions src/3d/qgswindow3dengine.cpp
Expand Up @@ -30,9 +30,9 @@ QgsWindow3DEngine::QgsWindow3DEngine( QObject *parent )
mRoot = new Qt3DCore::QEntity;
mWindow3D->setRootEntity( mRoot );

mShadowRenderingFrameGraph = new QgsShadowRenderingFrameGraph( mWindow3D, QSize( 1024, 768 ), mWindow3D->camera(), mRoot );
mFrameGraph = new QgsShadowRenderingFrameGraph( mWindow3D, QSize( 1024, 768 ), mWindow3D->camera(), mRoot );

mWindow3D->setActiveFrameGraph( mShadowRenderingFrameGraph->frameGraphRoot() );
mWindow3D->setActiveFrameGraph( mFrameGraph->frameGraphRoot() );

// force switching to no shadow rendering
setShadowRenderingEnabled( false );
Expand All @@ -43,40 +43,29 @@ QWindow *QgsWindow3DEngine::window()
return mWindow3D;
}

void QgsWindow3DEngine::requestCaptureImage()
{
Qt3DRender::QRenderCaptureReply *captureReply;
captureReply = mShadowRenderingFrameGraph->renderCapture()->requestCapture();
connect( captureReply, &Qt3DRender::QRenderCaptureReply::completed, this, [ = ]
{
emit imageCaptured( captureReply->image() );
captureReply->deleteLater();
} );
}

void QgsWindow3DEngine::setShadowRenderingEnabled( bool enabled )
{
mShadowRenderingEnabled = enabled;
mShadowRenderingFrameGraph->setShadowRenderingEnabled( mShadowRenderingEnabled );
mFrameGraph->setShadowRenderingEnabled( mShadowRenderingEnabled );
}

void QgsWindow3DEngine::setClearColor( const QColor &color )
{
mShadowRenderingFrameGraph->setClearColor( color );
mFrameGraph->setClearColor( color );
}

void QgsWindow3DEngine::setFrustumCullingEnabled( bool enabled )
{
// Not sure if this works properly
mShadowRenderingFrameGraph->setFrustumCullingEnabled( enabled );
mFrameGraph->setFrustumCullingEnabled( enabled );
}

void QgsWindow3DEngine::setRootEntity( Qt3DCore::QEntity *root )
{
mSceneRoot = root;
mSceneRoot->setParent( mRoot );
mSceneRoot->addComponent( mShadowRenderingFrameGraph->forwardRenderLayer() );
mSceneRoot->addComponent( mShadowRenderingFrameGraph->castShadowsLayer() );
mSceneRoot->addComponent( mFrameGraph->forwardRenderLayer() );
mSceneRoot->addComponent( mFrameGraph->castShadowsLayer() );
}

Qt3DRender::QRenderSettings *QgsWindow3DEngine::renderSettings()
Expand Down Expand Up @@ -105,6 +94,6 @@ void QgsWindow3DEngine::setSize( QSize s )

mWindow3D->setWidth( mSize.width() );
mWindow3D->setHeight( mSize.height() );
mShadowRenderingFrameGraph->setSize( mSize );
mFrameGraph->setSize( mSize );
camera()->setAspectRatio( float( mSize.width() ) / float( mSize.height() ) );
}
7 changes: 0 additions & 7 deletions src/3d/qgswindow3dengine.h
Expand Up @@ -59,11 +59,6 @@ class _3D_EXPORT QgsWindow3DEngine : public QgsAbstract3DEngine
//! Returns the internal 3D window where all the rendered output is displayed
QWindow *window();

//! Returns the frame graph object
QgsShadowRenderingFrameGraph *frameGraph() override { return mShadowRenderingFrameGraph; }

void requestCaptureImage() override;

//! Sets whether shadow rendering is enabled
void setShadowRenderingEnabled( bool enabled );
//! Returns whether shadow rendering is enabled
Expand All @@ -84,8 +79,6 @@ class _3D_EXPORT QgsWindow3DEngine : public QgsAbstract3DEngine
Qt3DExtras::Qt3DWindow *mWindow3D = nullptr;
//! Frame graph node for render capture
bool mShadowRenderingEnabled = false;
QgsShadowRenderingFrameGraph *mShadowRenderingFrameGraph = nullptr;
Qt3DExtras::QForwardRenderer *mDefaultForwardRenderer = nullptr;
Qt3DCore::QEntity *mRoot = nullptr;
Qt3DCore::QEntity *mSceneRoot = nullptr;

Expand Down

0 comments on commit ea2e7fa

Please sign in to comment.