QGIS API Documentation 4.1.0-Master (ca2ac17535b)
Loading...
Searching...
No Matches
qgsmetalroughtexturedmaterial3dhandler.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmetalroughtexturedmaterial3dhandler.cpp
3 --------------------------------------
4 Date : April 2026
5 Copyright : (C) 2026 by Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
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
17
18#include "qgs3dutils.h"
19#include "qgsapplication.h"
21#include "qgsimagecache.h"
22#include "qgsimagetexture.h"
25
26#include <QString>
27#include <Qt3DCore/QEntity>
28#include <Qt3DRender/QEffect>
29#include <Qt3DRender/QGraphicsApiFilter>
30#include <Qt3DRender/QPaintedTextureImage>
31#include <Qt3DRender/QParameter>
32#include <Qt3DRender/QTechnique>
33#include <Qt3DRender/QTexture>
34
35using namespace Qt::StringLiterals;
36
38{
39 const QgsMetalRoughTexturedMaterialSettings *texturedSettings = dynamic_cast< const QgsMetalRoughTexturedMaterialSettings * >( settings );
40 Q_ASSERT( texturedSettings );
41
42 switch ( technique )
43 {
45 {
46 Q_ASSERT( false );
47 return nullptr;
48 }
51 {
52 if ( context.isHighlighted() )
53 {
54 return new QgsHighlightMaterial( technique );
55 }
56
57 QgsMetalRoughMaterial *material = new QgsMetalRoughMaterial( nullptr );
58 material->setEnvironmentalLightingEnabled( !context.isPreview() );
59 material->setObjectName( u"metalRoughTexturedMaterial"_s );
60 applySettingsToMaterial( texturedSettings, material, context );
61
62 return material;
63 }
64
65 default:
66 return nullptr;
67 }
68}
69
71{
72 const QgsMetalRoughTexturedMaterialSettings *texturedSettings = qgis::down_cast< const QgsMetalRoughTexturedMaterialSettings * >( settings );
73
74 QgsMetalRoughMaterial *material = new QgsMetalRoughMaterial();
75 material->setEnvironmentalLightingEnabled( true );
76 material->setInstancingEnabled( true, flags );
77
78 material->setObjectName( u"metalRoughTexturedMaterial"_s );
79 applySettingsToMaterial( texturedSettings, material, context );
80
81 return material;
82}
83
85{
86 QMap<QString, QString> parameters;
87 return parameters;
88}
89
90bool QgsMetalRoughTexturedMaterial3DHandler::updatePreviewScene( Qt3DCore::QEntity *sceneRoot, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &context ) const
91{
92 const QgsMetalRoughTexturedMaterialSettings *metalRoughTexturedSettings = qgis::down_cast< const QgsMetalRoughTexturedMaterialSettings * >( settings );
93
94 QgsMetalRoughMaterial *material = sceneRoot->findChild<QgsMetalRoughMaterial *>();
95 if ( !material || material->objectName() != "metalRoughTexturedMaterial"_L1 )
96 return false;
97
98 applySettingsToMaterial( metalRoughTexturedSettings, material, context );
99 return true;
100}
101
102Qt3DRender::QTexture2D *QgsMetalRoughTexturedMaterial3DHandler::loadTexture( const QString &path, bool isSrgb, const QgsMaterialContext &context )
103{
104 if ( path.isEmpty() )
105 return nullptr;
106
107 bool fitsInCache = false;
108 QImage image = QgsApplication::imageCache()->pathAsImage( path, QSize(), true, 1.0, fitsInCache );
109 if ( image.isNull() )
110 return nullptr;
111
112 Qt3DRender::QTexture2D *texture = new Qt3DRender::QTexture2D();
113
114 if ( isSrgb )
115 {
116 texture->setFormat( Qt3DRender::QAbstractTexture::SRGB8_Alpha8 );
117 }
118 else
119 {
120 texture->setFormat( Qt3DRender::QAbstractTexture::RGBA8_UNorm );
121 }
122
123 texture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::Repeat );
124 texture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::Repeat );
125 Qgs3DUtils::setTextureFiltering( texture, context );
126
127 // texture takes ownership of textureImage
128 texture->addTextureImage( new QgsImageTexture( image ) );
129
130 return texture;
131}
132
133void QgsMetalRoughTexturedMaterial3DHandler::applySettingsToMaterial( const QgsMetalRoughTexturedMaterialSettings *texturedSettings, QgsMetalRoughMaterial *material, const QgsMaterialContext &context )
134{
135 material->setTextureScale( static_cast<float>( texturedSettings->textureScale() ) );
136 material->setTextureRotation( static_cast<float>( texturedSettings->textureRotation() ) );
137
138 // base color
139 if ( Qt3DRender::QTexture2D *baseTex = loadTexture( texturedSettings->baseColorTexturePath(), true, context ) )
140 {
141 // takes ownership of texture
142 material->setBaseColorTexture( baseTex );
143 }
144 else
145 {
146 // fallback to default solid color if no texture specified
147 material->setBaseColor( QColor( "grey" ) );
148 }
149
150 // metalness
151 if ( Qt3DRender::QTexture2D *metalTex = loadTexture( texturedSettings->metalnessTexturePath(), false, context ) )
152 {
153 // takes ownership of texture
154 material->setMetalnessTexture( metalTex );
155 }
156 else
157 {
158 // fallback to constant default value if no texture specified
159 material->setMetalness( 0.0 );
160 }
161
162 // roughness
163 if ( Qt3DRender::QTexture2D *roughTex = loadTexture( texturedSettings->roughnessTexturePath(), false, context ) )
164 {
165 // takes ownership of texture
166 material->setRoughnessTexture( roughTex );
167 }
168 else
169 {
170 // fallback to constant default value if no texture specified
171 material->setRoughness( 0.5 );
172 }
173
174 if ( Qt3DRender::QTexture2D *normalTex = loadTexture( texturedSettings->normalTexturePath(), false, context ) )
175 {
176 // takes ownership of texture
177 material->setNormalTexture( normalTex );
178 }
179 else
180 {
181 // default to none
182 material->setNormalTexture( nullptr );
183 }
184
185 if ( Qt3DRender::QTexture2D *heightTex = loadTexture( texturedSettings->heightTexturePath(), false, context ) )
186 {
187 material->setHeightTexture( heightTex );
188 }
189 else
190 {
191 // default to none
192 material->setHeightTexture( nullptr );
193 }
194 material->setParallaxScale( texturedSettings->parallaxScale() );
195
196 // ambient occlusion
197 if ( Qt3DRender::QTexture2D *aoTex = loadTexture( texturedSettings->ambientOcclusionTexturePath(), false, context ) )
198 {
199 // takes ownership of texture
200 material->setAmbientOcclusionTexture( aoTex );
201 }
202 else
203 {
204 // default to none
205 material->setAmbientOcclusionTexture( nullptr );
206 }
207
208 if ( Qt3DRender::QTexture2D *emissionTex = loadTexture( texturedSettings->emissionTexturePath(), true, context ) )
209 {
210 material->setEmissionTexture( emissionTex );
211 }
212 else
213 {
214 // default to none
215 material->setEmissionTexture( nullptr );
216 }
217
218 material->setEmissionFactor( texturedSettings->emissionFactor() );
219 material->setOpacity( static_cast< float >( texturedSettings->opacity() ) );
220};
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4342
@ Triangles
Triangle based rendering (default).
Definition qgis.h:4343
@ TrianglesDataDefined
Triangle based rendering with possibility of datadefined color.
Definition qgis.h:4349
@ InstancedPoints
Instanced based rendering, requiring triangles and point data.
Definition qgis.h:4345
QFlags< InstancedMaterialFlag > InstancedMaterialFlags
Definition qgis.h:4365
static void setTextureFiltering(Qt3DRender::QAbstractTexture *texture, const QgsMaterialContext &context)
Sets the default filtering options for a texture.
Abstract base class for material settings.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
QImage pathAsImage(const QString &path, const QSize size, const bool keepAspectRatio, const double opacity, bool &fitsInCache, bool blocking=false, double targetDpi=96, int frameNumber=-1, bool *isMissing=nullptr)
Returns the specified path rendered as an image.
Context settings for a material.
bool isHighlighted() const
Returns true if the material should represent a highlighted state.
bool isPreview() const
Returns true if the material is being shown in a preview widget.
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:40
bool updatePreviewScene(Qt3DCore::QEntity *sceneRoot, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &context) const override
Updates an existing material preview scene with new material settings.
QgsMaterial * toInstancedMaterial(const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &context, Qgis::InstancedMaterialFlags flags) const override
Creates a QgsMaterial for instanced point rendering.
QMap< QString, QString > toExportParameters(const QgsAbstractMaterialSettings *settings) const override
Returns the parameters to be exported to .mtl file.
QgsMaterial * toMaterial(const QgsAbstractMaterialSettings *settings, Qgis::MaterialRenderingTechnique technique, const QgsMaterialContext &context) const override
Creates a new QgsMaterial object representing the material settings.
A PBR metal rough shading material used for rendering with support for image texture maps.
double emissionFactor() const
Returns the emission factor, which dictates the strength of the emission effect.
QString roughnessTexturePath() const
Returns the path to the roughness texture map.
double textureRotation() const
Returns the texture rotation, in degrees.
double textureScale() const
Returns the texture scale.
double opacity() const
Returns the opacity of the surface.
QString normalTexturePath() const
Returns the path to the normal texture map.
QString ambientOcclusionTexturePath() const
Returns the path to the ambient occlusion texture map.
QString metalnessTexturePath() const
Returns the path to the metalness texture map.
QString baseColorTexturePath() const
Returns the path to the base color texture map.
QString heightTexturePath() const
Returns the path to the height texture map.
QString emissionTexturePath() const
Returns the path to the emission/luminosity texture map.
double parallaxScale() const
Returns the parallax scale, which dictates the strength of the height displacement effect.