diff options
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/CMakeLists.txt | 4 | ||||
-rw-r--r-- | src/particles/particles.qrc | 5 | ||||
-rw-r--r-- | src/particles/qquickimageparticle.cpp | 504 | ||||
-rw-r--r-- | src/particles/shaders/imageparticle.frag | 42 | ||||
-rw-r--r-- | src/particles/shaders/imageparticle.vert | 141 | ||||
-rw-r--r-- | src/particles/shaders/imageparticle_core.frag | 44 | ||||
-rw-r--r-- | src/particles/shaders/imageparticle_core.vert | 141 |
7 files changed, 19 insertions, 862 deletions
diff --git a/src/particles/CMakeLists.txt b/src/particles/CMakeLists.txt index 085b4d27f1..c0c72578bd 100644 --- a/src/particles/CMakeLists.txt +++ b/src/particles/CMakeLists.txt @@ -64,10 +64,6 @@ qt_add_resource(QuickParticles "particles" ${particles_resource_files} ) set(particles1_resource_files - "shaders/imageparticle.frag" - "shaders/imageparticle.vert" - "shaders/imageparticle_core.frag" - "shaders/imageparticle_core.vert" "shaders_ng/imageparticle_colored.frag.qsb" "shaders_ng/imageparticle_colored.vert.qsb" "shaders_ng/imageparticle_deformed.frag.qsb" diff --git a/src/particles/particles.qrc b/src/particles/particles.qrc index 7727691233..5e76563842 100644 --- a/src/particles/particles.qrc +++ b/src/particles/particles.qrc @@ -6,11 +6,6 @@ <file>particleresources/star.png</file> </qresource> <qresource prefix="/particles"> - <file>shaders/imageparticle.frag</file> - <file>shaders/imageparticle.vert</file> - <file>shaders/imageparticle_core.frag</file> - <file>shaders/imageparticle_core.vert</file> - <file>shaders_ng/imageparticle_simple.vert.qsb</file> <file>shaders_ng/imageparticle_simple.frag.qsb</file> <file>shaders_ng/imageparticle_tabled.vert.qsb</file> diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp index f2e3715061..d33db8de76 100644 --- a/src/particles/qquickimageparticle.cpp +++ b/src/particles/qquickimageparticle.cpp @@ -48,7 +48,6 @@ #include "qquickparticleemitter_p.h" #include <private/qquicksprite_p.h> #include <private/qquickspriteengine_p.h> -#include <QOpenGLFunctions> #include <QSGRendererInterface> #include <QtQuick/private/qsgshadersourcebuilder_p.h> #include <QtQuick/private/qsgplaintexture_p.h> @@ -86,91 +85,7 @@ class ImageMaterialData QSizeF animSheetSize; }; -class TabledMaterialShader : public QSGMaterialShader -{ -public: - TabledMaterialShader() - { - QSGShaderSourceBuilder builder; - const bool isES = QOpenGLContext::currentContext()->isOpenGLES(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert")); - builder.addDefinition(QByteArrayLiteral("TABLE")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_vertex_code = builder.source(); - builder.clear(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag")); - builder.addDefinition(QByteArrayLiteral("TABLE")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_fragment_code = builder.source(); - - Q_ASSERT(!m_vertex_code.isNull()); - Q_ASSERT(!m_fragment_code.isNull()); - } - - const char *vertexShader() const override { return m_vertex_code.constData(); } - const char *fragmentShader() const override { return m_fragment_code.constData(); } - - char const *const *attributeNames() const override - { - static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation", nullptr }; - return attr; - } - - void initialize() override { - program()->bind(); - program()->setUniformValue("_qt_texture", 0); - program()->setUniformValue("colortable", 1); - glFuncs = QOpenGLContext::currentContext()->functions(); - m_matrix_id = program()->uniformLocation("qt_Matrix"); - m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); - m_entry_id = program()->uniformLocation("entry"); - m_sizetable_id = program()->uniformLocation("sizetable"); - m_opacitytable_id = program()->uniformLocation("opacitytable"); - } - - void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override { - ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state(); - - if (renderState.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, renderState.combinedMatrix()); - if (renderState.isOpacityDirty() && m_opacity_id >= 0) - program()->setUniformValue(m_opacity_id, renderState.opacity()); - - glFuncs->glActiveTexture(GL_TEXTURE1); - state->colorTable->bind(); - - glFuncs->glActiveTexture(GL_TEXTURE0); - state->texture->bind(); - - program()->setUniformValue(m_timestamp_id, (float) state->timestamp); - program()->setUniformValue(m_entry_id, (float) state->entry); - program()->setUniformValueArray(m_sizetable_id, (const float*) state->sizeTable, UNIFORM_ARRAY_SIZE, 1); - program()->setUniformValueArray(m_opacitytable_id, (const float*) state->opacityTable, UNIFORM_ARRAY_SIZE, 1); - } - - int m_matrix_id; - int m_opacity_id; - int m_entry_id; - int m_timestamp_id; - int m_sizetable_id; - int m_opacitytable_id; - QByteArray m_vertex_code; - QByteArray m_fragment_code; - QOpenGLFunctions* glFuncs; -}; - -class TabledMaterialRhiShader : public QSGMaterialRhiShader +class TabledMaterialRhiShader : public QSGMaterialShader { public: TabledMaterialRhiShader() @@ -233,12 +148,8 @@ public: class TabledMaterial : public ImageMaterial { public: - TabledMaterial() { setFlag(SupportsRhiShader, true); } QSGMaterialShader *createShader() const override { - if (flags().testFlag(RhiShaderWanted)) - return new TabledMaterialRhiShader; - else - return new TabledMaterialShader; + return new TabledMaterialRhiShader; } QSGMaterialType *type() const override { return &m_type; } @@ -251,78 +162,7 @@ private: QSGMaterialType TabledMaterial::m_type; -class DeformableMaterialShader : public QSGMaterialShader -{ -public: - DeformableMaterialShader() - { - QSGShaderSourceBuilder builder; - const bool isES = QOpenGLContext::currentContext()->isOpenGLES(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_vertex_code = builder.source(); - builder.clear(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_fragment_code = builder.source(); - - Q_ASSERT(!m_vertex_code.isNull()); - Q_ASSERT(!m_fragment_code.isNull()); - } - - const char *vertexShader() const override { return m_vertex_code.constData(); } - const char *fragmentShader() const override { return m_fragment_code.constData(); } - - char const *const *attributeNames() const override - { - static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation", nullptr }; - return attr; - } - - void initialize() override { - program()->bind(); - program()->setUniformValue("_qt_texture", 0); - glFuncs = QOpenGLContext::currentContext()->functions(); - m_matrix_id = program()->uniformLocation("qt_Matrix"); - m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); - m_entry_id = program()->uniformLocation("entry"); - } - - void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override { - ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state(); - - if (renderState.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, renderState.combinedMatrix()); - if (renderState.isOpacityDirty() && m_opacity_id >= 0) - program()->setUniformValue(m_opacity_id, renderState.opacity()); - - state->texture->bind(); - - program()->setUniformValue(m_timestamp_id, (float) state->timestamp); - program()->setUniformValue(m_entry_id, (float) state->entry); - } - - int m_matrix_id; - int m_opacity_id; - int m_entry_id; - int m_timestamp_id; - QByteArray m_vertex_code; - QByteArray m_fragment_code; - QOpenGLFunctions* glFuncs; -}; - -class DeformableMaterialRhiShader : public QSGMaterialRhiShader +class DeformableMaterialRhiShader : public QSGMaterialShader { public: DeformableMaterialRhiShader() @@ -371,12 +211,8 @@ public: class DeformableMaterial : public ImageMaterial { public: - DeformableMaterial() { setFlag(SupportsRhiShader, true); } QSGMaterialShader *createShader() const override { - if (flags().testFlag(RhiShaderWanted)) - return new DeformableMaterialRhiShader; - else - return new DeformableMaterialShader; + return new DeformableMaterialRhiShader; } QSGMaterialType *type() const override { return &m_type; } @@ -389,96 +225,7 @@ private: QSGMaterialType DeformableMaterial::m_type; -class ParticleSpriteMaterialShader : public QSGMaterialShader -{ -public: - ParticleSpriteMaterialShader() - { - QSGShaderSourceBuilder builder; - const bool isES = QOpenGLContext::currentContext()->isOpenGLES(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert")); - builder.addDefinition(QByteArrayLiteral("SPRITE")); - builder.addDefinition(QByteArrayLiteral("TABLE")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_vertex_code = builder.source(); - builder.clear(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag")); - builder.addDefinition(QByteArrayLiteral("SPRITE")); - builder.addDefinition(QByteArrayLiteral("TABLE")); - builder.addDefinition(QByteArrayLiteral("DEFORM")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_fragment_code = builder.source(); - - Q_ASSERT(!m_vertex_code.isNull()); - Q_ASSERT(!m_fragment_code.isNull()); - } - - const char *vertexShader() const override { return m_vertex_code.constData(); } - const char *fragmentShader() const override { return m_fragment_code.constData(); } - - char const *const *attributeNames() const override - { - static const char *const attr[] = { "vPosTex", "vData", "vVec", "vColor", "vDeformVec", "vRotation", - "vAnimData", "vAnimPos", nullptr }; - return attr; - } - - void initialize() override { - program()->bind(); - program()->setUniformValue("_qt_texture", 0); - program()->setUniformValue("colortable", 1); - glFuncs = QOpenGLContext::currentContext()->functions(); - m_matrix_id = program()->uniformLocation("qt_Matrix"); - m_opacity_id = program()->uniformLocation("qt_Opacity"); - //Don't actually expose the animSheetSize in the shader, it's currently only used for CPU calculations. - m_timestamp_id = program()->uniformLocation("timestamp"); - m_entry_id = program()->uniformLocation("entry"); - m_sizetable_id = program()->uniformLocation("sizetable"); - m_opacitytable_id = program()->uniformLocation("opacitytable"); - } - - void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override { - ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state(); - - if (renderState.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, renderState.combinedMatrix()); - if (renderState.isOpacityDirty() && m_opacity_id >= 0) - program()->setUniformValue(m_opacity_id, renderState.opacity()); - - glFuncs->glActiveTexture(GL_TEXTURE1); - state->colorTable->bind(); - - // make sure we end by setting GL_TEXTURE0 as active texture - glFuncs->glActiveTexture(GL_TEXTURE0); - state->texture->bind(); - - program()->setUniformValue(m_timestamp_id, (float) state->timestamp); - program()->setUniformValue(m_entry_id, (float) state->entry); - program()->setUniformValueArray(m_sizetable_id, (const float*) state->sizeTable, 64, 1); - program()->setUniformValueArray(m_opacitytable_id, (const float*) state->opacityTable, UNIFORM_ARRAY_SIZE, 1); - } - - int m_matrix_id; - int m_opacity_id; - int m_timestamp_id; - int m_entry_id; - int m_sizetable_id; - int m_opacitytable_id; - QByteArray m_vertex_code; - QByteArray m_fragment_code; - QOpenGLFunctions* glFuncs; -}; - -class ParticleSpriteMaterialRhiShader : public QSGMaterialRhiShader +class ParticleSpriteMaterialRhiShader : public QSGMaterialShader { public: ParticleSpriteMaterialRhiShader() @@ -541,12 +288,8 @@ public: class SpriteMaterial : public ImageMaterial { public: - SpriteMaterial() { setFlag(SupportsRhiShader, true); } QSGMaterialShader *createShader() const override { - if (flags().testFlag(RhiShaderWanted)) - return new ParticleSpriteMaterialRhiShader; - else - return new ParticleSpriteMaterialShader; + return new ParticleSpriteMaterialRhiShader; } QSGMaterialType *type() const override { return &m_type; } @@ -559,90 +302,7 @@ private: QSGMaterialType SpriteMaterial::m_type; -class ColoredMaterialShader : public QSGMaterialShader -{ -public: - ColoredMaterialShader() - { - QSGShaderSourceBuilder builder; - const bool isES = QOpenGLContext::currentContext()->isOpenGLES(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_vertex_code = builder.source(); - builder.clear(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag")); - builder.addDefinition(QByteArrayLiteral("COLOR")); - if (isES) - builder.removeVersion(); - - m_fragment_code = builder.source(); - - Q_ASSERT(!m_vertex_code.isNull()); - Q_ASSERT(!m_fragment_code.isNull()); - } - - const char *vertexShader() const override { return m_vertex_code.constData(); } - const char *fragmentShader() const override { return m_fragment_code.constData(); } - - char const *const *attributeNames() const override - { - static const char *const attr[] = { "vPos", "vData", "vVec", "vColor", nullptr }; - return attr; - } - - void initialize() override { - program()->bind(); - program()->setUniformValue("_qt_texture", 0); - glFuncs = QOpenGLContext::currentContext()->functions(); - m_matrix_id = program()->uniformLocation("qt_Matrix"); - m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); - m_entry_id = program()->uniformLocation("entry"); - } - - void activate() override { -#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN) - glEnable(GL_POINT_SPRITE); - glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); -#endif - } - - void deactivate() override { -#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN) - glDisable(GL_POINT_SPRITE); - glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); -#endif - } - - void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override { - ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state(); - - if (renderState.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, renderState.combinedMatrix()); - if (renderState.isOpacityDirty() && m_opacity_id >= 0) - program()->setUniformValue(m_opacity_id, renderState.opacity()); - - state->texture->bind(); - - program()->setUniformValue(m_timestamp_id, (float) state->timestamp); - program()->setUniformValue(m_entry_id, (float) state->entry); - } - - int m_matrix_id; - int m_opacity_id; - int m_timestamp_id; - int m_entry_id; - QByteArray m_vertex_code; - QByteArray m_fragment_code; - QOpenGLFunctions* glFuncs; -}; - -class ColoredMaterialRhiShader : public QSGMaterialRhiShader +class ColoredMaterialRhiShader : public QSGMaterialShader { public: ColoredMaterialRhiShader() @@ -691,12 +351,8 @@ public: class ColoredMaterial : public ImageMaterial { public: - ColoredMaterial() { setFlag(SupportsRhiShader, true); } QSGMaterialShader *createShader() const override { - if (flags().testFlag(RhiShaderWanted)) - return new ColoredMaterialRhiShader; - else - return new ColoredMaterialShader; + return new ColoredMaterialRhiShader; } QSGMaterialType *type() const override { return &m_type; } @@ -709,88 +365,7 @@ private: QSGMaterialType ColoredMaterial::m_type; -class SimpleMaterialShader : public QSGMaterialShader -{ -public: - SimpleMaterialShader() - { - QSGShaderSourceBuilder builder; - const bool isES = QOpenGLContext::currentContext()->isOpenGLES(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.vert")); - if (isES) - builder.removeVersion(); - - m_vertex_code = builder.source(); - builder.clear(); - - builder.appendSourceFile(QStringLiteral(":/particles/shaders/imageparticle.frag")); - if (isES) - builder.removeVersion(); - - m_fragment_code = builder.source(); - - Q_ASSERT(!m_vertex_code.isNull()); - Q_ASSERT(!m_fragment_code.isNull()); - } - - const char *vertexShader() const override { return m_vertex_code.constData(); } - const char *fragmentShader() const override { return m_fragment_code.constData(); } - - char const *const *attributeNames() const override - { - static const char *const attr[] = { "vPos", "vData", "vVec", nullptr }; - return attr; - } - - void initialize() override { - program()->bind(); - program()->setUniformValue("_qt_texture", 0); - glFuncs = QOpenGLContext::currentContext()->functions(); - m_matrix_id = program()->uniformLocation("qt_Matrix"); - m_opacity_id = program()->uniformLocation("qt_Opacity"); - m_timestamp_id = program()->uniformLocation("timestamp"); - m_entry_id = program()->uniformLocation("entry"); - } - - void activate() override { -#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN) - glEnable(GL_POINT_SPRITE); - glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); -#endif - } - - void deactivate() override { -#if !QT_CONFIG(opengles2) && !defined(Q_OS_WIN) - glDisable(GL_POINT_SPRITE); - glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); -#endif - } - - void updateState(const RenderState &renderState, QSGMaterial *mat, QSGMaterial *) override { - ImageMaterialData *state = static_cast<ImageMaterial *>(mat)->state(); - - if (renderState.isMatrixDirty()) - program()->setUniformValue(m_matrix_id, renderState.combinedMatrix()); - if (renderState.isOpacityDirty() && m_opacity_id >= 0) - program()->setUniformValue(m_opacity_id, renderState.opacity()); - - state->texture->bind(); - - program()->setUniformValue(m_timestamp_id, (float) state->timestamp); - program()->setUniformValue(m_entry_id, (float) state->entry); - } - - int m_matrix_id; - int m_opacity_id; - int m_timestamp_id; - int m_entry_id; - QByteArray m_vertex_code; - QByteArray m_fragment_code; - QOpenGLFunctions* glFuncs; -}; - -class SimpleMaterialRhiShader : public QSGMaterialRhiShader +class SimpleMaterialRhiShader : public QSGMaterialShader { public: SimpleMaterialRhiShader() @@ -839,12 +414,8 @@ public: class SimpleMaterial : public ImageMaterial { public: - SimpleMaterial() { setFlag(SupportsRhiShader, true); } QSGMaterialShader *createShader() const override { - if (flags().testFlag(RhiShaderWanted)) - return new SimpleMaterialRhiShader; - else - return new SimpleMaterialShader; + return new SimpleMaterialRhiShader; } QSGMaterialType *type() const override { return &m_type; } @@ -1634,7 +1205,7 @@ void QQuickImageParticle::buildParticleNodes(QSGNode** passThrough) void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node) { - if (!m_rhi && !QOpenGLContext::currentContext()) + if (!m_rhi) return; if (m_count * 4 > 0xffff) { @@ -1682,36 +1253,11 @@ void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node) } } - if (!m_rhi) { // the RHI may be backed by GL but these checks should be obsolete in any case -#ifdef Q_OS_WIN - if (perfLevel < Deformable) //QTBUG-24540 , point sprite 'extension' isn't working on windows. - perfLevel = Deformable; -#endif - -#ifdef Q_OS_MAC - // macOS 10.8.3 introduced a bug in the AMD drivers, for at least the 2011 macbook pros, - // causing point sprites who read gl_PointCoord in the frag shader to come out as - // green-red blobs. - const GLubyte *glVendor = QOpenGLContext::currentContext()->functions()->glGetString(GL_VENDOR); - if (perfLevel < Deformable && glVendor && strstr((char *) glVendor, "ATI")) { - perfLevel = Deformable; - } -#endif - -#ifdef Q_OS_LINUX - // Nouveau drivers can potentially freeze a machine entirely when taking the point-sprite path. - const GLubyte *glVendor = QOpenGLContext::currentContext()->functions()->glGetString(GL_VENDOR); - if (perfLevel < Deformable && glVendor && strstr((const char *) glVendor, "nouveau")) - perfLevel = Deformable; -#endif - - } else { - // Points with a size other than 1 are an optional feature with QRhi - // because some of the underlying APIs have no support for this. - // Therefore, avoid the point sprite path with APIs like Direct3D. - if (perfLevel < Deformable && !m_rhi->isFeatureSupported(QRhi::VertexShaderPointSize)) - perfLevel = Deformable; - } + // Points with a size other than 1 are an optional feature with QRhi + // because some of the underlying APIs have no support for this. + // Therefore, avoid the point sprite path with APIs like Direct3D. + if (perfLevel < Deformable && !m_rhi->isFeatureSupported(QRhi::VertexShaderPointSize)) + perfLevel = Deformable; if (perfLevel >= Colored && !m_color.isValid()) m_color = QColor(Qt::white);//Hidden default, but different from unset @@ -1850,19 +1396,8 @@ void QQuickImageParticle::finishBuildParticleNodes(QSGNode** node) node->setGeometry(g); if (perfLevel <= Colored){ g->setDrawingMode(QSGGeometry::DrawPoints); - if (m_debugMode) { - if (m_rhi) { - qDebug("Using point sprites"); - } else { -#if QT_CONFIG(opengl) - GLfloat pointSizeRange[2]; - QOpenGLContext::currentContext()->functions()->glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange); - qDebug() << "Using point sprites, GL_ALIASED_POINT_SIZE_RANGE " <<pointSizeRange[0] << ":" << pointSizeRange[1]; -#else - qDebug("Using point sprites"); -#endif - } - } + if (m_debugMode) + qDebug("Using point sprites"); } else { g->setDrawingMode(QSGGeometry::DrawTriangles); } @@ -1918,10 +1453,9 @@ QSGNode *QQuickImageParticle::updatePaintNode(QSGNode *node, UpdatePaintNodeData return nullptr; QSGRendererInterface::GraphicsApi api = rif->graphicsApi(); - const bool isDirectOpenGL = api == QSGRendererInterface::OpenGL; const bool isRhi = QSGRendererInterface::isApiRhiBased(api); - if (!node && !isDirectOpenGL && !isRhi) + if (!node && !isRhi) return nullptr; if (isRhi) diff --git a/src/particles/shaders/imageparticle.frag b/src/particles/shaders/imageparticle.frag deleted file mode 100644 index 92795a5381..0000000000 --- a/src/particles/shaders/imageparticle.frag +++ /dev/null @@ -1,42 +0,0 @@ -#version 120 - -uniform sampler2D _qt_texture; -uniform lowp float qt_Opacity; - -#if defined(SPRITE) -varying highp vec4 fTexS; -#elif defined(DEFORM) -varying highp vec2 fTex; -#endif - -#if defined(COLOR) -varying lowp vec4 fColor; -#else -varying lowp float fFade; -#endif - -#if defined(TABLE) -varying lowp vec2 tt; -uniform sampler2D colortable; -#endif - -void main() -{ -#if defined(SPRITE) - gl_FragColor = mix(texture2D(_qt_texture, fTexS.xy), texture2D(_qt_texture, fTexS.zw), tt.y) - * fColor - * texture2D(colortable, tt) - * qt_Opacity; -#elif defined(TABLE) - gl_FragColor = texture2D(_qt_texture, fTex) - * fColor - * texture2D(colortable, tt) - * qt_Opacity; -#elif defined(DEFORM) - gl_FragColor = (texture2D(_qt_texture, fTex)) * fColor * qt_Opacity; -#elif defined(COLOR) - gl_FragColor = (texture2D(_qt_texture, gl_PointCoord)) * fColor * qt_Opacity; -#else - gl_FragColor = texture2D(_qt_texture, gl_PointCoord) * (fFade * qt_Opacity); -#endif -}
\ No newline at end of file diff --git a/src/particles/shaders/imageparticle.vert b/src/particles/shaders/imageparticle.vert deleted file mode 100644 index 4057a9eb4b..0000000000 --- a/src/particles/shaders/imageparticle.vert +++ /dev/null @@ -1,141 +0,0 @@ -#version 120 - -#if defined(DEFORM) -attribute highp vec4 vPosTex; -#else -attribute highp vec2 vPos; -#endif - -attribute highp vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize -attribute highp vec4 vVec; // x,y = constant velocity, z,w = acceleration -uniform highp float entry; - -#if defined(COLOR) -attribute highp vec4 vColor; -#endif - -#if defined(DEFORM) -attribute highp vec4 vDeformVec; // x,y x unit vector; z,w = y unit vector -attribute highp vec3 vRotation; // x = radians of rotation, y = rotation velocity, z = bool autoRotate -#endif - -#if defined(SPRITE) -attribute highp vec3 vAnimData; // w,h(premultiplied of anim), interpolation progress -attribute highp vec4 vAnimPos; // x,y, x,y (two frames for interpolation) -#endif - -uniform highp mat4 qt_Matrix; -uniform highp float timestamp; - -#if defined(TABLE) -varying lowp vec2 tt;//y is progress if Sprite mode -uniform highp float sizetable[64]; -uniform highp float opacitytable[64]; -#endif - -#if defined(SPRITE) -varying highp vec4 fTexS; -#elif defined(DEFORM) -varying highp vec2 fTex; -#endif - -#if defined(COLOR) -varying lowp vec4 fColor; -#else -varying lowp float fFade; -#endif - - -void main() -{ - highp float t = (timestamp - vData.x) / vData.y; - if (t < 0. || t > 1.) { -#if defined(DEFORM) - gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); -#else - gl_PointSize = 0.; -#endif - } else { -#if defined(SPRITE) - tt.y = vAnimData.z; - - // Calculate frame location in texture - fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy; - - // Next frame is also passed, for interpolation - fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy; - -#elif defined(DEFORM) - fTex = vPosTex.zw; -#endif - highp float currentSize = mix(vData.z, vData.w, t * t); - lowp float fade = 1.; - highp float fadeIn = min(t * 10., 1.); - highp float fadeOut = 1. - clamp((t - 0.75) * 4.,0., 1.); - -#if defined(TABLE) - currentSize = currentSize * sizetable[int(floor(t*64.))]; - fade = fade * opacitytable[int(floor(t*64.))]; -#endif - - if (entry == 1.) - fade = fade * fadeIn * fadeOut; - else if (entry == 2.) - currentSize = currentSize * fadeIn * fadeOut; - - if (currentSize <= 0.) { -#if defined(DEFORM) - gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); -#else - gl_PointSize = 0.; -#endif - } else { - if (currentSize < 3.) // Sizes too small look jittery as they move - currentSize = 3.; - - highp vec2 pos; -#if defined(DEFORM) - highp float rotation = vRotation.x + vRotation.y * t * vData.y; - if (vRotation.z == 1.0){ - highp vec2 curVel = vVec.zw * t * vData.y + vVec.xy; - if (length(curVel) > 0.) - rotation += atan(curVel.y, curVel.x); - } - highp vec2 trigCalcs = vec2(cos(rotation), sin(rotation)); - highp vec4 deform = vDeformVec * currentSize * (vPosTex.zzww - 0.5); - highp vec4 rotatedDeform = deform.xxzz * trigCalcs.xyxy; - rotatedDeform = rotatedDeform + (deform.yyww * trigCalcs.yxyx * vec4(-1.,1.,-1.,1.)); - /* The readable version: - highp vec2 xDeform = vDeformVec.xy * currentSize * (vTex.x-0.5); - highp vec2 yDeform = vDeformVec.zw * currentSize * (vTex.y-0.5); - highp vec2 xRotatedDeform; - xRotatedDeform.x = trigCalcs.x*xDeform.x - trigCalcs.y*xDeform.y; - xRotatedDeform.y = trigCalcs.y*xDeform.x + trigCalcs.x*xDeform.y; - highp vec2 yRotatedDeform; - yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y; - yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y; - */ - pos = vPosTex.xy - + rotatedDeform.xy - + rotatedDeform.zw - + vVec.xy * t * vData.y // apply velocity - + 0.5 * vVec.zw * pow(t * vData.y, 2.); // apply acceleration -#else - pos = vPos - + vVec.xy * t * vData.y // apply velocity vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); - gl_PointSize = currentSize; -#endif - gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); - -#if defined(COLOR) - fColor = vColor * fade; -#else - fFade = fade; -#endif -#if defined(TABLE) - tt.x = t; -#endif - } - } -} diff --git a/src/particles/shaders/imageparticle_core.frag b/src/particles/shaders/imageparticle_core.frag deleted file mode 100644 index 3ac8c8d34e..0000000000 --- a/src/particles/shaders/imageparticle_core.frag +++ /dev/null @@ -1,44 +0,0 @@ -#version 150 core - -#if defined(SPRITE) -in vec4 fTexS; -#elif defined(DEFORM) -in vec2 fTex; -#endif - -#if defined(COLOR) -in vec4 fColor; -#else -in float fFade; -#endif - -#if defined(TABLE) -in vec2 tt; -uniform sampler2D colortable; -#endif - -out vec4 fragColor; - -uniform sampler2D _qt_texture; -uniform float qt_Opacity; - -void main() -{ -#if defined(SPRITE) - fragColor = mix(texture(_qt_texture, fTexS.xy), texture(_qt_texture, fTexS.zw), tt.y) - * fColor - * texture(colortable, tt) - * qt_Opacity; -#elif defined(TABLE) - fragColor = texture(_qt_texture, fTex) - * fColor - * texture(colortable, tt) - * qt_Opacity; -#elif defined(DEFORM) - fragColor = texture(_qt_texture, fTex) * fColor * qt_Opacity; -#elif defined(COLOR) - fragColor = texture(_qt_texture, gl_PointCoord) * fColor * qt_Opacity; -#else - fragColor = texture(_qt_texture, gl_PointCoord) * fFade * qt_Opacity; -#endif -}
\ No newline at end of file diff --git a/src/particles/shaders/imageparticle_core.vert b/src/particles/shaders/imageparticle_core.vert deleted file mode 100644 index cfa0d57dfd..0000000000 --- a/src/particles/shaders/imageparticle_core.vert +++ /dev/null @@ -1,141 +0,0 @@ -#version 150 core - -#if defined(DEFORM) -in vec4 vPosTex; -#else -in vec2 vPos; -#endif - -in vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize -in vec4 vVec; // x,y = constant velocity, z,w = acceleration -uniform float entry; - -#if defined(COLOR) -in vec4 vColor; -#endif - -#if defined(DEFORM) -in vec4 vDeformVec; // x,y x unit vector; z,w = y unit vector -in vec3 vRotation; // x = radians of rotation, y = rotation velocity, z = bool autoRotate -#endif - -#if defined(SPRITE) -in vec3 vAnimData; // w,h(premultiplied of anim), interpolation progress -in vec4 vAnimPos; // x,y, x,y (two frames for interpolation) -#endif - -uniform mat4 qt_Matrix; -uniform float timestamp; - -#if defined(TABLE) -out vec2 tt;//y is progress if Sprite mode -uniform float sizetable[64]; -uniform float opacitytable[64]; -#endif - -#if defined(SPRITE) -out vec4 fTexS; -#elif defined(DEFORM) -out vec2 fTex; -#endif - -#if defined(COLOR) -out vec4 fColor; -#else -out float fFade; -#endif - - -void main() -{ - float t = (timestamp - vData.x) / vData.y; - if (t < 0. || t > 1.) { -#if defined(DEFORM) - gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); -#else - gl_PointSize = 0.; -#endif - } else { -#if defined(SPRITE) - tt.y = vAnimData.z; - - // Calculate frame location in texture - fTexS.xy = vAnimPos.xy + vPosTex.zw * vAnimData.xy; - - // Next frame is also passed, for interpolation - fTexS.zw = vAnimPos.zw + vPosTex.zw * vAnimData.xy; - -#elif defined(DEFORM) - fTex = vPosTex.zw; -#endif - float currentSize = mix(vData.z, vData.w, t * t); - float fade = 1.; - float fadeIn = min(t * 10., 1.); - float fadeOut = 1. - clamp((t - 0.75) * 4.,0., 1.); - -#if defined(TABLE) - currentSize = currentSize * sizetable[int(floor(t*64.))]; - fade = fade * opacitytable[int(floor(t*64.))]; -#endif - - if (entry == 1.) - fade = fade * fadeIn * fadeOut; - else if (entry == 2.) - currentSize = currentSize * fadeIn * fadeOut; - - if (currentSize <= 0.) { -#if defined(DEFORM) - gl_Position = qt_Matrix * vec4(vPosTex.x, vPosTex.y, 0., 1.); -#else - gl_PointSize = 0.; -#endif - } else { - if (currentSize < 3.) // Sizes too small look jittery as they move - currentSize = 3.; - - vec2 pos; -#if defined(DEFORM) - float rotation = vRotation.x + vRotation.y * t * vData.y; - if (vRotation.z == 1.0) { - vec2 curVel = vVec.zw * t * vData.y + vVec.xy; - if (length(curVel) > 0.) - rotation += atan(curVel.y, curVel.x); - } - vec2 trigCalcs = vec2(cos(rotation), sin(rotation)); - vec4 deform = vDeformVec * currentSize * (vPosTex.zzww - 0.5); - vec4 rotatedDeform = deform.xxzz * trigCalcs.xyxy; - rotatedDeform = rotatedDeform + (deform.yyww * trigCalcs.yxyx * vec4(-1.,1.,-1.,1.)); - /* The readable version: - vec2 xDeform = vDeformVec.xy * currentSize * (vTex.x-0.5); - vec2 yDeform = vDeformVec.zw * currentSize * (vTex.y-0.5); - vec2 xRotatedDeform; - xRotatedDeform.x = trigCalcs.x*xDeform.x - trigCalcs.y*xDeform.y; - xRotatedDeform.y = trigCalcs.y*xDeform.x + trigCalcs.x*xDeform.y; - vec2 yRotatedDeform; - yRotatedDeform.x = trigCalcs.x*yDeform.x - trigCalcs.y*yDeform.y; - yRotatedDeform.y = trigCalcs.y*yDeform.x + trigCalcs.x*yDeform.y; - */ - pos = vPosTex.xy - + rotatedDeform.xy - + rotatedDeform.zw - + vVec.xy * t * vData.y // apply velocity - + 0.5 * vVec.zw * pow(t * vData.y, 2.); // apply acceleration -#else - pos = vPos - + vVec.xy * t * vData.y // apply velocity vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); - gl_PointSize = currentSize; -#endif - gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); - -#if defined(COLOR) - fColor = vColor * fade; -#else - fFade = fade; -#endif -#if defined(TABLE) - tt.x = t; -#endif - } - } -} |