QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgspointlightsettings.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgspointlightsettings.cpp
3 --------------------------------------
4 Date : November 2018
5 Copyright : (C) 2018 by Martin Dobias
6 Email : wonder dot sk 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 "qgssymbollayerutils.h"
18#include "qgscolorutils.h"
19#include "qgs3dmapsettings.h"
20
21#include <QDomDocument>
22
23#include <Qt3DCore/QEntity>
24#include <Qt3DRender/QPointLight>
25#include <Qt3DExtras/QPhongMaterial>
26#include <Qt3DExtras/QSphereMesh>
27
29{
31}
32
34{
35 return new QgsPointLightSettings( *this );
36}
37
38Qt3DCore::QEntity *QgsPointLightSettings::createEntity( const Qgs3DMapSettings &map, Qt3DCore::QEntity *parent ) const
39{
40 Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity();
41 Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform;
42 lightTransform->setTranslation( QVector3D( position().x(),
43 position().y(),
44 position().z() ) );
45
46 Qt3DRender::QPointLight *light = new Qt3DRender::QPointLight;
47 light->setColor( color() );
48 light->setIntensity( intensity() );
49
50 light->setConstantAttenuation( constantAttenuation() );
51 light->setLinearAttenuation( linearAttenuation() );
52 light->setQuadraticAttenuation( quadraticAttenuation() );
53
54 lightEntity->addComponent( light );
55 lightEntity->addComponent( lightTransform );
56
57 if ( !map.showLightSourceOrigins() )
58 {
59 lightEntity->setParent( parent );
60 return lightEntity;
61 }
62 else
63 {
64 Qt3DCore::QEntity *originEntity = new Qt3DCore::QEntity();
65
66 Qt3DCore::QTransform *trLightOriginCenter = new Qt3DCore::QTransform;
67 trLightOriginCenter->setTranslation( lightTransform->translation() );
68 originEntity->addComponent( trLightOriginCenter );
69
70 Qt3DExtras::QPhongMaterial *materialLightOriginCenter = new Qt3DExtras::QPhongMaterial;
71 materialLightOriginCenter->setAmbient( color() );
72 originEntity->addComponent( materialLightOriginCenter );
73
74 Qt3DExtras::QSphereMesh *rendererLightOriginCenter = new Qt3DExtras::QSphereMesh;
75 rendererLightOriginCenter->setRadius( 20 );
76 originEntity->addComponent( rendererLightOriginCenter );
77
78 originEntity->setEnabled( true );
79
80 Qt3DCore::QEntity *groupEntity = new Qt3DCore::QEntity( parent );
81 lightEntity->setParent( groupEntity );
82 originEntity->setParent( groupEntity );
83 groupEntity->setEnabled( true );
84 return groupEntity;
85 }
86}
87
88QDomElement QgsPointLightSettings::writeXml( QDomDocument &doc, const QgsReadWriteContext & ) const
89{
90 QDomElement elemLight = doc.createElement( QStringLiteral( "point-light" ) );
91 elemLight.setAttribute( QStringLiteral( "x" ), mPosition.x() );
92 elemLight.setAttribute( QStringLiteral( "y" ), mPosition.y() );
93 elemLight.setAttribute( QStringLiteral( "z" ), mPosition.z() );
94 elemLight.setAttribute( QStringLiteral( "color" ), QgsColorUtils::colorToString( mColor ) );
95 elemLight.setAttribute( QStringLiteral( "intensity" ), mIntensity );
96 elemLight.setAttribute( QStringLiteral( "attenuation-0" ), mConstantAttenuation );
97 elemLight.setAttribute( QStringLiteral( "attenuation-1" ), mLinearAttenuation );
98 elemLight.setAttribute( QStringLiteral( "attenuation-2" ), mQuadraticAttenuation );
99 return elemLight;
100}
101
102void QgsPointLightSettings::readXml( const QDomElement &elem, const QgsReadWriteContext & )
103{
104 mPosition.set( elem.attribute( QStringLiteral( "x" ) ).toDouble(),
105 elem.attribute( QStringLiteral( "y" ) ).toDouble(),
106 elem.attribute( QStringLiteral( "z" ) ).toDouble() );
107 mColor = QgsColorUtils::colorFromString( elem.attribute( QStringLiteral( "color" ) ) );
108 mIntensity = elem.attribute( QStringLiteral( "intensity" ) ).toFloat();
109 mConstantAttenuation = elem.attribute( QStringLiteral( "attenuation-0" ) ).toDouble();
110 mLinearAttenuation = elem.attribute( QStringLiteral( "attenuation-1" ) ).toDouble();
111 mQuadraticAttenuation = elem.attribute( QStringLiteral( "attenuation-2" ) ).toDouble();
112}
113
115{
116 return mPosition == other.mPosition && mColor == other.mColor && mIntensity == other.mIntensity &&
117 mConstantAttenuation == other.mConstantAttenuation && mLinearAttenuation == other.mLinearAttenuation &&
118 mQuadraticAttenuation == other.mQuadraticAttenuation;
119}
LightSourceType
Light source types for 3D scenes.
Definition: qgis.h:3398
@ Point
Point light source.
bool showLightSourceOrigins() const
Returns whether to show light source origins as a sphere (for debugging)
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.
QgsPointLightSettings()=default
Construct a point light with default values.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context=QgsReadWriteContext()) const override
Writes the light source's configuration to a new DOM element and returns it.
Qt3DCore::QEntity * createEntity(const Qgs3DMapSettings &map, Qt3DCore::QEntity *parent) const override
Creates an entity representing the light source.
float quadraticAttenuation() const
Returns quadratic attenuation (A_2)
QgsPointLightSettings * clone() const override
Returns a copy of the light source.
float linearAttenuation() const
Returns linear attenuation (A_1)
float intensity() const
Returns intensity of the light.
Qgis::LightSourceType type() const override
Returns the light source type.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context=QgsReadWriteContext()) override
Reads configuration from a DOM element previously written using writeXml().
QgsVector3D position() const
Returns position of the light (in 3D world coordinates)
float constantAttenuation() const
Returns constant attenuation (A_0)
bool operator==(const QgsPointLightSettings &other)
QColor color() const
Returns color of the light.
The class is used as a container of context for various read/write operations on other objects.
double y() const
Returns Y coordinate.
Definition: qgsvector3d.h:50
double z() const
Returns Z coordinate.
Definition: qgsvector3d.h:52
double x() const
Returns X coordinate.
Definition: qgsvector3d.h:48
void set(double x, double y, double z)
Sets vector coordinates.
Definition: qgsvector3d.h:73