QGIS API Documentation 4.3.0-Master (0978c174f8e)
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"
52
53#include <QString>
54
55using namespace Qt::StringLiterals;
56
57const QgsSettingsEntryBool *Qgs3D::settingMsaaEnabled = new QgsSettingsEntryBool( u"msaa-enabled"_s, QgsSettingsTree::sTree3DMap, true, u"Whether MSAA is enabled for 3D map rendering"_s );
61 = new QgsSettingsEntryEnumFlag<Qgis::ShadowQuality>( u"shadow-quality"_s, QgsSettingsTree::sTree3DMap, Qgis::ShadowQuality::High, u"Shadow rendering quality"_s );
62
64{
65 static Qgs3D *sInstance( new Qgs3D() );
66 return sInstance;
67}
68
70{
72 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( nullptr );
73 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( nullptr );
74 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( nullptr );
75 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( nullptr );
76 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( nullptr );
77 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( nullptr );
78 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"unlit"_s ) )->setHandler( nullptr );
79}
80
82{
83 if ( instance()->mInitialized )
84 return;
85
86 instance()->mInitialized = true;
87
89
90 instance()->mNullMaterialHandler = std::make_unique< QgsNullMaterial3DHandler >();
91 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( instance()->mNullMaterialHandler.get() );
92
93 instance()->mPhongMaterialHandler = std::make_unique< QgsPhongMaterial3DHandler >();
94 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( instance()->mPhongMaterialHandler.get() );
95
96 instance()->mPhongTexturedMaterialHandler = std::make_unique< QgsPhongTexturedMaterial3DHandler >();
97 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( instance()->mPhongTexturedMaterialHandler.get() );
98
99 instance()->mSimpleLineMaterialHandler = std::make_unique< QgsSimpleLineMaterial3DHandler >();
100 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( instance()->mSimpleLineMaterialHandler.get() );
101
102 instance()->mGoochMaterialHandler = std::make_unique< QgsGoochMaterial3DHandler >();
103 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( instance()->mGoochMaterialHandler.get() );
104
105 instance()->mMetalRoughMaterialHandler = std::make_unique< QgsMetalRoughMaterial3DHandler >();
106 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( instance()->mMetalRoughMaterialHandler.get() );
107
108 instance()->mMetalRoughTexturedMaterialHandler = std::make_unique< QgsMetalRoughTexturedMaterial3DHandler >();
109 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalroughtextured"_s ) )->setHandler( instance()->mMetalRoughTexturedMaterialHandler.get() );
110
111 instance()->mUnlitMaterialHandler = std::make_unique< QgsUnlitMaterial3DHandler >();
112 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"unlit"_s ) )->setHandler( instance()->mUnlitMaterialHandler.get() );
113
121
122 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"point"_s, QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) );
123 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"line"_s, QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) );
124 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"polygon"_s, QObject::tr( "Polygon" ), &QgsPolygon3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPolygon3DSymbol ) );
125
126
127 // because we are usually populating the 3d registry AFTER QgsApplication initialization, we need to defer creation
128 // of 3d symbols in the default style until now
129 QgsStyle::defaultStyle()->handleDeferred3DSymbolCreation();
130}
131
136
138{
139 return instance()->mTerrainRegistry;
140}
141
143{
144 if ( !settings )
145 return nullptr;
146
147 const QgsAbstractMaterial3DHandler *handler = nullptr;
148 if ( const QgsMaterialSettingsMetadata *metadata = dynamic_cast< const QgsMaterialSettingsMetadata * >( QgsApplication::materialRegistry()->materialSettingsMetadata( settings->type() ) ) )
149 {
150 handler = metadata->handler();
151 }
152 if ( !handler )
153 {
154 QgsDebugError( u"No handler registered for %1"_s.arg( settings->type() ) );
155 }
156 return handler;
157}
158
160{
161 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
162 {
163 return handler->toMaterial( settings, technique, context );
164 }
165 return nullptr;
166}
167
169{
170 auto highlightMaterial = new QgsUnlitMaterial();
171
172 const QgsSettings settings;
173 const float alpha = settings.value( u"Map/highlight/colorAlpha"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.alpha() ).toFloat() / 255.f;
174 QColor color = QColor( settings.value( u"Map/highlight/color"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.name() ).toString() );
175 color.setAlphaF( alpha );
176 highlightMaterial->setColor( color );
177
178 return highlightMaterial;
179}
180
182{
183 mTerrainRegistry = new Qgs3DTerrainRegistry();
184}
@ Anisotropic16x
Anisotropic filtering (16x).
Definition qgis.h:4441
@ High
High quality.
Definition qgis.h:4454
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
Definition qgis.h:6976
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4404
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:81
static Qgs3DTerrainRegistry * terrainRegistry()
Returns the terrain registry, used for managing 3D terrains.
Definition qgs3d.cpp:137
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:159
static const QgsSettingsEntryBool * settingMsaaEnabled
Definition qgs3d.h:59
static QgsMaterialRegistry * materialRegistry()
Returns the material registry, used for managing 3D materials.
Definition qgs3d.cpp:132
static Qgs3D * instance()
Returns a pointer to the singleton instance.
Definition qgs3d.cpp:63
static QgsUnlitMaterial * createHighlightMaterial()
Creates a new highlight material, consisting of an unlit material respecting the user's map highlight...
Definition qgs3d.cpp:168
static const QgsAbstractMaterial3DHandler * handlerForMaterialSettings(const QgsAbstractMaterialSettings *settings)
Returns the handler to use for a material settings.
Definition qgs3d.cpp:142
Qgs3D(const Qgs3D &other)=delete
static const QgsSettingsEntryEnumFlag< Qgis::ShadowQuality > * settingShadowQuality
Definition qgs3d.h:61
~Qgs3D()
Definition qgs3d.cpp:69
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