QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgssimplelinematerialsettings.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssimplelinematerialsettings.cpp
3 --------------------------------------
4 Date : August 2020
5 Copyright : (C) 2020 by Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17#include "qgscolorutils.h"
18#include "qgslinematerial_p.h"
19
20#include <Qt3DRender/QTexture>
21#include <Qt3DRender/QParameter>
22#include <Qt3DRender/QEffect>
23#include <QMap>
24
25#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
26#include <Qt3DRender/QAttribute>
27#include <Qt3DRender/QBuffer>
28#include <Qt3DRender/QGeometry>
29
30typedef Qt3DRender::QAttribute Qt3DQAttribute;
31typedef Qt3DRender::QBuffer Qt3DQBuffer;
32typedef Qt3DRender::QGeometry Qt3DQGeometry;
33#else
34#include <Qt3DCore/QAttribute>
35#include <Qt3DCore/QBuffer>
36#include <Qt3DCore/QGeometry>
37
38typedef Qt3DCore::QAttribute Qt3DQAttribute;
39typedef Qt3DCore::QBuffer Qt3DQBuffer;
40typedef Qt3DCore::QGeometry Qt3DQGeometry;
41#endif
42
44{
45 return QStringLiteral( "simpleline" );
46}
47
49{
50 switch ( technique )
51 {
53 return true;
54
61 return false;
62 }
63 return false;
64}
65
67{
69}
70
72{
73 return new QgsSimpleLineMaterialSettings( *this );
74}
75
76void QgsSimpleLineMaterialSettings::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
77{
78 mAmbient = QgsColorUtils::colorFromString( elem.attribute( QStringLiteral( "ambient" ), QStringLiteral( "25,25,25" ) ) );
79
81}
82
83void QgsSimpleLineMaterialSettings::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
84{
85 elem.setAttribute( QStringLiteral( "ambient" ), QgsColorUtils::colorToString( mAmbient ) );
86
88}
89
91{
92 switch ( technique )
93 {
100 return nullptr;
101
103 {
104 QgsLineMaterial *mat = new QgsLineMaterial;
105 if ( !context.isSelected() )
106 {
107 mat->setLineColor( mAmbient );
108 mat->setUseVertexColors( dataDefinedProperties().isActive( QgsAbstractMaterialSettings::Property::Ambient ) );
109 }
110 else
111 {
112 // update the material with selection colors
113 mat->setLineColor( context.selectionColor() );
114 mat->setUseVertexColors( false );
115 }
116 return mat;
117 }
118 }
119 return nullptr;
120}
121
123{
124 QMap<QString, QString> parameters;
125 parameters[ QStringLiteral( "Ka" ) ] = QStringLiteral( "%1 %2 %3" ).arg( mAmbient.redF() ).arg( mAmbient.greenF() ).arg( mAmbient.blueF() );
126 return parameters;
127}
128
129void QgsSimpleLineMaterialSettings::addParametersToEffect( Qt3DRender::QEffect *effect ) const
130{
131 Qt3DRender::QParameter *ambientParameter = new Qt3DRender::QParameter( QStringLiteral( "ambientColor" ), QColor::fromRgbF( 0.05f, 0.05f, 0.05f, 1.0f ) );
132 ambientParameter->setValue( mAmbient );
133 effect->addParameter( ambientParameter );
134}
135
137{
138 const QColor ambient = dataDefinedProperties().valueAsColor( QgsAbstractMaterialSettings::Property::Ambient, expressionContext, mAmbient );
139
140 QByteArray array;
141 array.resize( sizeof( unsigned char ) * 3 );
142 unsigned char *fptr = reinterpret_cast<unsigned char *>( array.data() );
143
144 *fptr++ = static_cast<unsigned char>( ambient.red() );
145 *fptr++ = static_cast<unsigned char>( ambient.green() );
146 *fptr++ = static_cast<unsigned char>( ambient.blue() );
147 return array;
148}
149
150void QgsSimpleLineMaterialSettings::applyDataDefinedToGeometry( Qt3DQGeometry *geometry, int vertexCount, const QByteArray &data ) const
151{
152 Qt3DQBuffer *dataBuffer = new Qt3DQBuffer( geometry );
153
154 Qt3DQAttribute *colorAttribute = new Qt3DQAttribute( geometry );
155 colorAttribute->setName( QStringLiteral( "dataDefinedColor" ) );
156 colorAttribute->setVertexBaseType( Qt3DQAttribute::UnsignedByte );
157 colorAttribute->setVertexSize( 3 );
158 colorAttribute->setAttributeType( Qt3DQAttribute::VertexAttribute );
159 colorAttribute->setBuffer( dataBuffer );
160 colorAttribute->setByteStride( 3 * sizeof( unsigned char ) );
161 colorAttribute->setByteOffset( 0 );
162 colorAttribute->setCount( vertexCount );
163 geometry->addAttribute( colorAttribute );
164
165 dataBuffer->setData( data );
166}
virtual void writeXml(QDomElement &element, const QgsReadWriteContext &) const
Writes settings to a DOM element.
virtual void readXml(const QDomElement &element, const QgsReadWriteContext &)
Reads settings from a DOM element.
@ Ambient
Ambient color (phong material)
QgsPropertyCollection dataDefinedProperties() const
Returns the symbol material property collection, used for data defined overrides.
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QColor selectionColor() const
Returns the color for representing materials in a selected state.
bool isSelected() const
Returns true if the material should represent a selected state.
The class is used as a container of context for various read/write operations on other objects.
void addParametersToEffect(Qt3DRender::QEffect *effect) const override
Adds parameters from the material to a destination effect.
QgsSimpleLineMaterialSettings * clone() const override
Clones the material settings.
void applyDataDefinedToGeometry(Qt3DCore::QGeometry *geometry, int vertexCount, const QByteArray &data) const override
Applies the data defined bytes, dataDefinedBytes, on the geometry by filling a specific vertex buffer...
Qt3DRender::QMaterial * toMaterial(QgsMaterialSettingsRenderingTechnique technique, const QgsMaterialContext &context) const override
Creates a new QMaterial object representing the material settings.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes settings to a DOM element.
static bool supportsTechnique(QgsMaterialSettingsRenderingTechnique technique)
Returns true if the specified technique is supported by the material.
static QgsAbstractMaterialSettings * create()
Returns a new instance of QgsSimpleLineMaterialSettings.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads settings from a DOM element.
QByteArray dataDefinedVertexColorsAsByte(const QgsExpressionContext &expressionContext) const override
Returns byte array corresponding to the data defined colors depending of the expressionContext,...
QgsSimpleLineMaterialSettings()=default
Constructor for QgsSimpleLineMaterialSettings.
QColor ambient() const
Returns the ambient color component.
QString type() const override
Returns the unique type name for the material.
QMap< QString, QString > toExportParameters() const override
Returns the parameters to be exported to .mtl file.
QgsMaterialSettingsRenderingTechnique
Material rendering techniques 3.
@ Points
Point based rendering, requires point data.
@ Triangles
Triangle based rendering (default)
@ TrianglesFromModel
Triangle based rendering, using a model object source.
@ Lines
Line based rendering, requires line data.
@ TrianglesDataDefined
Triangle based rendering with possibility of datadefined color.
@ InstancedPoints
Instanced based rendering, requiring triangles and point data.
@ TrianglesWithFixedTexture
Triangle based rendering, using a fixed, non-user-configurable texture (e.g. for terrain rendering)
Qt3DCore::QAttribute Qt3DQAttribute
Definition: qgs3daxis.cpp:28
Qt3DCore::QBuffer Qt3DQBuffer
Definition: qgs3daxis.cpp:30
Qt3DCore::QGeometry Qt3DQGeometry
Definition: qgs3daxis.cpp:29
Qt3DCore::QAttribute Qt3DQAttribute
Qt3DCore::QBuffer Qt3DQBuffer
Qt3DCore::QGeometry Qt3DQGeometry