Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dcustommaterial_p.h
Go to the documentation of this file.
1// Copyright (C) 2019 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
6#ifndef QSSGCUSTOMMATERIAL_H
7#define QSSGCUSTOMMATERIAL_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtQuick3D/private/qquick3dmaterial_p.h>
21#include <QtCore/qurl.h>
22
23#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendergraphobject_p.h>
25#include <QtQuick3D/private/qquick3dshaderutils_p.h>
26
28
29class Q_QUICK3D_EXPORT QQuick3DCustomMaterial : public QQuick3DMaterial
30{
31 Q_OBJECT
32 Q_PROPERTY(ShadingMode shadingMode READ shadingMode WRITE setShadingMode NOTIFY shadingModeChanged)
33 Q_PROPERTY(QUrl fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged)
34 Q_PROPERTY(QUrl vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged)
35 Q_PROPERTY(QString __fragmentShaderCode READ fragmentShaderCode WRITE setFragmentShaderCode NOTIFY fragmentShaderCodeChanged REVISION(6, 8))
36 Q_PROPERTY(QString __vertexShaderCode READ vertexShaderCode WRITE setVertexShaderCode NOTIFY vertexShaderCodeChanged REVISION(6, 8))
37 Q_PROPERTY(BlendMode sourceBlend READ srcBlend WRITE setSrcBlend NOTIFY srcBlendChanged)
38 Q_PROPERTY(BlendMode destinationBlend READ dstBlend WRITE setDstBlend NOTIFY dstBlendChanged)
39 Q_PROPERTY(BlendMode sourceAlphaBlend READ srcAlphaBlend WRITE setSrcAlphaBlend NOTIFY srcAlphaBlendChanged REVISION(6, 7))
40 Q_PROPERTY(BlendMode destinationAlphaBlend READ dstAlphaBlend WRITE setDstAlphaBlend NOTIFY dstAlphaBlendChanged REVISION(6, 7))
41 Q_PROPERTY(bool alwaysDirty READ alwaysDirty WRITE setAlwaysDirty NOTIFY alwaysDirtyChanged)
42 Q_PROPERTY(float lineWidth READ lineWidth WRITE setLineWidth NOTIFY lineWidthChanged)
43
44 QML_NAMED_ELEMENT(CustomMaterial)
45
46public:
47 enum class ShadingMode
48 {
49 Unshaded,
50 Shaded
51 };
52 Q_ENUM(ShadingMode)
53
54 enum class BlendMode
55 {
56 NoBlend,
57 Zero,
58 One,
59 SrcColor,
60 OneMinusSrcColor,
61 DstColor,
62 OneMinusDstColor,
63 SrcAlpha,
64 OneMinusSrcAlpha,
65 DstAlpha,
66 OneMinusDstAlpha,
67 ConstantColor,
68 OneMinusConstantColor,
69 ConstantAlpha,
70 OneMinusConstantAlpha,
71 SrcAlphaSaturate
72 };
73 Q_ENUM(BlendMode)
74
75 explicit QQuick3DCustomMaterial(QQuick3DObject *parent = nullptr);
76 ~QQuick3DCustomMaterial() override;
77
78 ShadingMode shadingMode() const;
79 QUrl vertexShader() const;
80 QUrl fragmentShader() const;
81 Q_REVISION(6, 8) QString vertexShaderCode() const;
82 Q_REVISION(6, 8) QString fragmentShaderCode() const;
83 BlendMode srcBlend() const;
84 BlendMode dstBlend() const;
85 Q_REVISION(6, 7) BlendMode srcAlphaBlend() const;
86 Q_REVISION(6, 7) BlendMode dstAlphaBlend() const;
87 bool alwaysDirty() const;
88 float lineWidth() const;
89
90public Q_SLOTS:
91 void setShadingMode(QQuick3DCustomMaterial::ShadingMode mode);
92 void setVertexShader(const QUrl &url);
93 void setFragmentShader(const QUrl &url);
94 Q_REVISION(6, 8) void setVertexShaderCode(const QString &code);
95 Q_REVISION(6, 8) void setFragmentShaderCode(const QString &code);
96 void setSrcBlend(QQuick3DCustomMaterial::BlendMode mode);
97 void setDstBlend(QQuick3DCustomMaterial::BlendMode mode);
98 Q_REVISION(6, 7) void setSrcAlphaBlend(QQuick3DCustomMaterial::BlendMode mode);
99 Q_REVISION(6, 7) void setDstAlphaBlend(QQuick3DCustomMaterial::BlendMode mode);
100 void setAlwaysDirty(bool alwaysDirty);
101 void setLineWidth(float width);
102
103Q_SIGNALS:
104 void shadingModeChanged();
105 void vertexShaderChanged();
106 void fragmentShaderChanged();
107 Q_REVISION(6, 8) void vertexShaderCodeChanged();
108 Q_REVISION(6, 8) void fragmentShaderCodeChanged();
109 void srcBlendChanged();
110 void dstBlendChanged();
111 Q_REVISION(6, 7) void srcAlphaBlendChanged();
112 Q_REVISION(6, 7) void dstAlphaBlendChanged();
113 void alwaysDirtyChanged();
114 void lineWidthChanged();
115
116protected:
117 enum Dirty : quint32 {
118 TextureDirty = 0x1,
119 PropertyDirty = 0x2,
120 ShaderSettingsDirty = 0x4,
121 DynamicPropertiesDirty = 0x8, // Special case for custom materials created manually
122 AllDirty = std::numeric_limits<quint32>::max() ^ DynamicPropertiesDirty // (DynamicPropertiesDirty is intentionally excluded from AllDirty)
123 };
124
125 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
126 void itemChange(ItemChange, const ItemChangeData &) override;
127 void markAllDirty() override;
128 static void markDirty(QQuick3DCustomMaterial &that, QQuick3DCustomMaterial::Dirty type);
129
130private Q_SLOTS:
131 void onPropertyDirty();
132 void onTextureDirty();
133
134private:
135 friend class QQuick3DShaderUtilsTextureInput;
136 friend class QQuick3DViewport;
137
138 void setDynamicTextureMap(QQuick3DShaderUtilsTextureInput *textureMap);
139
140 QSet<QQuick3DShaderUtilsTextureInput *> m_dynamicTextureMaps;
141 quint32 m_dirtyAttributes = Dirty::AllDirty;
142 BlendMode m_srcBlend = BlendMode::NoBlend;
143 BlendMode m_dstBlend = BlendMode::NoBlend;
144 BlendMode m_srcAlphaBlend = BlendMode::NoBlend;
145 BlendMode m_dstAlphaBlend = BlendMode::NoBlend;
146 ShadingMode m_shadingMode = ShadingMode::Shaded;
147 QUrl m_vertexShader;
148 QUrl m_fragmentShader;
149 QString m_vertexShaderCode;
150 QString m_fragmentShaderCode;
151 bool m_alwaysDirty = false;
152 float m_lineWidth = 1.0f;
153};
154
155QT_END_NAMESPACE
156
157#endif // QSSGCUSTOMMATERIAL_H
Combined button and popup list for selecting options.
static QByteArray prepareCustomShader(QSSGRenderCustomMaterial *customMaterial, const QSSGShaderCustomMaterialAdapter::StringPairList &uniforms, const QByteArray &snippet, QSSGShaderCache::ShaderType shaderType, QSSGCustomShaderMetaData &meta, bool multiViewCompatible)
static QT_BEGIN_NAMESPACE QRhiGraphicsPipeline::BlendFactor toRhiBlendFactor(QQuick3DCustomMaterial::BlendMode mode)
\qmlproperty url CustomMaterial::vertexShader
static void setCustomMaterialFlagsFromShader(QSSGRenderCustomMaterial *material, const QSSGCustomShaderMetaData &meta)