QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgstiledscenewireframerenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstiledscenewireframerenderer.h
3 --------------------
4 begin : August 2023
5 copyright : (C) 2023 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
19
20#include "qgsfillsymbol.h"
21#include "qgslinesymbol.h"
22#include "qgssymbollayerutils.h"
23
29
31
33{
34 return QStringLiteral( "wireframe" );
35}
36
38{
39 auto res = std::make_unique< QgsTiledSceneWireframeRenderer >();
40
41 res->setFillSymbol( mFillSymbol->clone() );
42 res->setLineSymbol( mLineSymbol->clone() );
43 res->setUseTextureColors( mUseTextureColors );
44
45 copyCommonProperties( res.get() );
46
47 return res.release();
48}
49
51{
52 auto r = std::make_unique< QgsTiledSceneWireframeRenderer >();
53 {
54 const QDomElement fillSymbolElem = element.firstChildElement( QStringLiteral( "fillSymbol" ) );
55 if ( !fillSymbolElem.isNull() )
56 {
57 const QDomElement symbolElem = fillSymbolElem.firstChildElement( QStringLiteral( "symbol" ) );
58 std::unique_ptr< QgsFillSymbol > fillSymbol( QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( symbolElem, context ) );
59 if ( fillSymbol )
60 r->mFillSymbol = std::move( fillSymbol );
61 }
62 }
63 {
64 const QDomElement lineSymbolElem = element.firstChildElement( QStringLiteral( "lineSymbol" ) );
65 if ( !lineSymbolElem.isNull() )
66 {
67 const QDomElement symbolElem = lineSymbolElem.firstChildElement( QStringLiteral( "symbol" ) );
68 std::unique_ptr< QgsLineSymbol > lineSymbol( QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( symbolElem, context ) );
69 if ( lineSymbol )
70 r->mLineSymbol = std::move( lineSymbol );
71 }
72 }
73
74 r->setUseTextureColors( element.attribute( QStringLiteral( "useTextureColors" ), QStringLiteral( "0" ) ).toInt() );
75
76 r->restoreCommonProperties( element, context );
77 return r.release();
78}
79
81{
82 QVariantMap properties;
83 properties.insert( QStringLiteral( "color" ), QStringLiteral( "white" ) );
84 properties.insert( QStringLiteral( "style" ), QStringLiteral( "solid" ) );
85 properties.insert( QStringLiteral( "style_border" ), QStringLiteral( "solid" ) );
86 properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "black" ) );
87 properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "0.3" ) );
88 properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
89
90 return QgsFillSymbol::createSimple( properties );
91}
92
94{
95 return mFillSymbol.get();
96}
97
99{
100 mFillSymbol.reset( symbol );
101}
102
104{
105 QVariantMap properties;
106 properties.insert( QStringLiteral( "color" ), QStringLiteral( "red" ) );
107
108 return QgsLineSymbol::createSimple( properties );
109}
110
112{
113 return mLineSymbol.get();
114}
115
117{
118 mLineSymbol.reset( symbol );
119}
120
122{
123 return mUseTextureColors;
124}
125
127{
128 mUseTextureColors = newUseTextureColors;
129}
130
131QDomElement QgsTiledSceneWireframeRenderer::save( QDomDocument &doc, const QgsReadWriteContext &context ) const
132{
133 QDomElement rendererElem = doc.createElement( QStringLiteral( "renderer" ) );
134
135 rendererElem.setAttribute( QStringLiteral( "type" ), QStringLiteral( "wireframe" ) );
136 rendererElem.setAttribute( QStringLiteral( "useTextureColors" ), mUseTextureColors ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
137
138 {
139 QDomElement fillSymbolElem = doc.createElement( QStringLiteral( "fillSymbol" ) );
140 const QDomElement symbolElement = QgsSymbolLayerUtils::saveSymbol( QString(),
141 mFillSymbol.get(),
142 doc,
143 context );
144 fillSymbolElem.appendChild( symbolElement );
145 rendererElem.appendChild( fillSymbolElem );
146 }
147 {
148 QDomElement lineSymbolElem = doc.createElement( QStringLiteral( "lineSymbol" ) );
149 const QDomElement symbolElement = QgsSymbolLayerUtils::saveSymbol( QString(),
150 mLineSymbol.get(),
151 doc,
152 context );
153 lineSymbolElem.appendChild( symbolElement );
154 rendererElem.appendChild( lineSymbolElem );
155 }
156 saveCommonProperties( rendererElem, context );
157
158 return rendererElem;
159}
160
162{
163 if ( mUseTextureColors )
164 {
165 std::unique_ptr< QgsFillSymbol > s( mFillSymbol->clone() );
166 const QImage textureImage = context.textureImage();
167 if ( !textureImage.isNull() )
168 {
169 float textureX1;
170 float textureY1;
171 float textureX2;
172 float textureY2;
173 float textureX3;
174 float textureY3;
175 context.textureCoordinates( textureX1, textureY1, textureX2, textureY2, textureX3, textureY3 );
176
177 const QColor centerColor( textureImage.pixelColor(
178 static_cast<int>( ( ( textureX1 + textureX2 + textureX3 ) / 3 ) * ( textureImage.width() - 1 ) ),
179 static_cast< int >( ( ( textureY1 + textureY2 + textureY3 ) / 3 ) * ( textureImage.height() - 1 ) ) )
180 );
181 s->setColor( centerColor );
182 }
183 s->startRender( context.renderContext() );
184 s->renderPolygon( triangle, nullptr, nullptr, context.renderContext() );
185 s->stopRender( context.renderContext() );
186 }
187 else
188 {
189 mFillSymbol->renderPolygon( triangle, nullptr, nullptr, context.renderContext() );
190 }
191}
192
194{
195 mLineSymbol->renderPolyline( line, nullptr, context.renderContext() );
196}
197
199{
201
202 if ( !mUseTextureColors )
203 mFillSymbol->startRender( context.renderContext() );
204
205 mLineSymbol->startRender( context.renderContext() );
206}
207
209{
210 if ( !mUseTextureColors )
211 mFillSymbol->stopRender( context.renderContext() );
212
213 mLineSymbol->stopRender( context.renderContext() );
214
216}
217
@ RendersLines
Renderer can render line primitives.
Definition qgis.h:5704
@ RequiresTextures
Renderer requires textures.
Definition qgis.h:5701
@ RendersTriangles
Renderer can render triangle primitives.
Definition qgis.h:5703
QFlags< TiledSceneRendererFlag > TiledSceneRendererFlags
Flags which control how tiled scene 2D renderers behave.
Definition qgis.h:5713
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
A line symbol type, for rendering LineString and MultiLineString geometries.
static std::unique_ptr< QgsLineSymbol > createSimple(const QVariantMap &properties)
Create a line symbol with one symbol layer: SimpleLine with specified properties.
A container for the context for various read/write operations on objects.
static std::unique_ptr< QgsSymbol > loadSymbol(const QDomElement &element, const QgsReadWriteContext &context)
Attempts to load a symbol from a DOM element.
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Encapsulates the render context for a 2D tiled scene rendering operation.
void textureCoordinates(float &textureX1, float &textureY1, float &textureX2, float &textureY2, float &textureX3, float &textureY3) const
Returns the current texture coordinates.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
QImage textureImage() const
Returns the current texture image.
void saveCommonProperties(QDomElement &element, const QgsReadWriteContext &context) const
Saves common renderer properties (such as point size and screen error) to the specified DOM element.
virtual void stopRender(QgsTiledSceneRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QgsTiledSceneRenderer()=default
virtual void startRender(QgsTiledSceneRenderContext &context)
Must be called when a new render cycle is started.
void copyCommonProperties(QgsTiledSceneRenderer *destination) const
Copies common tiled scene renderer properties (such as screen error) to the destination renderer.
Qgis::TiledSceneRendererFlags flags() const override
Returns flags which control how the renderer behaves.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const override
Saves the renderer configuration to an XML element.
void startRender(QgsTiledSceneRenderContext &context) override
Must be called when a new render cycle is started.
~QgsTiledSceneWireframeRenderer() override
QString type() const override
Returns the identifier of the renderer type.
void renderTriangle(QgsTiledSceneRenderContext &context, const QPolygonF &triangle) override
Renders a triangle.
void setFillSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to render triangles in the wireframe.
void renderLine(QgsTiledSceneRenderContext &context, const QPolygonF &line) override
Renders a line.
static std::unique_ptr< QgsLineSymbol > createDefaultLineSymbol()
Returns a copy of the default line symbol used to render lines in the wireframe.
void stopRender(QgsTiledSceneRenderContext &context) override
Must be called when a render cycle has finished, to allow the renderer to clean up.
static QgsTiledSceneRenderer * create(QDomElement &element, const QgsReadWriteContext &context)
Creates a textured renderer from an XML element.
void setLineSymbol(QgsLineSymbol *symbol)
Sets the line symbol used to render lines in the wireframe.
static std::unique_ptr< QgsFillSymbol > createDefaultFillSymbol()
Returns a copy of the default fill symbol used to render triangles in the wireframe.
QgsTiledSceneWireframeRenderer()
Constructor for QgsTiledSceneWireframeRenderer.
QgsFillSymbol * fillSymbol() const
Returns the fill symbol used to render triangles in the wireframe.
QgsLineSymbol * lineSymbol() const
Returns the line symbol used to render lines in the wireframe.
void setUseTextureColors(bool enabled)
Sets whether representative colors from the textures should be used to recolor the symbols used to re...
bool useTextureColors() const
Returns true if representative colors from the textures will be used to recolor the symbols used to r...
QgsTiledSceneRenderer * clone() const override
Create a deep copy of this renderer.