QGIS API Documentation 4.3.0-Master (bf28115e945)
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"
25#include "qgsapplication.h"
28#include "qgsline3dsymbol.h"
29#include "qgsline3dsymbol_p.h"
30#include "qgsmaterialregistry.h"
37#include "qgspoint3dsymbol.h"
38#include "qgspoint3dsymbol_p.h"
40#include "qgspolygon3dsymbol.h"
45#include "qgssettingstree.h"
47#include "qgsstyle.h"
49#include "qgsunlitmaterial.h"
51
52#include <QString>
53
54using namespace Qt::StringLiterals;
55
56const QgsSettingsEntryBool *Qgs3D::settingMsaaEnabled = new QgsSettingsEntryBool( u"msaa-enabled"_s, QgsSettingsTree::sTree3DMap, true, u"Whether MSAA is enabled for 3D map rendering"_s );
60 = new QgsSettingsEntryEnumFlag<Qgis::ShadowQuality>( u"shadow-quality"_s, QgsSettingsTree::sTree3DMap, Qgis::ShadowQuality::High, u"Shadow rendering quality"_s );
61
63{
64 static Qgs3D *sInstance( new Qgs3D() );
65 return sInstance;
66}
67
69{
71 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( nullptr );
72 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( nullptr );
73 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( nullptr );
74 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( nullptr );
75 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( nullptr );
76 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( nullptr );
77}
78
80{
81 if ( instance()->mInitialized )
82 return;
83
84 instance()->mInitialized = true;
85
87
88 instance()->mNullMaterialHandler = std::make_unique< QgsNullMaterial3DHandler >();
89 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( instance()->mNullMaterialHandler.get() );
90
91 instance()->mPhongMaterialHandler = std::make_unique< QgsPhongMaterial3DHandler >();
92 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( instance()->mPhongMaterialHandler.get() );
93
94 instance()->mPhongTexturedMaterialHandler = std::make_unique< QgsPhongTexturedMaterial3DHandler >();
95 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( instance()->mPhongTexturedMaterialHandler.get() );
96
97 instance()->mSimpleLineMaterialHandler = std::make_unique< QgsSimpleLineMaterial3DHandler >();
98 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( instance()->mSimpleLineMaterialHandler.get() );
99
100 instance()->mGoochMaterialHandler = std::make_unique< QgsGoochMaterial3DHandler >();
101 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( instance()->mGoochMaterialHandler.get() );
102
103 instance()->mMetalRoughMaterialHandler = std::make_unique< QgsMetalRoughMaterial3DHandler >();
104 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( instance()->mMetalRoughMaterialHandler.get() );
105
106 instance()->mMetalRoughTexturedMaterialHandler = std::make_unique< QgsMetalRoughTexturedMaterial3DHandler >();
107 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalroughtextured"_s ) )->setHandler( instance()->mMetalRoughTexturedMaterialHandler.get() );
108
116
117 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"point"_s, QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) );
118 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"line"_s, QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) );
119 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"polygon"_s, QObject::tr( "Polygon" ), &QgsPolygon3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPolygon3DSymbol ) );
120
121
122 // because we are usually populating the 3d registry AFTER QgsApplication initialization, we need to defer creation
123 // of 3d symbols in the default style until now
124 QgsStyle::defaultStyle()->handleDeferred3DSymbolCreation();
125}
126
131
133{
134 return instance()->mTerrainRegistry;
135}
136
138{
139 if ( !settings )
140 return nullptr;
141
142 const QgsAbstractMaterial3DHandler *handler = nullptr;
143 if ( const QgsMaterialSettingsMetadata *metadata = dynamic_cast< const QgsMaterialSettingsMetadata * >( QgsApplication::materialRegistry()->materialSettingsMetadata( settings->type() ) ) )
144 {
145 handler = metadata->handler();
146 }
147 if ( !handler )
148 {
149 QgsDebugError( u"No handler registered for %1"_s.arg( settings->type() ) );
150 }
151 return handler;
152}
153
155{
156 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
157 {
158 return handler->toMaterial( settings, technique, context );
159 }
160 return nullptr;
161}
162
164{
165 auto highlightMaterial = new QgsUnlitMaterial();
166
167 const QgsSettings settings;
168 const float alpha = settings.value( u"Map/highlight/colorAlpha"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.alpha() ).toFloat() / 255.f;
169 QColor color = QColor( settings.value( u"Map/highlight/color"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.name() ).toString() );
170 color.setAlphaF( alpha );
171 highlightMaterial->setColor( color );
172
173 return highlightMaterial;
174}
175
177{
178 mTerrainRegistry = new Qgs3DTerrainRegistry();
179}
@ Anisotropic16x
Anisotropic filtering (16x).
Definition qgis.h:4425
@ High
High quality.
Definition qgis.h:4438
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
Definition qgis.h:6941
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4388
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:79
static Qgs3DTerrainRegistry * terrainRegistry()
Returns the terrain registry, used for managing 3D terrains.
Definition qgs3d.cpp:132
static const QgsSettingsEntryEnumFlag< Qgis::TextureFilterQuality > * settingTextureFilterQuality
Definition qgs3d.h:60
static QgsMaterial * toMaterial(const QgsAbstractMaterialSettings *settings, Qgis::MaterialRenderingTechnique technique, const QgsMaterialContext &context)
Creates a new QgsMaterial object representing the material settings.
Definition qgs3d.cpp:154
static const QgsSettingsEntryBool * settingMsaaEnabled
Definition qgs3d.h:59
static QgsMaterialRegistry * materialRegistry()
Returns the material registry, used for managing 3D materials.
Definition qgs3d.cpp:127
static Qgs3D * instance()
Returns a pointer to the singleton instance.
Definition qgs3d.cpp:62
static QgsUnlitMaterial * createHighlightMaterial()
Creates a new highlight material, consisting of an unlit material respecting the user's map highlight...
Definition qgs3d.cpp:163
static const QgsAbstractMaterial3DHandler * handlerForMaterialSettings(const QgsAbstractMaterialSettings *settings)
Returns the handler to use for a material settings.
Definition qgs3d.cpp:137
Qgs3D(const Qgs3D &other)=delete
static const QgsSettingsEntryEnumFlag< Qgis::ShadowQuality > * settingShadowQuality
Definition qgs3d.h:61
~Qgs3D()
Definition qgs3d.cpp:68
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.
Metadata for Categorized 3D renderer to allow creation of its instances from XML.
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
Stores settings for use within QGIS.
Definition qgssettings.h:68
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
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:71