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)
42 QML_NAMED_ELEMENT(CustomMaterial)
45 enum class ShadingMode
66 OneMinusConstantColor,
68 OneMinusConstantAlpha,
73 explicit QQuick3DCustomMaterial(QQuick3DObject *parent =
nullptr);
74 ~QQuick3DCustomMaterial() override;
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;
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);
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();
115 enum Dirty : quint32 {
118 ShaderSettingsDirty = 0x4,
119 DynamicPropertiesDirty = 0x8,
120 AllDirty = std::numeric_limits<quint32>::max() ^ DynamicPropertiesDirty
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);
129 void onPropertyDirty();
130 void onTextureDirty();
133 friend class QQuick3DShaderUtilsTextureInput;
134 friend class QQuick3DViewport;
136 void setDynamicTextureMap(QQuick3DShaderUtilsTextureInput *textureMap);
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;
146 QUrl m_fragmentShader;
147 QString m_vertexShaderCode;
148 QString m_fragmentShaderCode;
149 bool m_alwaysDirty =
false;
150 float m_lineWidth = 1.0f;
static QByteArray prepareCustomShader(QSSGRenderCustomMaterial *customMaterial, const QSSGShaderCustomMaterialAdapter::StringPairList &uniforms, const QByteArray &snippet, QSSGShaderCache::ShaderType shaderType, QSSGCustomShaderMetaData &meta, bool multiViewCompatible)