1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#ifndef QSSGCUSTOMMATERIAL_H
5#define QSSGCUSTOMMATERIAL_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/qquick3dmaterial_p.h>
19#include <QtCore/qurl.h>
20
21#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrendergraphobject_p.h>
23#include <QtQuick3D/private/qquick3dshaderutils_p.h>
24
25QT_BEGIN_NAMESPACE
26
27class Q_QUICK3D_EXPORT QQuick3DCustomMaterial : public QQuick3DMaterial
28{
29 Q_OBJECT
30 Q_PROPERTY(ShadingMode shadingMode READ shadingMode WRITE setShadingMode NOTIFY shadingModeChanged)
31 Q_PROPERTY(QUrl fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged)
32 Q_PROPERTY(QUrl vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged)
33 Q_PROPERTY(QString __fragmentShaderCode READ fragmentShaderCode WRITE setFragmentShaderCode NOTIFY fragmentShaderCodeChanged REVISION(6, 8))
34 Q_PROPERTY(QString __vertexShaderCode READ vertexShaderCode WRITE setVertexShaderCode NOTIFY vertexShaderCodeChanged REVISION(6, 8))
35 Q_PROPERTY(BlendMode sourceBlend READ srcBlend WRITE setSrcBlend NOTIFY srcBlendChanged)
36 Q_PROPERTY(BlendMode destinationBlend READ dstBlend WRITE setDstBlend NOTIFY dstBlendChanged)
37 Q_PROPERTY(BlendMode sourceAlphaBlend READ srcAlphaBlend WRITE setSrcAlphaBlend NOTIFY srcAlphaBlendChanged REVISION(6, 7))
38 Q_PROPERTY(BlendMode destinationAlphaBlend READ dstAlphaBlend WRITE setDstAlphaBlend NOTIFY dstAlphaBlendChanged REVISION(6, 7))
39 Q_PROPERTY(bool alwaysDirty READ alwaysDirty WRITE setAlwaysDirty NOTIFY alwaysDirtyChanged)
40 Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged)
41
42 QML_NAMED_ELEMENT(CustomMaterial)
43
44public:
45 enum class ShadingMode
46 {
47 Unshaded,
48 Shaded
49 };
50 Q_ENUM(ShadingMode)
51
52 enum class BlendMode
53 {
54 NoBlend,
55 Zero,
56 One,
57 SrcColor,
58 OneMinusSrcColor,
59 DstColor,
60 OneMinusDstColor,
61 SrcAlpha,
62 OneMinusSrcAlpha,
63 DstAlpha,
64 OneMinusDstAlpha,
65 ConstantColor,
66 OneMinusConstantColor,
67 ConstantAlpha,
68 OneMinusConstantAlpha,
69 SrcAlphaSaturate
70 };
71 Q_ENUM(BlendMode)
72
73 explicit QQuick3DCustomMaterial(QQuick3DObject *parent = nullptr);
74 ~QQuick3DCustomMaterial() override;
75
76 ShadingMode shadingMode() const;
77 QUrl vertexShader() const;
78 QUrl fragmentShader() const;
79 Q_REVISION(6, 8) QString vertexShaderCode() const;
80 Q_REVISION(6, 8) QString fragmentShaderCode() const;
81 BlendMode srcBlend() const;
82 BlendMode dstBlend() const;
83 Q_REVISION(6, 7) BlendMode srcAlphaBlend() const;
84 Q_REVISION(6, 7) BlendMode dstAlphaBlend() const;
85 bool alwaysDirty() const;
86 float lineWidth() const;
87
88public Q_SLOTS:
89 void setShadingMode(QQuick3DCustomMaterial::ShadingMode mode);
90 void setVertexShader(const QUrl &url);
91 void setFragmentShader(const QUrl &url);
92 Q_REVISION(6, 8) void setVertexShaderCode(const QString &code);
93 Q_REVISION(6, 8) void setFragmentShaderCode(const QString &code);
94 void setSrcBlend(QQuick3DCustomMaterial::BlendMode mode);
95 void setDstBlend(QQuick3DCustomMaterial::BlendMode mode);
96 Q_REVISION(6, 7) void setSrcAlphaBlend(QQuick3DCustomMaterial::BlendMode mode);
97 Q_REVISION(6, 7) void setDstAlphaBlend(QQuick3DCustomMaterial::BlendMode mode);
98 void setAlwaysDirty(bool alwaysDirty);
99 void setLineWidth(float width);
100
101Q_SIGNALS:
102 void shadingModeChanged();
103 void vertexShaderChanged();
104 void fragmentShaderChanged();
105 Q_REVISION(6, 8) void vertexShaderCodeChanged();
106 Q_REVISION(6, 8) void fragmentShaderCodeChanged();
107 void srcBlendChanged();
108 void dstBlendChanged();
109 Q_REVISION(6, 7) void srcAlphaBlendChanged();
110 Q_REVISION(6, 7) void dstAlphaBlendChanged();
111 void alwaysDirtyChanged();
112 void lineWidthChanged();
113
114protected:
115 enum Dirty : quint32 {
116 TextureDirty = 0x1,
117 PropertyDirty = 0x2,
118 ShaderSettingsDirty = 0x4,
119 DynamicPropertiesDirty = 0x8, // Special case for custom materials created manually
120 AllDirty = std::numeric_limits<quint32>::max() ^ DynamicPropertiesDirty // (DynamicPropertiesDirty is intentionally excluded from AllDirty)
121 };
122
123 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
124 void itemChange(ItemChange, const ItemChangeData &) override;
125 void markAllDirty() override;
126 static void markDirty(QQuick3DCustomMaterial &that, QQuick3DCustomMaterial::Dirty type);
127
128private Q_SLOTS:
129 void onPropertyDirty();
130 void onTextureDirty();
131
132private:
133 friend class QQuick3DShaderUtilsTextureInput;
134 friend class QQuick3DViewport;
135
136 void setDynamicTextureMap(QQuick3DShaderUtilsTextureInput *textureMap);
137
138 QSet<QQuick3DShaderUtilsTextureInput *> m_dynamicTextureMaps;
139 quint32 m_dirtyAttributes = Dirty::AllDirty;
140 BlendMode m_srcBlend = BlendMode::NoBlend;
141 BlendMode m_dstBlend = BlendMode::NoBlend;
142 BlendMode m_srcAlphaBlend = BlendMode::NoBlend;
143 BlendMode m_dstAlphaBlend = BlendMode::NoBlend;
144 ShadingMode m_shadingMode = ShadingMode::Shaded;
145 QUrl m_vertexShader;
146 QUrl m_fragmentShader;
147 QString m_vertexShaderCode;
148 QString m_fragmentShaderCode;
149 bool m_alwaysDirty = false;
150 float m_lineWidth = 1.0f;
151};
152
153QT_END_NAMESPACE
154
155#endif // QSSGCUSTOMMATERIAL_H
156

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

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