QGIS API Documentation 4.1.0-Master (3b8ef1f72a3)
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"
42#include "qgsstyle.h"
45
46#include <QString>
47
48using namespace Qt::StringLiterals;
49
51{
52 static Qgs3D *sInstance( new Qgs3D() );
53 return sInstance;
54}
55
57{
59 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( nullptr );
60 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( nullptr );
61 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( nullptr );
62 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( nullptr );
63 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( nullptr );
64 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( nullptr );
65}
66
68{
69 if ( instance()->mInitialized )
70 return;
71
72 instance()->mInitialized = true;
73
75
76 instance()->mNullMaterialHandler = std::make_unique< QgsNullMaterial3DHandler >();
77 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"null"_s ) )->setHandler( instance()->mNullMaterialHandler.get() );
78
79 instance()->mPhongMaterialHandler = std::make_unique< QgsPhongMaterial3DHandler >();
80 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phong"_s ) )->setHandler( instance()->mPhongMaterialHandler.get() );
81
82 instance()->mPhongTexturedMaterialHandler = std::make_unique< QgsPhongTexturedMaterial3DHandler >();
83 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"phongtextured"_s ) )->setHandler( instance()->mPhongTexturedMaterialHandler.get() );
84
85 instance()->mSimpleLineMaterialHandler = std::make_unique< QgsSimpleLineMaterial3DHandler >();
86 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"simpleline"_s ) )->setHandler( instance()->mSimpleLineMaterialHandler.get() );
87
88 instance()->mGoochMaterialHandler = std::make_unique< QgsGoochMaterial3DHandler >();
89 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"gooch"_s ) )->setHandler( instance()->mGoochMaterialHandler.get() );
90
91 instance()->mMetalRoughMaterialHandler = std::make_unique< QgsMetalRoughMaterial3DHandler >();
92 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalrough"_s ) )->setHandler( instance()->mMetalRoughMaterialHandler.get() );
93
94 instance()->mMetalRoughTexturedMaterialHandler = std::make_unique< QgsMetalRoughTexturedMaterial3DHandler >();
95 qgis::down_cast< QgsMaterialSettingsMetadata * >( materialRegistry->materialSettingsMetadata( u"metalroughtextured"_s ) )->setHandler( instance()->mMetalRoughTexturedMaterialHandler.get() );
96
103
104 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"point"_s, QObject::tr( "Point" ), &QgsPoint3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPoint3DSymbol ) );
105 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"line"_s, QObject::tr( "Line" ), &QgsLine3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForLine3DSymbol ) );
106 QgsApplication::symbol3DRegistry()->addSymbolType( new Qgs3DSymbolMetadata( u"polygon"_s, QObject::tr( "Polygon" ), &QgsPolygon3DSymbol::create, nullptr, Qgs3DSymbolImpl::handlerForPolygon3DSymbol ) );
107
108
109 // because we are usually populating the 3d registry AFTER QgsApplication initialization, we need to defer creation
110 // of 3d symbols in the default style until now
111 QgsStyle::defaultStyle()->handleDeferred3DSymbolCreation();
112}
113
118
120{
121 return instance()->mTerrainRegistry;
122}
123
125{
126 if ( !settings )
127 return nullptr;
128
129 const QgsAbstractMaterial3DHandler *handler = nullptr;
130 if ( const QgsMaterialSettingsMetadata *metadata = dynamic_cast< const QgsMaterialSettingsMetadata * >( QgsApplication::materialRegistry()->materialSettingsMetadata( settings->type() ) ) )
131 {
132 handler = metadata->handler();
133 }
134 if ( !handler )
135 {
136 QgsDebugError( u"No handler registered for %1"_s.arg( settings->type() ) );
137 }
138 return handler;
139}
140
142{
143 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
144 {
145 return handler->toMaterial( settings, technique, context );
146 }
147 return nullptr;
148}
149
150QMap<QString, QString> Qgs3D::toMaterialExportParameters( const QgsAbstractMaterialSettings *settings )
151{
152 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
153 {
154 return handler->toExportParameters( settings );
155 }
156 return {};
157}
158
159void Qgs3D::addMaterialParametersToEffect( Qt3DRender::QEffect *effect, const QgsAbstractMaterialSettings *settings, const QgsMaterialContext &materialContext )
160{
161 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
162 {
163 handler->addParametersToEffect( effect, settings, materialContext );
164 }
165}
166
167void Qgs3D::applyMaterialDataDefinedToGeometry( const QgsAbstractMaterialSettings *settings, Qt3DCore::QGeometry *geometry, int vertexCount, const QByteArray &dataDefinedBytes )
168{
169 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
170 {
171 handler->applyDataDefinedToGeometry( settings, geometry, vertexCount, dataDefinedBytes );
172 }
173}
174
176{
177 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
178 {
179 return handler->dataDefinedVertexColorsAsByte( settings, expressionContext );
180 }
181 return QByteArray();
182}
183
185{
186 if ( const QgsAbstractMaterial3DHandler *handler = handlerForMaterialSettings( settings ) )
187 {
188 return handler->dataDefinedByteStride( settings );
189 }
190 return 0;
191}
192
194{
195 mTerrainRegistry = new Qgs3DTerrainRegistry();
196}
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4327
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:67
static QMap< QString, QString > toMaterialExportParameters(const QgsAbstractMaterialSettings *settings)
Returns the parameters to be exported to .mtl file.
Definition qgs3d.cpp:150
static Qgs3DTerrainRegistry * terrainRegistry()
Returns the terrain registry, used for managing 3D terrains.
Definition qgs3d.cpp:119
static QgsMaterial * toMaterial(const QgsAbstractMaterialSettings *settings, Qgis::MaterialRenderingTechnique technique, const QgsMaterialContext &context)
Creates a new QgsMaterial object representing the material settings.
Definition qgs3d.cpp:141
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:159
static QgsMaterialRegistry * materialRegistry()
Returns the material registry, used for managing 3D materials.
Definition qgs3d.cpp:114
static Qgs3D * instance()
Returns a pointer to the singleton instance.
Definition qgs3d.cpp:50
static const QgsAbstractMaterial3DHandler * handlerForMaterialSettings(const QgsAbstractMaterialSettings *settings)
Returns the handler to use for a material settings.
Definition qgs3d.cpp:124
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:175
~Qgs3D()
Definition qgs3d.cpp:56
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:184
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:167
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.
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