QGIS API Documentation 4.1.0-Master (64dc32379c2)
Loading...
Searching...
No Matches
qgs3d.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgs3d.cpp
3 ----------
4 begin : July 2020
5 copyright : (C) 2020 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgs3d.h"
19
21#include "qgs3dsymbolregistry.h"
24#include "qgsapplication.h"
26#include "qgsline3dsymbol.h"
27#include "qgsline3dsymbol_p.h"
28#include "qgsmaterialregistry.h"
35#include "qgspoint3dsymbol.h"
36#include "qgspoint3dsymbol_p.h"
38#include "qgspolygon3dsymbol.h"
43#include "qgssettingstree.h"
45#include "qgsstyle.h"
48
49#include <QString>
50
51using namespace Qt::StringLiterals;
52
53const QgsSettingsEntryBool *Qgs3D::settingMsaaEnabled = new QgsSettingsEntryBool( u"msaa-enabled"_s, QgsSettingsTree::sTree3DMap, false, u"Whether MSAA is enabled for 3D map rendering"_s );
56
58{
59 static Qgs3D *sInstance( new Qgs3D() );
60 return sInstance;
61}
62
64{
66 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( nullptr );
67 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( nullptr );
68 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( nullptr );
69 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( nullptr );
70 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( nullptr );
71 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( nullptr );
72}
73
75{
76 if ( instance()->mInitialized )
77 return;
78
79 instance()->mInitialized = true;
80
82
83 instance()->mNullMaterialHandler = std::make_unique< QgsNullMaterial3DHandler >();
84 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( instance()->mNullMaterialHandler.get() );
85
86 instance()->mPhongMaterialHandler = std::make_unique< QgsPhongMaterial3DHandler >();
87 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( instance()->mPhongMaterialHandler.get() );
88
89 instance()->mPhongTexturedMaterialHandler = std::make_unique< QgsPhongTexturedMaterial3DHandler >();
90 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( instance()->mPhongTexturedMaterialHandler.get() );
91
92 instance()->mSimpleLineMaterialHandler = std::make_unique< QgsSimpleLineMaterial3DHandler >();
93 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( instance()->mSimpleLineMaterialHandler.get() );
94
95 instance()->mGoochMaterialHandler = std::make_unique< QgsGoochMaterial3DHandler >();
96 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( instance()->mGoochMaterialHandler.get() );
97
98 instance()->mMetalRoughMaterialHandler = std::make_unique< QgsMetalRoughMaterial3DHandler >();
99 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( instance()->mMetalRoughMaterialHandler.get() );
100
101 instance()->mMetalRoughTexturedMaterialHandler = std::make_unique< QgsMetalRoughTexturedMaterial3DHandler >();
102 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalroughtextured"_s ) )->setHandler( instance()->mMetalRoughTexturedMaterialHandler.get() );
103
110
111 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"point"_s, QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) );
112 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"line"_s, QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) );
113 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"polygon"_s, QObject::tr( "Polygon" ), &QgsPolygon3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPolygon3DSymbol ) );
114
115
116 // because we are usually populating the 3d registry AFTER QgsApplication initialization, we need to defer creation
117 // of 3d symbols in the default style until now
118 QgsStyle::defaultStyle()->handleDeferred3DSymbolCreation();
119}
120
125
127{
128 return instance()->mTerrainRegistry;
129}
130
132{
133 if ( !settings )
134 return nullptr;
135
136 const QgsAbstractMaterial3DHandler *handler = nullptr;
137 if ( const QgsMaterialSettingsMetadata *metadata = dynamic_cast< const QgsMaterialSettingsMetadata * >( QgsApplication::materialRegistry()->materialSettingsMetadata( settings->type() ) ) )
138 {
139 handler = metadata->handler();
140 }
141 if ( !handler )
142 {
143 QgsDebugError( u"No handler registered for %1"_s.arg( settings->type() ) );
144 }
145 return handler;
146}
147
149{
150 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
151 {
152 return handler->toMaterial( settings, technique, context );
153 }
154 return nullptr;
155}
156
157QMap<QString, QString> Qgs3D::toMaterialExportParameters( const QgsAbstractMaterialSettings *settings )
158{
159 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
160 {
161 return handler->toExportParameters( settings );
162 }
163 return {};
164}
165
166void Qgs3D::addMaterialParametersToEffect( Qt3DRender::QEffect *effect, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &materialContext )
167{
168 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
169 {
170 handler->addParametersToEffect( effect, settings, materialContext );
171 }
172}
173
174void Qgs3D::applyMaterialDataDefinedToGeometry( const QgsAbstractMaterialSettings *settings, Qt3DCore::QGeometry *geometry, int vertexCount, const QByteArray &dataDefinedBytes )
175{
176 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
177 {
178 handler->applyDataDefinedToGeometry( settings, geometry, vertexCount, dataDefinedBytes );
179 }
180}
181
183{
184 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
185 {
186 return handler->dataDefinedVertexColorsAsByte( settings, expressionContext );
187 }
188 return QByteArray();
189}
190
192{
193 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
194 {
195 return handler->dataDefinedByteStride( settings );
196 }
197 return 0;
198}
199
201{
202 mTerrainRegistry = new Qgs3DTerrainRegistry();
203}
@ Anisotropic16x
Anisotropic filtering (16x).
Definition qgis.h:4365
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4342
void addRenderer(Qgs3DRendererAbstractMetadata *metadata)
Registers a new 3D renderer type.
Convenience metadata class that uses static functions to create a 3D symbol and its widget.
bool addSymbolType(Qgs3DSymbolAbstractMetadata *metadata)
Registers a new symbol type. Takes ownership of the metadata instance.
Registry of available 3d terrain classes.
static void initialize()
Initializes the 3D framework.
Definition qgs3d.cpp:74
static QMap< QString, QString > toMaterialExportParameters(const QgsAbstractMaterialSettings *settings)
Returns the parameters to be exported to .mtl file.
Definition qgs3d.cpp:157
static Qgs3DTerrainRegistry * terrainRegistry()
Returns the terrain registry, used for managing 3D terrains.
Definition qgs3d.cpp:126
static const QgsSettingsEntryEnumFlag< Qgis::TextureFilterQuality > * settingTextureFilterQuality
Definition qgs3d.h:59
static QgsMaterial * toMaterial(const QgsAbstractMaterialSettings *settings, Qgis::MaterialRenderingTechnique technique, const QgsMaterialContext &context)
Creates a new QgsMaterial object representing the material settings.
Definition qgs3d.cpp:148
static void addMaterialParametersToEffect(Qt3DRender::QEffect *effect, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &materialContext)
Adds parameters from the material settings to a destination effect.
Definition qgs3d.cpp:166
static const QgsSettingsEntryBool * settingMsaaEnabled
Definition qgs3d.h:58
static QgsMaterialRegistry * materialRegistry()
Returns the material registry, used for managing 3D materials.
Definition qgs3d.cpp:121
static Qgs3D * instance()
Returns a pointer to the singleton instance.
Definition qgs3d.cpp:57
static const QgsAbstractMaterial3DHandler * handlerForMaterialSettings(const QgsAbstractMaterialSettings *settings)
Returns the handler to use for a material settings.
Definition qgs3d.cpp:131
Qgs3D(const Qgs3D &other)=delete
static QByteArray materialDataDefinedVertexColorsAsByte(const QgsAbstractMaterialSettings *settings, const QgsExpressionContext &expressionContext)
Returns byte array corresponding to the data defined colors depending of the expressionContext,...
Definition qgs3d.cpp:182
~Qgs3D()
Definition qgs3d.cpp:63
static int materialDataDefinedByteStride(const QgsAbstractMaterialSettings *settings)
Returns byte stride of the data defined colors,used to fill the vertex colors data defined buffer for...
Definition qgs3d.cpp:191
static void applyMaterialDataDefinedToGeometry(const QgsAbstractMaterialSettings *settings, Qt3DCore::QGeometry *geometry, int vertexCount, const QByteArray &dataDefinedBytes)
Applies the data defined bytes, dataDefinedBytes, on the geometry by filling a specific vertex buffer...
Definition qgs3d.cpp:174
Abstract base class for material 3D handlers.
Abstract base class for material settings.
virtual QString type() const =0
Returns the unique type name for the material.
Metadata for annotation layer 3D renderer to allow creation of its instances from XML.
static QgsMaterialRegistry * materialRegistry()
Returns registry of available 3D materials.
static Qgs3DSymbolRegistry * symbol3DRegistry()
Returns registry of available 3D symbols.
static Qgs3DRendererRegistry * renderer3DRegistry()
Returns registry of available 3D renderers.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static QgsAbstract3DSymbol * create() SIP_FACTORY
Creates a new QgsLine3DSymbol.
Context settings for a material.
Registry of available 3d material settings classes.
Convenience metadata class that uses static functions to create a 3D material settings object and its...
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:40
Metadata for mesh layer 3D renderer to allow creation of its instances from XML.
static QgsAbstract3DSymbol * create()
Creates a new QgsPoint3DSymbol.
Metadata for point cloud layer 3D renderer to allow creation of its instances from XML.
static QgsAbstract3DSymbol * create() SIP_FACTORY
Creates a new QgsPolygon3DSymbol.
Metadata for rule-based 3D renderer to allow creation of its instances from XML.
A boolean settings entry.
A template class for enum and flag settings entry.
static QgsSettingsTreeNode * sTree3DMap
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
Definition qgsstyle.cpp:164
Metadata for tiled scene layer 3D renderer to allow creation of its instances from XML.
Metadata for vector layer 3D renderer to allow creation of its instances from XML.
#define QgsDebugError(str)
Definition qgslogger.h:59