QGIS API Documentation 3.99.0-Master (2fe06baccd8)
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 <QUrl>
23#include <Qt3DCore/QEntity>
24#include <Qt3DExtras/QCuboidMesh>
25#include <Qt3DRender/QCullFace>
26#include <Qt3DRender/QDepthTest>
27#include <Qt3DRender/QEffect>
28#include <Qt3DRender/QFilterKey>
29#include <Qt3DRender/QGraphicsApiFilter>
30#include <Qt3DRender/QMaterial>
31#include <Qt3DRender/QParameter>
32#include <Qt3DRender/QRenderPass>
33#include <Qt3DRender/QSeamlessCubemap>
34#include <Qt3DRender/QShaderProgram>
35#include <Qt3DRender/QTechnique>
36#include <Qt3DRender/QTextureImage>
37
38#include "moc_qgsskyboxentity.cpp"
39
41 : Qt3DCore::QEntity( parent )
42 , mEffect( new Qt3DRender::QEffect( this ) )
43 , mMaterial( new Qt3DRender::QMaterial( this ) )
44 , mGl3Technique( new Qt3DRender::QTechnique( this ) )
45 , mFilterKey( new Qt3DRender::QFilterKey( this ) )
46 , mGl3RenderPass( new Qt3DRender::QRenderPass( this ) )
47 , mMesh( new Qt3DExtras::QCuboidMesh( this ) )
48 , mGammaStrengthParameter( new Qt3DRender::QParameter( QStringLiteral( "gammaStrength" ), 0.0f ) )
49 , mTextureParameter( new Qt3DRender::QParameter( this ) )
50{
51 mGl3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
52 mGl3Technique->graphicsApiFilter()->setMajorVersion( 3 );
53 mGl3Technique->graphicsApiFilter()->setMinorVersion( 3 );
54 mGl3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
55
56 mFilterKey->setParent( mEffect );
57 mFilterKey->setName( QStringLiteral( "renderingStyle" ) );
58 mFilterKey->setValue( QStringLiteral( "forward" ) );
59
60 mGl3Technique->addFilterKey( mFilterKey );
61
62 Qt3DRender::QCullFace *cullFront = new Qt3DRender::QCullFace();
63 cullFront->setMode( Qt3DRender::QCullFace::Front );
64 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest();
65 depthTest->setDepthFunction( Qt3DRender::QDepthTest::LessOrEqual );
66 Qt3DRender::QSeamlessCubemap *seamlessCubemap = new Qt3DRender::QSeamlessCubemap();
67
68 mGl3RenderPass->addRenderState( cullFront );
69 mGl3RenderPass->addRenderState( depthTest );
70 mGl3RenderPass->addRenderState( seamlessCubemap );
71
72 mGl3Technique->addRenderPass( mGl3RenderPass );
73
74 mEffect->addTechnique( mGl3Technique );
75
76 mMaterial->setEffect( mEffect );
77 mMaterial->addParameter( mGammaStrengthParameter );
78 mMaterial->addParameter( mTextureParameter );
79
80 mMesh->setXYMeshResolution( QSize( 2, 2 ) );
81 mMesh->setXZMeshResolution( QSize( 2, 2 ) );
82 mMesh->setYZMeshResolution( QSize( 2, 2 ) );
83
84 addComponent( mMesh );
85 addComponent( mMaterial );
86}
87
88// Panoramic skybox
89
91 : QgsSkyboxEntity( parent )
92 , mTexturePath( texturePath )
93 , mLoadedTexture( new Qt3DRender::QTextureLoader( parent ) )
94 , mGlShader( new Qt3DRender::QShaderProgram( this ) )
95{
96 mLoadedTexture->setGenerateMipMaps( false );
97 mGlShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( "qrc:/shaders/skybox.vert" ) ) ) );
98 mGlShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( "qrc:/shaders/hdr_skybox.frag" ) ) ) );
99 mGl3RenderPass->setShaderProgram( mGlShader );
100
101 mTextureParameter->setName( "skyboxTexture" );
102 mTextureParameter->setValue( QVariant::fromValue( mLoadedTexture ) );
103
104 reloadTexture();
105}
106
107void QgsPanoramicSkyboxEntity::reloadTexture()
108{
109 mLoadedTexture->setSource( QUrl::fromUserInput( mTexturePath ) );
110}
111
112// 6 faces skybox
113
114QgsCubeFacesSkyboxEntity::QgsCubeFacesSkyboxEntity( const QString &posX, const QString &posY, const QString &posZ, const QString &negX, const QString &negY, const QString &negZ, Qt3DCore::QNode *parent )
115 : QgsSkyboxEntity( parent )
116 , mGlShader( new Qt3DRender::QShaderProgram() )
117 , mCubeMap( new Qt3DRender::QTextureCubeMap( this ) )
118{
119 init();
120 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveX] = posX;
121 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveY] = posY;
122 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveZ] = posZ;
123 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeX] = negX;
124 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeY] = negY;
125 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeZ] = negZ;
126 reloadTexture();
127}
128
129void QgsCubeFacesSkyboxEntity::init()
130{
131 mGlShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( "qrc:/shaders/skybox.vert" ) ) ) );
132 mGlShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral( "qrc:/shaders/skybox.frag" ) ) ) );
133 mGl3RenderPass->setShaderProgram( mGlShader );
134
135 mCubeMap->setMagnificationFilter( Qt3DRender::QTextureCubeMap::Linear );
136 mCubeMap->setMinificationFilter( Qt3DRender::QTextureCubeMap::Linear );
137 mCubeMap->setGenerateMipMaps( false );
138 mCubeMap->setWrapMode( Qt3DRender::QTextureWrapMode( Qt3DRender::QTextureWrapMode::Repeat ) );
139
140 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveX] = QString();
141 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveY] = QString();
142 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapPositiveZ] = QString();
143 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeX] = QString();
144 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeY] = QString();
145 mCubeFacesPaths[Qt3DRender::QTextureCubeMap::CubeMapNegativeZ] = QString();
146
147 mTextureParameter->setName( "skyboxTexture" );
148 mTextureParameter->setValue( QVariant::fromValue( mCubeMap ) );
149}
150
151void QgsCubeFacesSkyboxEntity::reloadTexture()
152{
153 for ( Qt3DRender::QAbstractTextureImage *textureImage : mFacesTextureImages )
154 {
155 mCubeMap->removeTextureImage( textureImage );
156 delete textureImage;
157 }
158 mFacesTextureImages.clear();
159
160 for ( auto it = mCubeFacesPaths.begin(); it != mCubeFacesPaths.end(); ++it )
161 {
162 const Qt3DRender::QTextureCubeMap::CubeMapFace face = it.key();
163 const QString texturePath = it.value();
164 Qt3DRender::QTextureImage *image = new Qt3DRender::QTextureImage( this );
165 image->setFace( face );
166 image->setMirrored( false );
167 image->setSource( QUrl::fromUserInput( texturePath ) );
168 mCubeMap->addTextureImage( image );
169 mFacesTextureImages.push_back( image );
170 }
171}
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