QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsskyboxentity.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsskyboxentity.cpp
3 --------------------------------------
4 Date : August 2020
5 Copyright : (C) 2020 by Belgacem Nedjima
6 Email : gb uderscore nedjima at esi dot dz
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include "qgsskyboxentity.h"
17
18#include "qgsimagecache.h"
19#include "qgsimagetexture.h"
20#include "qgsproject.h"
21
22#include <QString>
23#include <QUrl>
24#include <Qt3DCore/QEntity>
25#include <Qt3DExtras/QCuboidMesh>
26#include <Qt3DRender/QCullFace>
27#include <Qt3DRender/QDepthTest>
28#include <Qt3DRender/QEffect>
29#include <Qt3DRender/QFilterKey>
30#include <Qt3DRender/QGraphicsApiFilter>
31#include <Qt3DRender/QMaterial>
32#include <Qt3DRender/QParameter>
33#include <Qt3DRender/QRenderPass>
34#include <Qt3DRender/QSeamlessCubemap>
35#include <Qt3DRender/QShaderProgram>
36#include <Qt3DRender/QTechnique>
37#include <Qt3DRender/QTextureImage>
38
39#include "moc_qgsskyboxentity.cpp"
40
41using namespace Qt::StringLiterals;
42
44 : Qt3DCore::QEntity( parent )
45 , mEffect( new Qt3DRender::QEffect( this ) )
46 , mMaterial( new Qt3DRender::QMaterial( this ) )
47 , mGl3Technique( new Qt3DRender::QTechnique( this ) )
48 , mFilterKey( new Qt3DRender::QFilterKey( this ) )
49 , mGl3RenderPass( new Qt3DRender::QRenderPass( this ) )
50 , mMesh( new Qt3DExtras::QCuboidMesh( this ) )
51 , mGammaStrengthParameter( new Qt3DRender::QParameter( u"gammaStrength"_s, 0.0f ) )
52 , mTextureParameter( new Qt3DRender::QParameter( this ) )
53{
54 mGl3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
55 mGl3Technique->graphicsApiFilter()->setMajorVersion( 3 );
56 mGl3Technique->graphicsApiFilter()->setMinorVersion( 3 );
57 mGl3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
58
59 mFilterKey->setParent( mEffect );
60 mFilterKey->setName( u"renderingStyle"_s );
61 mFilterKey->setValue( u"forward"_s );
62
63 mGl3Technique->addFilterKey( mFilterKey );
64
65 Qt3DRender::QCullFace *cullFront = new Qt3DRender::QCullFace();
66 cullFront->setMode( Qt3DRender::QCullFace::Front );
67 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest();
68 depthTest->setDepthFunction( Qt3DRender::QDepthTest::LessOrEqual );
69 Qt3DRender::QSeamlessCubemap *seamlessCubemap = new Qt3DRender::QSeamlessCubemap();
70
71 mGl3RenderPass->addRenderState( cullFront );
72 mGl3RenderPass->addRenderState( depthTest );
73 mGl3RenderPass->addRenderState( seamlessCubemap );
74
75 mGl3Technique->addRenderPass( mGl3RenderPass );
76
77 mEffect->addTechnique( mGl3Technique );
78
79 mMaterial->setEffect( mEffect );
80 mMaterial->addParameter( mGammaStrengthParameter );
81 mMaterial->addParameter( mTextureParameter );
82
83 mMesh->setXYMeshResolution( QSize( 2, 2 ) );
84 mMesh->setXZMeshResolution( QSize( 2, 2 ) );
85 mMesh->setYZMeshResolution( QSize( 2, 2 ) );
86
87 addComponent( mMesh );
88 addComponent( mMaterial );
89}
90
91// Panoramic skybox
92
94 : QgsSkyboxEntity( parent )
95 , mTexturePath( texturePath )
96 , mLoadedTexture( new Qt3DRender::QTextureLoader( parent ) )
97 , mGlShader( new Qt3DRender::QShaderProgram( this ) )
98{
99 mLoadedTexture->setGenerateMipMaps( false );
100 mGlShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/skybox.vert"_s ) ) );
101 mGlShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/hdr_skybox.frag"_s ) ) );
102 mGl3RenderPass->setShaderProgram( mGlShader );
103
104 mTextureParameter->setName( "skyboxTexture" );
105 mTextureParameter->setValue( QVariant::fromValue( mLoadedTexture ) );
106
107 reloadTexture();
108}
109
110void QgsPanoramicSkyboxEntity::reloadTexture()
111{
112 mLoadedTexture->setSource( QUrl::fromUserInput( mTexturePath ) );
113}
114
115// 6 faces skybox
116
117QgsCubeFacesSkyboxEntity::QgsCubeFacesSkyboxEntity( const QString &posX, const QString &posY, const QString &posZ, const QString &negX, const QString &negY, const QString &negZ, Qt3DCore::QNode *parent )
118 : QgsSkyboxEntity( parent )
119 , mGlShader( new Qt3DRender::QShaderProgram() )
120 , mCubeMap( new Qt3DRender::QTextureCubeMap( this ) )
121{
122 init();
123 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveX] = posX;
124 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveY] = posY;
125 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveZ] = posZ;
126 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeX] = negX;
127 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeY] = negY;
128 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeZ] = negZ;
129 reloadTexture();
130}
131
132void QgsCubeFacesSkyboxEntity::init()
133{
134 mGlShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/skybox.vert"_s ) ) );
135 mGlShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/skybox.frag"_s ) ) );
136 mGl3RenderPass->setShaderProgram( mGlShader );
137
138 mCubeMap->setMagnificationFilter( Qt3DRender::QTextureCubeMap::Linear );
139 mCubeMap->setMinificationFilter( Qt3DRender::QTextureCubeMap::Linear );
140 mCubeMap->setGenerateMipMaps( false );
141 mCubeMap->setWrapMode( Qt3DRender::QTextureWrapMode( Qt3DRender::QTextureWrapMode::Repeat ) );
142
143 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveX] = QString();
144 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveY] = QString();
145 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveZ] = QString();
146 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeX] = QString();
147 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeY] = QString();
148 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeZ] = QString();
149
150 mTextureParameter->setName( "skyboxTexture" );
151 mTextureParameter->setValue( QVariant::fromValue( mCubeMap ) );
152}
153
154void QgsCubeFacesSkyboxEntity::reloadTexture()
155{
156 for ( Qt3DRender::QAbstractTextureImage *textureImage : mFacesTextureImages )
157 {
158 mCubeMap->removeTextureImage( textureImage );
159 delete textureImage;
160 }
161 mFacesTextureImages.clear();
162
163 for ( auto it = mCubeFacesPaths.begin(); it != mCubeFacesPaths.end(); ++it )
164 {
165 const Qt3DRender::QTextureCubeMap::CubeMapFace face = it.key();
166 const QString texturePath = it.value();
167 Qt3DRender::QTextureImage *image = new Qt3DRender::QTextureImage( this );
168 image->setFace( face );
169 image->setMirrored( false );
170 image->setSource( QUrl::fromUserInput( texturePath ) );
171 mCubeMap->addTextureImage( image );
172 mFacesTextureImages.push_back( image );
173 }
174}
QgsCubeFacesSkyboxEntity(const QString &posX, const QString &posY, const QString &posZ, const QString &negX, const QString &negY, const QString &negZ, Qt3DCore::QNode *parent=nullptr)
Constructs a skybox from 6 different images.
QgsPanoramicSkyboxEntity(const QString &texturePath, Qt3DCore::QNode *parent=nullptr)
Construct a skybox from a panoramic 360 image.
QString texturePath() const
Returns the path of the current texture in use.
QgsSkyboxEntity(QNode *parent=nullptr)
Constructor.
Qt3DRender::QRenderPass * mGl3RenderPass
Qt3DRender::QParameter * mGammaStrengthParameter
Qt3DRender::QFilterKey * mFilterKey
Qt3DRender::QEffect * mEffect
Qt3DExtras::QCuboidMesh * mMesh
Qt3DRender::QParameter * mTextureParameter
Qt3DRender::QMaterial * mMaterial
Qt3DRender::QTechnique * mGl3Technique