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)
44 QML_NAMED_ELEMENT(CustomMaterial)
47 enum class ShadingMode
68 OneMinusConstantColor,
70 OneMinusConstantAlpha,
75 explicit QQuick3DCustomMaterial(QQuick3DObject *parent =
nullptr);
76 ~QQuick3DCustomMaterial() override;
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;
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);
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();
117 enum Dirty : quint32 {
120 ShaderSettingsDirty = 0x4,
121 DynamicPropertiesDirty = 0x8,
122 AllDirty = std::numeric_limits<quint32>::max() ^ DynamicPropertiesDirty
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);
131 void onPropertyDirty();
132 void onTextureDirty();
135 friend class QQuick3DShaderUtilsTextureInput;
136 friend class QQuick3DViewport;
138 void setDynamicTextureMap(QQuick3DShaderUtilsTextureInput *textureMap);
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;
148 QUrl m_fragmentShader;
149 QString m_vertexShaderCode;
150 QString m_fragmentShaderCode;
151 bool m_alwaysDirty =
false;
152 float m_lineWidth = 1.0f;
static QByteArray prepareCustomShader(QSSGRenderCustomMaterial *customMaterial, const QSSGShaderCustomMaterialAdapter::StringPairList &uniforms, const QByteArray &snippet, QSSGShaderCache::ShaderType shaderType, QSSGCustomShaderMetaData &meta, bool multiViewCompatible)