diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2012-03-21 14:21:51 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-04 03:29:45 +0200 |
commit | c71c8c4619594a276d69378bbd77da5117afd566 (patch) | |
tree | 9b8ac6fb0db75abb747de6ec2a74e754770f4820 /src/quick/items/qquickshadereffectnode_p.h | |
parent | 2c741bc8af46aa26ec9a61bc996bb0de2e409943 (diff) |
Fixed crash when using 'var' property in ShaderEffect.
Also made CustomParticle and ShaderEffect share some code.
Task-number: QTBUG-23924
Change-Id: I975f71f031b379cf5e29302a9c931e4ead5437ea
Reviewed-by: Alan Alpert <alan.alpert@nokia.com>
Diffstat (limited to 'src/quick/items/qquickshadereffectnode_p.h')
-rw-r--r-- | src/quick/items/qquickshadereffectnode_p.h | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/src/quick/items/qquickshadereffectnode_p.h b/src/quick/items/qquickshadereffectnode_p.h index e22d2de9e2..1bbce86426 100644 --- a/src/quick/items/qquickshadereffectnode_p.h +++ b/src/quick/items/qquickshadereffectnode_p.h @@ -55,8 +55,14 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE struct QQuickShaderEffectMaterialKey { - QByteArray vertexCode; - QByteArray fragmentCode; + enum ShaderType + { + VertexShader, + FragmentShader, + ShaderTypeCount + }; + + QByteArray sourceCode[ShaderTypeCount]; const char *className; bool operator == (const QQuickShaderEffectMaterialKey &other) const; @@ -64,24 +70,21 @@ struct QQuickShaderEffectMaterialKey { uint qHash(const QQuickShaderEffectMaterialKey &key); -// TODO: Implement support for multisampling. -struct QQuickShaderEffectProgram : public QQuickShaderEffectMaterialKey -{ - QQuickShaderEffectProgram() : respectsOpacity(false), respectsMatrix(false) {} - - QVector<QByteArray> attributeNames; - QSet<QByteArray> uniformNames; - - uint respectsOpacity : 1; - uint respectsMatrix : 1; -}; - class QQuickCustomMaterialShader; class QQuickShaderEffectNode; class QQuickShaderEffectMaterial : public QSGMaterial { public: + struct UniformData + { + enum SpecialType { None, Sampler, Opacity, Matrix }; + + QByteArray name; + QVariant value; + SpecialType specialType; + }; + enum CullMode { NoCulling, @@ -94,13 +97,12 @@ public: virtual QSGMaterialShader *createShader() const; virtual int compare(const QSGMaterial *other) const; - void setCullMode(CullMode face); - CullMode cullMode() const; + QVector<QByteArray> attributes; + QVector<UniformData> uniforms[QQuickShaderEffectMaterialKey::ShaderTypeCount]; + QVector<QPair<QByteArray, QSGTextureProvider *> > textureProviders; + CullMode cullMode; - void setProgramSource(const QQuickShaderEffectProgram &); - void setUniforms(const QVector<QPair<QByteArray, QVariant> > &uniformValues); - void setTextureProviders(const QVector<QPair<QByteArray, QSGTextureProvider *> > &textures); - const QVector<QPair<QByteArray, QSGTextureProvider *> > &textureProviders() const; + void setProgramSource(const QQuickShaderEffectMaterialKey &source); void updateTextures() const; void invalidateTextureProvider(QSGTextureProvider *provider); @@ -114,11 +116,8 @@ protected: // one. To guarantee that the type pointer is unique, the type object must live as long as // there are any CustomMaterialShaders of that type. QSharedPointer<QSGMaterialType> m_type; + QQuickShaderEffectMaterialKey m_source; - QQuickShaderEffectProgram m_source; - QVector<QPair<QByteArray, QVariant> > m_uniformValues; - QVector<QPair<QByteArray, QSGTextureProvider *> > m_textures; - CullMode m_cullMode; QQuickShaderEffectNode *m_node; bool m_emittedLogChanged; @@ -137,17 +136,12 @@ public: virtual void preprocess(); - QQuickShaderEffectMaterial *shaderMaterial() { return &m_material; } - Q_SIGNALS: void logAndStatusChanged(const QString &, int status); private Q_SLOTS: void markDirtyTexture(); void textureProviderDestroyed(QObject *object); - -private: - QQuickShaderEffectMaterial m_material; }; QT_END_NAMESPACE |