diff options
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/items.pri | 11 | ||||
-rw-r--r-- | src/quick/items/items.qrc | 10 | ||||
-rw-r--r-- | src/quick/items/qquickanimatedsprite.cpp | 41 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffect.cpp | 33 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffectnode.cpp | 16 | ||||
-rw-r--r-- | src/quick/items/qquickspritesequence.cpp | 41 | ||||
-rw-r--r-- | src/quick/items/shaders/shadereffect.frag | 9 | ||||
-rw-r--r-- | src/quick/items/shaders/shadereffect.vert | 12 | ||||
-rw-r--r-- | src/quick/items/shaders/shadereffectfallback.frag | 4 | ||||
-rw-r--r-- | src/quick/items/shaders/shadereffectfallback.vert | 8 | ||||
-rw-r--r-- | src/quick/items/shaders/sprite.frag | 12 | ||||
-rw-r--r-- | src/quick/items/shaders/sprite.vert | 23 |
12 files changed, 113 insertions, 107 deletions
diff --git a/src/quick/items/items.pri b/src/quick/items/items.pri index cbdc5fd80f..d0ebbcfcdb 100644 --- a/src/quick/items/items.pri +++ b/src/quick/items/items.pri @@ -139,6 +139,15 @@ HEADERS += \ $$PWD/qquickshadereffectnode_p.h \ $$PWD/qquickshadereffectsource_p.h \ -include(context2d/context2d.pri) +OTHER_FILES += \ + $$PWD/shaders/sprite.vert \ + $$PWD/shaders/sprite.frag \ + $$PWD/shaders/shadereffect.vert \ + $$PWD/shaders/shadereffect.frag \ + $$PWD/shaders/shadereffectfallback.vert \ + $$PWD/shaders/shadereffectfallback.frag +RESOURCES += \ + $$PWD/items.qrc +include(context2d/context2d.pri) diff --git a/src/quick/items/items.qrc b/src/quick/items/items.qrc new file mode 100644 index 0000000000..837cffb65a --- /dev/null +++ b/src/quick/items/items.qrc @@ -0,0 +1,10 @@ +<RCC> + <qresource prefix="/items"> + <file>shaders/sprite.frag</file> + <file>shaders/sprite.vert</file> + <file>shaders/shadereffect.vert</file> + <file>shaders/shadereffect.frag</file> + <file>shaders/shadereffectfallback.frag</file> + <file>shaders/shadereffectfallback.vert</file> + </qresource> +</RCC> diff --git a/src/quick/items/qquickanimatedsprite.cpp b/src/quick/items/qquickanimatedsprite.cpp index c90adc24a5..4c16a1e9e2 100644 --- a/src/quick/items/qquickanimatedsprite.cpp +++ b/src/quick/items/qquickanimatedsprite.cpp @@ -57,39 +57,6 @@ QT_BEGIN_NAMESPACE -static const char vertexShaderCode[] = - "attribute highp vec2 vPos;\n" - "attribute highp vec2 vTex;\n" - "uniform highp vec3 animData;// w,h(premultiplied of anim), interpolation progress\n" - "uniform highp vec4 animPos;//x,y, x,y (two frames for interpolation)\n" - "\n" - "uniform highp mat4 qt_Matrix;\n" - "\n" - "varying highp vec4 fTexS;\n" - "varying lowp float progress;\n" - "\n" - "\n" - "void main() {\n" - " progress = animData.z;\n" - " //Calculate frame location in texture\n" - " fTexS.xy = animPos.xy + vTex.xy * animData.xy;\n" - " //Next frame is also passed, for interpolation\n" - " fTexS.zw = animPos.zw + vTex.xy * animData.xy;\n" - "\n" - " gl_Position = qt_Matrix * vec4(vPos.x, vPos.y, 0, 1);\n" - "}\n"; - -static const char fragmentShaderCode[] = - "uniform sampler2D _qt_texture;\n" - "uniform lowp float qt_Opacity;\n" - "\n" - "varying highp vec4 fTexS;\n" - "varying lowp float progress;\n" - "\n" - "void main() {\n" - " gl_FragColor = mix(texture2D(_qt_texture, fTexS.xy), texture2D(_qt_texture, fTexS.zw), progress) * qt_Opacity;\n" - "}\n"; - class QQuickAnimatedSpriteMaterial : public QSGMaterial { public: @@ -134,8 +101,11 @@ QQuickAnimatedSpriteMaterial::~QQuickAnimatedSpriteMaterial() class AnimatedSpriteMaterialData : public QSGMaterialShader { public: - AnimatedSpriteMaterialData(const char * /* vertexFile */ = 0, const char * /* fragmentFile */ = 0) + AnimatedSpriteMaterialData() + : QSGMaterialShader() { + setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/items/shaders/sprite.vert")); + setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/items/shaders/sprite.frag")); } virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *) @@ -158,9 +128,6 @@ public: m_animPos_id = program()->uniformLocation("animPos"); } - virtual const char *vertexShader() const { return vertexShaderCode; } - virtual const char *fragmentShader() const { return fragmentShaderCode; } - virtual char const *const *attributeNames() const { static const char *attr[] = { "vPos", diff --git a/src/quick/items/qquickshadereffect.cpp b/src/quick/items/qquickshadereffect.cpp index 354b9f751b..9c766a1622 100644 --- a/src/quick/items/qquickshadereffect.cpp +++ b/src/quick/items/qquickshadereffect.cpp @@ -43,6 +43,7 @@ #include <private/qquickshadereffectnode_p.h> #include <QtQuick/qsgmaterial.h> +#include <QtQuick/private/qsgshadersourcebuilder_p.h> #include "qquickitem_p.h" #include <QtQuick/private/qsgcontext_p.h> @@ -57,24 +58,6 @@ QT_BEGIN_NAMESPACE -static const char qt_default_vertex_code[] = - "uniform highp mat4 qt_Matrix; \n" - "attribute highp vec4 qt_Vertex; \n" - "attribute highp vec2 qt_MultiTexCoord0; \n" - "varying highp vec2 qt_TexCoord0; \n" - "void main() { \n" - " qt_TexCoord0 = qt_MultiTexCoord0; \n" - " gl_Position = qt_Matrix * qt_Vertex; \n" - "}"; - -static const char qt_default_fragment_code[] = - "varying highp vec2 qt_TexCoord0; \n" - "uniform sampler2D source; \n" - "uniform lowp float qt_Opacity; \n" - "void main() { \n" - " gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity; \n" - "}"; - static const char qt_position_attribute_name[] = "qt_Vertex"; static const char qt_texcoord_attribute_name[] = "qt_MultiTexCoord0"; @@ -979,10 +962,16 @@ QSGNode *QQuickShaderEffect::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDa if (m_dirtyProgram) { Key s = m_common.source; - if (s.sourceCode[Key::FragmentShader].isEmpty()) - s.sourceCode[Key::FragmentShader] = qt_default_fragment_code; - if (s.sourceCode[Key::VertexShader].isEmpty()) - s.sourceCode[Key::VertexShader] = qt_default_vertex_code; + QSGShaderSourceBuilder builder; + if (s.sourceCode[Key::FragmentShader].isEmpty()) { + builder.appendSourceFile(QStringLiteral(":/items/shaders/shadereffect.frag")); + s.sourceCode[Key::FragmentShader] = builder.source(); + builder.clear(); + } + if (s.sourceCode[Key::VertexShader].isEmpty()) { + builder.appendSourceFile(QStringLiteral(":/items/shaders/shadereffect.vert")); + s.sourceCode[Key::VertexShader] = builder.source(); + } s.className = metaObject()->className(); material->setProgramSource(s); diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp index b84d251de5..8788fa8362 100644 --- a/src/quick/items/qquickshadereffectnode.cpp +++ b/src/quick/items/qquickshadereffectnode.cpp @@ -45,6 +45,7 @@ #include "qquickshadereffect_p.h" #include <QtQuick/qsgtextureprovider.h> #include <QtQuick/private/qsgrenderer_p.h> +#include <QtQuick/private/qsgshadersourcebuilder_p.h> QT_BEGIN_NAMESPACE @@ -276,20 +277,15 @@ void QQuickCustomMaterialShader::compile() m_log += program()->log(); } - static const char fallbackVertexShader[] = - "uniform highp mat4 qt_Matrix;" - "attribute highp vec4 v;" - "void main() { gl_Position = qt_Matrix * v; }"; - static const char fallbackFragmentShader[] = - "void main() { gl_FragColor = vec4(1., 0., 1., 1.); }"; - if (!m_compiled) { qWarning("QQuickCustomMaterialShader: Shader compilation failed:"); qWarning() << program()->log(); - program()->removeAllShaders(); - program()->addShaderFromSourceCode(QOpenGLShader::Vertex, fallbackVertexShader); - program()->addShaderFromSourceCode(QOpenGLShader::Fragment, fallbackFragmentShader); + QSGShaderSourceBuilder::initializeProgramFromFiles( + program(), + QStringLiteral(":/items/shaders/shadereffectfallback.vert"), + QStringLiteral(":/items/shaders/shadereffectfallback.frag")); + #ifndef QT_NO_DEBUG for (int i = 0; i < attrCount; ++i) { #else diff --git a/src/quick/items/qquickspritesequence.cpp b/src/quick/items/qquickspritesequence.cpp index 8a6789bb9f..28f1397cc9 100644 --- a/src/quick/items/qquickspritesequence.cpp +++ b/src/quick/items/qquickspritesequence.cpp @@ -56,39 +56,6 @@ QT_BEGIN_NAMESPACE -static const char vertexShaderCode[] = - "attribute highp vec2 vPos;\n" - "attribute highp vec2 vTex;\n" - "uniform highp vec3 animData;// w,h(premultiplied of anim), interpolation progress\n" - "uniform highp vec4 animPos;//x,y, x,y (two frames for interpolation)\n" - "\n" - "uniform highp mat4 qt_Matrix;\n" - "\n" - "varying highp vec4 fTexS;\n" - "varying lowp float progress;\n" - "\n" - "\n" - "void main() {\n" - " progress = animData.z;\n" - " //Calculate frame location in texture\n" - " fTexS.xy = animPos.xy + vTex.xy * animData.xy;\n" - " //Next frame is also passed, for interpolation\n" - " fTexS.zw = animPos.zw + vTex.xy * animData.xy;\n" - "\n" - " gl_Position = qt_Matrix * vec4(vPos.x, vPos.y, 0, 1);\n" - "}\n"; - -static const char fragmentShaderCode[] = - "uniform sampler2D _qt_texture;\n" - "uniform lowp float qt_Opacity;\n" - "\n" - "varying highp vec4 fTexS;\n" - "varying lowp float progress;\n" - "\n" - "void main() {\n" - " gl_FragColor = mix(texture2D(_qt_texture, fTexS.xy), texture2D(_qt_texture, fTexS.zw), progress) * qt_Opacity;\n" - "}\n"; - class QQuickSpriteSequenceMaterial : public QSGMaterial { public: @@ -133,8 +100,11 @@ QQuickSpriteSequenceMaterial::~QQuickSpriteSequenceMaterial() class SpriteSequenceMaterialData : public QSGMaterialShader { public: - SpriteSequenceMaterialData(const char * /* vertexFile */ = 0, const char * /* fragmentFile */ = 0) + SpriteSequenceMaterialData() + : QSGMaterialShader() { + setShaderSourceFile(QOpenGLShader::Vertex, QStringLiteral(":/items/shaders/sprite.vert")); + setShaderSourceFile(QOpenGLShader::Fragment, QStringLiteral(":/items/shaders/sprite.frag")); } virtual void updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *) @@ -157,9 +127,6 @@ public: m_animPos_id = program()->uniformLocation("animPos"); } - virtual const char *vertexShader() const { return vertexShaderCode; } - virtual const char *fragmentShader() const { return fragmentShaderCode; } - virtual char const *const *attributeNames() const { static const char *attr[] = { "vPos", diff --git a/src/quick/items/shaders/shadereffect.frag b/src/quick/items/shaders/shadereffect.frag new file mode 100644 index 0000000000..c1c15ecb0c --- /dev/null +++ b/src/quick/items/shaders/shadereffect.frag @@ -0,0 +1,9 @@ +varying highp vec2 qt_TexCoord0; + +uniform sampler2D source; +uniform lowp float qt_Opacity; + +void main() +{ + gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity; +}
\ No newline at end of file diff --git a/src/quick/items/shaders/shadereffect.vert b/src/quick/items/shaders/shadereffect.vert new file mode 100644 index 0000000000..ae1e84a50c --- /dev/null +++ b/src/quick/items/shaders/shadereffect.vert @@ -0,0 +1,12 @@ +uniform highp mat4 qt_Matrix; + +attribute highp vec4 qt_Vertex; +attribute highp vec2 qt_MultiTexCoord0; + +varying highp vec2 qt_TexCoord0; + +void main() +{ + qt_TexCoord0 = qt_MultiTexCoord0; + gl_Position = qt_Matrix * qt_Vertex; +}
\ No newline at end of file diff --git a/src/quick/items/shaders/shadereffectfallback.frag b/src/quick/items/shaders/shadereffectfallback.frag new file mode 100644 index 0000000000..d279e54083 --- /dev/null +++ b/src/quick/items/shaders/shadereffectfallback.frag @@ -0,0 +1,4 @@ +void main() +{ + gl_FragColor = vec4(1., 0., 1., 1.); +}
\ No newline at end of file diff --git a/src/quick/items/shaders/shadereffectfallback.vert b/src/quick/items/shaders/shadereffectfallback.vert new file mode 100644 index 0000000000..0a11a1d340 --- /dev/null +++ b/src/quick/items/shaders/shadereffectfallback.vert @@ -0,0 +1,8 @@ +uniform highp mat4 qt_Matrix; + +attribute highp vec4 v; + +void main() +{ + gl_Position = qt_Matrix * v; +}
\ No newline at end of file diff --git a/src/quick/items/shaders/sprite.frag b/src/quick/items/shaders/sprite.frag new file mode 100644 index 0000000000..e1fcb0f006 --- /dev/null +++ b/src/quick/items/shaders/sprite.frag @@ -0,0 +1,12 @@ +uniform sampler2D _qt_texture; +uniform lowp float qt_Opacity; + +varying highp vec4 fTexS; +varying lowp float progress; + +void main() +{ + gl_FragColor = mix(texture2D(_qt_texture, fTexS.xy), + texture2D(_qt_texture, fTexS.zw), + progress) * qt_Opacity; +}
\ No newline at end of file diff --git a/src/quick/items/shaders/sprite.vert b/src/quick/items/shaders/sprite.vert new file mode 100644 index 0000000000..fc826f60b4 --- /dev/null +++ b/src/quick/items/shaders/sprite.vert @@ -0,0 +1,23 @@ +attribute highp vec2 vPos; +attribute highp vec2 vTex; + +uniform highp vec3 animData;// w,h(premultiplied of anim), interpolation progress +uniform highp vec4 animPos;//x,y, x,y (two frames for interpolation) + +uniform highp mat4 qt_Matrix; + +varying highp vec4 fTexS; +varying lowp float progress; + +void main() +{ + progress = animData.z; + + // Calculate frame location in texture + fTexS.xy = animPos.xy + vTex.xy * animData.xy; + + // Next frame is also passed, for interpolation + fTexS.zw = animPos.zw + vTex.xy * animData.xy; + + gl_Position = qt_Matrix * vec4(vPos.x, vPos.y, 0, 1); +}
\ No newline at end of file |