1 /****************************************************************************
2 **
3 ** Copyright (C) 2020 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Quick 3D.
7 **
8 ** $QT_BEGIN_LICENSE:GPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 or (at your option) any later version
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
22 ** included in the packaging of this file. Please review the following
23 ** information to ensure the GNU General Public License requirements will
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25 **
26 ** $QT_END_LICENSE$
27 **
28 ****************************************************************************/
29 
30 #ifndef QSSG_RENDER_EFFECT_H
31 #define QSSG_RENDER_EFFECT_H
32 
33 //
34 //  W A R N I N G
35 //  -------------
36 //
37 // This file is not part of the Qt API.  It exists purely as an
38 // implementation detail.  This header file may change from version to
39 // version without notice, or even be removed.
40 //
41 // We mean it.
42 //
43 
44 #include <QtQuick3DRuntimeRender/private/qssgrendergraphobject_p.h>
45 #include <QtQuick3DRuntimeRender/private/qssgrendernode_p.h>
46 
47 #include <QtQuick3DRuntimeRender/private/qssgrenderimage_p.h>
48 
49 QT_BEGIN_NAMESPACE
50 struct QSSGRenderLayer;
51 struct QSSGEffectContext;
52 class QSSGEffectSystem;
53 
54 namespace dynamic
55 {
56 struct QSSGCommand;
57 }
58 
59 // Effects are post-render effect applied to the layer.  There can be more than one of
60 // them and they have completely variable properties.
61 struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderEffect : public QSSGRenderGraphObject
62 {
63     QSSGRenderEffect();
64     ~QSSGRenderEffect();
65 
66     struct TextureProperty
67     {
68         QSSGRenderImage *texImage = nullptr;
69         QByteArray name;
70         QSSGRenderShaderDataType shaderDataType;
71         QSSGRenderTextureMagnifyingOp magFilterType = QSSGRenderTextureMagnifyingOp::Linear;
72         QSSGRenderTextureMinifyingOp minFilterType = QSSGRenderTextureMinifyingOp::Linear;
73         QSSGRenderTextureCoordOp clampType = QSSGRenderTextureCoordOp::ClampToEdge;
74         QSSGRenderTextureTypeValue usageType;
75     };
76 
77     QVector<TextureProperty> textureProperties;
78 
79     struct Property
80     {
81         Property() = default;
82         Property(const QByteArray &name, const QVariant &value, QSSGRenderShaderDataType shaderDataType, int pid = -1)
nameQSSGRenderEffect::Property83             : name(name), value(value), shaderDataType(shaderDataType), pid(pid)
84         { }
85         QByteArray name;
86         mutable QVariant value;
87         QSSGRenderShaderDataType shaderDataType;
88         int pid;
89     };
90 
91     QVector<Property> properties;
92 
93     QSSGRenderLayer *m_layer;
94     QSSGRenderEffect *m_nextEffect;
95     // Opaque pointer to context type implemented by the effect system.
96     // May be null in which case the effect system will generate a new context
97     // the first time it needs to render this effect.
98     QSSGEffectContext *m_context = nullptr;
99 
100     void initialize();
101 
102     // If our active flag value changes, then we ask the effect manager
103     // to reset our context.
104     void setActive(bool inActive, QSSGEffectSystem &inSystem);
105 
106     void reset(QSSGEffectSystem &inSystem);
107 
108     using Flag = QSSGRenderNode::Flag;
109     Q_DECLARE_FLAGS(Flags, Flag)
110 
111     QVector<dynamic::QSSGCommand *> commands;
112 
113     Flags flags;
114     const char *className = nullptr;
115     bool requiresDepthTexture = false;
116     bool requiresCompilation = true;
117     QSSGRenderTextureFormat::Format outputFormat = QSSGRenderTextureFormat::Unknown;
118 };
119 
120 QT_END_NAMESPACE
121 
122 #endif
123