1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGABSTRACTLIGHT_H
5#define QSSGABSTRACTLIGHT_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtQuick3D/private/qquick3dnode_p.h>
19
20#include <QColor>
21
22QT_BEGIN_NAMESPACE
23
24class Q_QUICK3D_EXPORT QQuick3DAbstractLight : public QQuick3DNode
25{
26 Q_OBJECT
27 Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
28 Q_PROPERTY(QColor ambientColor READ ambientColor WRITE setAmbientColor NOTIFY ambientColorChanged)
29 Q_PROPERTY(float brightness READ brightness WRITE setBrightness NOTIFY brightnessChanged)
30 Q_PROPERTY(QQuick3DNode *scope READ scope WRITE setScope NOTIFY scopeChanged)
31 Q_PROPERTY(bool castsShadow READ castsShadow WRITE setCastsShadow NOTIFY castsShadowChanged)
32 Q_PROPERTY(float shadowBias READ shadowBias WRITE setShadowBias NOTIFY shadowBiasChanged)
33 Q_PROPERTY(float shadowFactor READ shadowFactor WRITE setShadowFactor NOTIFY shadowFactorChanged)
34 Q_PROPERTY(QSSGShadowMapQuality shadowMapQuality READ shadowMapQuality WRITE setShadowMapQuality NOTIFY shadowMapQualityChanged)
35 Q_PROPERTY(float shadowMapFar READ shadowMapFar WRITE setShadowMapFar NOTIFY shadowMapFarChanged)
36 Q_PROPERTY(float shadowFilter READ shadowFilter WRITE setShadowFilter NOTIFY shadowFilterChanged)
37 Q_PROPERTY(QSSGBakeMode bakeMode READ bakeMode WRITE setBakeMode NOTIFY bakeModeChanged)
38 Q_PROPERTY(QSSGSoftShadowQuality softShadowQuality READ softShadowQuality WRITE setSoftShadowQuality NOTIFY softShadowQualityChanged FINAL REVISION(6, 8))
39 Q_PROPERTY(float pcfFactor READ pcfFactor WRITE setPcfFactor NOTIFY pcfFactorChanged FINAL REVISION(6, 8))
40
41 QML_NAMED_ELEMENT(Light)
42 QML_UNCREATABLE("Light is Abstract")
43public:
44 ~QQuick3DAbstractLight() override;
45
46 enum class QSSGShadowMapQuality {
47 ShadowMapQualityLow,
48 ShadowMapQualityMedium,
49 ShadowMapQualityHigh,
50 ShadowMapQualityVeryHigh,
51 };
52 Q_ENUM(QSSGShadowMapQuality)
53
54 enum class QSSGSoftShadowQuality {
55 Hard,
56 PCF4,
57 PCF8,
58 PCF16,
59 PCF32,
60 PCF64,
61 };
62 Q_ENUM(QSSGSoftShadowQuality)
63
64 enum class QSSGBakeMode {
65 BakeModeDisabled,
66 BakeModeIndirect,
67 BakeModeAll
68 };
69 Q_ENUM(QSSGBakeMode)
70
71 QColor color() const;
72 QColor ambientColor() const;
73 float brightness() const;
74 QQuick3DNode *scope() const;
75 bool castsShadow() const;
76 float shadowBias() const;
77 float shadowFactor() const;
78 QSSGShadowMapQuality shadowMapQuality() const;
79 float shadowMapFar() const;
80 float shadowFilter() const;
81 QSSGBakeMode bakeMode() const;
82 Q_REVISION(6, 8) QSSGSoftShadowQuality softShadowQuality() const;
83 Q_REVISION(6, 8) float pcfFactor() const;
84
85public Q_SLOTS:
86 void setColor(const QColor &color);
87 void setAmbientColor(const QColor &ambientColor);
88 void setBrightness(float brightness);
89 void setScope(QQuick3DNode *scope);
90 void setCastsShadow(bool castsShadow);
91 void setShadowBias(float shadowBias);
92 void setShadowFactor(float shadowFactor);
93 void setShadowMapQuality(QQuick3DAbstractLight::QSSGShadowMapQuality shadowMapQuality);
94 void setShadowMapFar(float shadowMapFar);
95 void setShadowFilter(float shadowFilter);
96 void setBakeMode(QQuick3DAbstractLight::QSSGBakeMode bakeMode);
97 Q_REVISION(6, 8) void setSoftShadowQuality(QQuick3DAbstractLight::QSSGSoftShadowQuality softShadowQuality);
98 Q_REVISION(6, 8) void setPcfFactor(float pcfFactor);
99
100Q_SIGNALS:
101 void colorChanged();
102 void ambientColorChanged();
103 void brightnessChanged();
104 void scopeChanged();
105 void castsShadowChanged();
106 void shadowBiasChanged();
107 void shadowFactorChanged();
108 void shadowMapQualityChanged();
109 void shadowMapFarChanged();
110 void shadowFilterChanged();
111 void bakeModeChanged();
112 Q_REVISION(6, 8) void softShadowQualityChanged();
113 Q_REVISION(6, 8) void pcfFactorChanged();
114
115protected:
116 explicit QQuick3DAbstractLight(QQuick3DNodePrivate &dd, QQuick3DNode *parent = nullptr);
117
118 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
119 void markAllDirty() override;
120
121 enum class DirtyFlag {
122 ShadowDirty = (1 << 0),
123 ColorDirty = (1 << 1),
124 BrightnessDirty = (1 << 2),
125 FadeDirty = (1 << 3),
126 AreaDirty = (1 << 4),
127 BakeModeDirty = (1 << 5)
128 };
129 Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
130
131 DirtyFlags m_dirtyFlags = DirtyFlags(DirtyFlag::ShadowDirty)
132 | DirtyFlags(DirtyFlag::ColorDirty)
133 | DirtyFlags(DirtyFlag::BrightnessDirty)
134 | DirtyFlags(DirtyFlag::FadeDirty)
135 | DirtyFlags(DirtyFlag::AreaDirty);
136private:
137 quint32 mapToShadowResolution(QSSGShadowMapQuality resolution);
138
139 QColor m_color;
140 QColor m_ambientColor;
141 float m_brightness = 1.0f;
142 QQuick3DNode *m_scope = nullptr;
143 bool m_castsShadow = false;
144 float m_shadowBias = 10.0f;
145 float m_shadowFactor = 75.0f;
146 QSSGShadowMapQuality m_shadowMapQuality = QSSGShadowMapQuality::ShadowMapQualityLow;
147 QSSGSoftShadowQuality m_softShadowQuality = QSSGSoftShadowQuality::PCF4;
148 float m_shadowMapFar = 5000.0f;
149 float m_shadowFilter = 5.0f;
150 float m_pcfFactor = 2.0f;
151 QSSGBakeMode m_bakeMode = QSSGBakeMode::BakeModeDisabled;
152};
153
154QT_END_NAMESPACE
155#endif // QSSGDIRECTIONALLIGHT_H
156

source code of qtquick3d/src/quick3d/qquick3dabstractlight_p.h