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>
35using namespace Qt::StringLiterals;
40 Q_ASSERT( texturedSettings );
54 return new QgsHighlightMaterial();
57 QgsMetalRoughMaterial *material =
new QgsMetalRoughMaterial(
nullptr );
58 material->setEnvironmentalLightingEnabled( !context.
isPreview() );
59 material->setObjectName( u
"metalRoughTexturedMaterial"_s );
60 applySettingsToMaterial( texturedSettings, material, context );
76 QgsMetalRoughMaterial *material =
new QgsMetalRoughMaterial();
77 material->setEnvironmentalLightingEnabled(
true );
78 material->setInstancingEnabled(
true, flags );
79 material->setInstancingMeshTransform( transform );
81 material->setObjectName( u
"metalRoughTexturedMaterial"_s );
82 applySettingsToMaterial( texturedSettings, material, context );
89 QMap<QString, QString> parameters;
97 QgsMetalRoughMaterial *material = sceneRoot->findChild<QgsMetalRoughMaterial *>();
98 if ( !material || material->objectName() !=
"metalRoughTexturedMaterial"_L1 )
101 applySettingsToMaterial( metalRoughTexturedSettings, material, context );
105Qt3DRender::QTexture2D *QgsMetalRoughTexturedMaterial3DHandler::loadTexture(
const QString &path,
bool isSrgb,
const QgsMaterialContext &context )
107 if ( path.isEmpty() )
110 bool fitsInCache =
false;
112 if ( image.isNull() )
115 Qt3DRender::QTexture2D *texture =
new Qt3DRender::QTexture2D();
119 texture->setFormat( Qt3DRender::QAbstractTexture::SRGB8_Alpha8 );
123 texture->setFormat( Qt3DRender::QAbstractTexture::RGBA8_UNorm );
126 texture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::Repeat );
127 texture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::Repeat );
131 texture->addTextureImage(
new QgsImageTexture( image ) );
138 material->setTextureScale(
static_cast<float>( texturedSettings->
textureScale() ) );
139 material->setTextureRotation(
static_cast<float>( texturedSettings->
textureRotation() ) );
140 material->setTextureOffset(
static_cast<float>( texturedSettings->
textureOffset().x() ),
static_cast<float>( texturedSettings->
textureOffset().y() ) );
143 if ( Qt3DRender::QTexture2D *baseTex = loadTexture( texturedSettings->
baseColorTexturePath(),
true, context ) )
146 material->setBaseColorTexture( baseTex );
151 material->setBaseColor( QColor(
"grey" ) );
155 if ( Qt3DRender::QTexture2D *metalTex = loadTexture( texturedSettings->
metalnessTexturePath(),
false, context ) )
158 material->setMetalnessTexture( metalTex );
163 material->setMetalness( 0.0 );
167 if ( Qt3DRender::QTexture2D *roughTex = loadTexture( texturedSettings->
roughnessTexturePath(),
false, context ) )
170 material->setRoughnessTexture( roughTex );
175 material->setRoughness( 0.5 );
178 if ( Qt3DRender::QTexture2D *normalTex = loadTexture( texturedSettings->
normalTexturePath(),
false, context ) )
181 material->setNormalTexture( normalTex );
186 material->setNormalTexture(
nullptr );
189 if ( Qt3DRender::QTexture2D *heightTex = loadTexture( texturedSettings->
heightTexturePath(),
false, context ) )
191 material->setHeightTexture( heightTex );
196 material->setHeightTexture(
nullptr );
198 material->setParallaxScale( texturedSettings->
parallaxScale() );
204 material->setAmbientOcclusionTexture( aoTex );
209 material->setAmbientOcclusionTexture(
nullptr );
212 if ( Qt3DRender::QTexture2D *emissionTex = loadTexture( texturedSettings->
emissionTexturePath(),
true, context ) )
214 material->setEmissionTexture( emissionTex );
219 material->setEmissionTexture(
nullptr );
222 material->setEmissionFactor( texturedSettings->
emissionFactor() );
223 material->setOpacity(
static_cast< float >( texturedSettings->
opacity() ) );
229 material->setDataDefinedTextureTransformEnabled( hasDDTextureTransform );
MaterialRenderingTechnique
Material rendering techniques.
@ Triangles
Triangle based rendering (default).
@ TrianglesDataDefined
Triangle based rendering with possibility of datadefined color.
@ InstancedPoints
Instanced based rendering, requiring triangles and point data.
QFlags< InstancedMaterialFlag > InstancedMaterialFlags
static void setTextureFiltering(Qt3DRender::QAbstractTexture *texture, const QgsMaterialContext &context)
Sets the default filtering options for a texture.
Abstract base class for material settings.
@ TextureOffset
Texture offset.
@ TextureRotation
Texture rotation.
@ TextureScale
Texture scale.
QgsPropertyCollection dataDefinedProperties() const
Returns the symbol material property collection, used for data defined overrides.
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.
bool updatePreviewScene(Qt3DCore::QEntity *sceneRoot, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &context) const override
Updates an existing material preview scene with new material settings.
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.
QgsMaterial * toInstancedMaterial(const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &context, Qgis::InstancedMaterialFlags flags, const QMatrix4x4 &transform=QMatrix4x4()) const override
Creates a QgsMaterial for instanced point rendering.
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.
QPointF textureOffset() const
Returns the texture offset.
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.
bool isActive(int key) const final
Returns true if the collection contains an active property with the specified key.