25#include <QDomDocument>
27#include <Qt3DCore/QEntity>
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 auto materialLightOriginCenter =
new QgsUnlitMaterial();
78 materialLightOriginCenter->setColor(
color() );
79 materialLightOriginCenter->setCastsShadows(
false );
80 originEntity->addComponent( materialLightOriginCenter );
82 Qt3DExtras::QSphereMesh *rendererLightOriginCenter =
new Qt3DExtras::QSphereMesh;
83 rendererLightOriginCenter->setRadius( 20 );
84 originEntity->addComponent( rendererLightOriginCenter );
86 originEntity->setEnabled(
true );
88 Qt3DCore::QEntity *groupEntity =
new Qt3DCore::QEntity( parent );
89 lightEntity->setParent( groupEntity );
90 originEntity->setParent( groupEntity );
91 groupEntity->setEnabled(
true );
98 QDomElement elemLight = doc.createElement( u
"point-light"_s );
99 elemLight.setAttribute( u
"id"_s,
mId );
100 elemLight.setAttribute( u
"x"_s, mPosition.x() );
101 elemLight.setAttribute( u
"y"_s, mPosition.y() );
102 elemLight.setAttribute( u
"z"_s, mPosition.z() );
104 elemLight.setAttribute( u
"intensity"_s, mIntensity );
105 elemLight.setAttribute( u
"attenuation-0"_s, mConstantAttenuation );
106 elemLight.setAttribute( u
"attenuation-1"_s, mLinearAttenuation );
107 elemLight.setAttribute( u
"attenuation-2"_s, mQuadraticAttenuation );
113 if ( elem.hasAttribute( u
"id"_s ) )
114 mId = elem.attribute( u
"id"_s );
116 mPosition.set( elem.attribute( u
"x"_s ).toDouble(), elem.attribute( u
"y"_s ).toDouble(), elem.attribute( u
"z"_s ).toDouble() );
118 mIntensity = elem.attribute( u
"intensity"_s ).toDouble();
119 mConstantAttenuation = elem.attribute( u
"attenuation-0"_s ).toDouble();
120 mLinearAttenuation = elem.attribute( u
"attenuation-1"_s ).toDouble();
121 mQuadraticAttenuation = elem.attribute( u
"attenuation-2"_s ).toDouble();
127 && mPosition == other.mPosition
128 && mColor == other.mColor
130 &&
qgsDoubleNear( mConstantAttenuation, other.mConstantAttenuation )
131 &&
qgsDoubleNear( mLinearAttenuation, other.mLinearAttenuation )
132 &&
qgsDoubleNear( mQuadraticAttenuation, other.mQuadraticAttenuation );
@ ShowLightSourceOrigins
Shows the light source origins as a sphere.
LightSourceType
Light source types for 3D scenes.
@ Point
Point light source.
Qgis::Map3DDebugFlags debugFlags() const
Returns the flags that control debugging options for the map.
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).