24#include <QDomDocument>
26#include <Qt3DCore/QEntity>
27#include <Qt3DExtras/QPhongMaterial>
28#include <Qt3DExtras/QSphereMesh>
29#include <Qt3DRender/QPointLight>
31using namespace Qt::StringLiterals;
40 auto res = std::make_unique< QgsPointLightSettings >( *
this );
47 Qt3DCore::QEntity *lightEntity =
new Qt3DCore::QEntity();
48 QgsGeoTransform *lightTransform =
new QgsGeoTransform;
49 lightTransform->setOrigin( map.
origin() );
50 lightTransform->setGeoTranslation(
position().toVector3D() );
52 Qt3DRender::QPointLight *light =
new Qt3DRender::QPointLight;
54 light->setIntensity(
static_cast< float >(
intensity() ) );
60 lightEntity->addComponent( light );
61 lightEntity->addComponent( lightTransform );
65 lightEntity->setParent( parent );
70 Qt3DCore::QEntity *originEntity =
new Qt3DCore::QEntity();
72 QgsGeoTransform *originTransform =
new QgsGeoTransform;
73 originTransform->setOrigin( map.
origin() );
74 originTransform->setGeoTranslation(
position().toVector3D() );
75 originEntity->addComponent( originTransform );
77 Qt3DExtras::QPhongMaterial *materialLightOriginCenter =
new Qt3DExtras::QPhongMaterial;
78 materialLightOriginCenter->setAmbient(
color() );
79 originEntity->addComponent( materialLightOriginCenter );
81 Qt3DExtras::QSphereMesh *rendererLightOriginCenter =
new Qt3DExtras::QSphereMesh;
82 rendererLightOriginCenter->setRadius( 20 );
83 originEntity->addComponent( rendererLightOriginCenter );
85 originEntity->setEnabled(
true );
87 Qt3DCore::QEntity *groupEntity =
new Qt3DCore::QEntity( parent );
88 lightEntity->setParent( groupEntity );
89 originEntity->setParent( groupEntity );
90 groupEntity->setEnabled(
true );
97 QDomElement elemLight = doc.createElement( u
"point-light"_s );
98 elemLight.setAttribute( u
"id"_s,
mId );
99 elemLight.setAttribute( u
"x"_s, mPosition.x() );
100 elemLight.setAttribute( u
"y"_s, mPosition.y() );
101 elemLight.setAttribute( u
"z"_s, mPosition.z() );
103 elemLight.setAttribute( u
"intensity"_s, mIntensity );
104 elemLight.setAttribute( u
"attenuation-0"_s, mConstantAttenuation );
105 elemLight.setAttribute( u
"attenuation-1"_s, mLinearAttenuation );
106 elemLight.setAttribute( u
"attenuation-2"_s, mQuadraticAttenuation );
112 if ( elem.hasAttribute( u
"id"_s ) )
113 mId = elem.attribute( u
"id"_s );
115 mPosition.set( elem.attribute( u
"x"_s ).toDouble(), elem.attribute( u
"y"_s ).toDouble(), elem.attribute( u
"z"_s ).toDouble() );
117 mIntensity = elem.attribute( u
"intensity"_s ).toDouble();
118 mConstantAttenuation = elem.attribute( u
"attenuation-0"_s ).toDouble();
119 mLinearAttenuation = elem.attribute( u
"attenuation-1"_s ).toDouble();
120 mQuadraticAttenuation = elem.attribute( u
"attenuation-2"_s ).toDouble();
126 && mPosition == other.mPosition
127 && mColor == other.mColor
129 &&
qgsDoubleNear( mConstantAttenuation, other.mConstantAttenuation )
130 &&
qgsDoubleNear( mLinearAttenuation, other.mLinearAttenuation )
131 &&
qgsDoubleNear( mQuadraticAttenuation, other.mQuadraticAttenuation );
LightSourceType
Light source types for 3D scenes.
@ Point
Point light source.
bool showLightSourceOrigins() const
Returns whether to show light source origins as a sphere (for debugging).
QgsVector3D origin() const
Returns coordinates in map CRS at which 3D scene has origin (0,0,0).
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear 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.
QString mId
Unique light ID.
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.
double linearAttenuation() const
Returns linear attenuation (A_1).
bool operator==(const QgsPointLightSettings &other) const
QgsPointLightSettings * clone() const override
Returns a copy of the light source.
double quadraticAttenuation() const
Returns quadratic attenuation (A_2).
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 map coordinates).
double intensity() const
Returns intensity of the light.
double constantAttenuation() const
Returns constant attenuation (A_0).
QColor color() const
Returns color of the light.
A container for the context for various read/write operations on objects.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).