aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEirik Aavitsland <eirik.aavitsland@qt.io>2020-05-28 14:21:52 +0200
committerEirik Aavitsland <eirik.aavitsland@qt.io>2020-06-02 11:15:44 +0200
commitff293f3afc0a9fe892124af4a10d29f2410569e4 (patch)
treef4200a4be4fab1252184d9db58bd874f76da3063 /src
parent0d0f6ab80349963f3aaa387992b0edfadddb62a4 (diff)
Remove CustomParticle
The implementation is intertwined with the direct GL path and not really portable to RHI. Fixes: QTBUG-78574 Change-Id: I6ac8707544c19a24661f07e0e6d2fc405e49cbff Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/particles/CMakeLists.txt11
-rw-r--r--src/particles/particles.pri14
-rw-r--r--src/particles/particles.qrc6
-rw-r--r--src/particles/qquickcustomparticle.cpp465
-rw-r--r--src/particles/qquickcustomparticle_p.h127
-rw-r--r--src/particles/qquickparticlesmodule.cpp3
-rw-r--r--src/particles/qquickparticlesystem.cpp2
-rw-r--r--src/particles/qquickparticlesystem_p.h5
-rw-r--r--src/particles/qquickv4particledata.cpp2
-rw-r--r--src/particles/shaders/customparticle.frag11
-rw-r--r--src/particles/shaders/customparticle.vert4
-rw-r--r--src/particles/shaders/customparticle_core.frag13
-rw-r--r--src/particles/shaders/customparticle_core.vert4
-rw-r--r--src/particles/shaders/customparticletemplate.vert28
-rw-r--r--src/particles/shaders/customparticletemplate_core.vert28
-rw-r--r--src/quick/doc/src/concepts/effects/particles.qdoc7
-rw-r--r--src/quick/items/qquickopenglshadereffect_p.h2
17 files changed, 4 insertions, 728 deletions
diff --git a/src/particles/CMakeLists.txt b/src/particles/CMakeLists.txt
index 4f3ed5daf4..085b4d27f1 100644
--- a/src/particles/CMakeLists.txt
+++ b/src/particles/CMakeLists.txt
@@ -64,12 +64,6 @@ qt_add_resource(QuickParticles "particles"
${particles_resource_files}
)
set(particles1_resource_files
- "shaders/customparticle.frag"
- "shaders/customparticle.vert"
- "shaders/customparticle_core.frag"
- "shaders/customparticle_core.vert"
- "shaders/customparticletemplate.vert"
- "shaders/customparticletemplate_core.vert"
"shaders/imageparticle.frag"
"shaders/imageparticle.vert"
"shaders/imageparticle_core.frag"
@@ -121,11 +115,6 @@ qt_extend_target(QuickParticles CONDITION EXISTS "qqml_enable_gcov"
-ftest-coverage
)
-qt_extend_target(QuickParticles CONDITION QT_FEATURE_quick_shadereffect
- SOURCES
- qquickcustomparticle.cpp qquickcustomparticle_p.h
-)
-
set_target_properties(QuickParticles PROPERTIES
QT_QML_MODULE_INSTALL_QMLTYPES TRUE
QT_QML_MODULE_VERSION ${CMAKE_PROJECT_VERSION}
diff --git a/src/particles/particles.pri b/src/particles/particles.pri
index adb43b5e45..d2164ec258 100644
--- a/src/particles/particles.pri
+++ b/src/particles/particles.pri
@@ -62,23 +62,9 @@ SOURCES += \
$$PWD/qquickparticlegroup.cpp \
$$PWD/qquickgroupgoal.cpp
-qtConfig(quick-shadereffect) {
-HEADERS += \
- $$PWD/qquickcustomparticle_p.h
-
-SOURCES += \
- $$PWD/qquickcustomparticle.cpp
-}
-
OTHER_FILES += \
- $$PWD/shaders/customparticletemplate.vert \
- $$PWD/shaders/customparticle.vert \
- $$PWD/shaders/customparticle.frag \
$$PWD/shaders/imageparticle.vert \
$$PWD/shaders/imageparticle.frag \
- $$PWD/shaders/customparticletemplate_core.vert \
- $$PWD/shaders/customparticle_core.vert \
- $$PWD/shaders/customparticle_core.frag \
$$PWD/shaders/imageparticle_core.vert \
$$PWD/shaders/imageparticle_core.frag
diff --git a/src/particles/particles.qrc b/src/particles/particles.qrc
index c7102b9aa5..7727691233 100644
--- a/src/particles/particles.qrc
+++ b/src/particles/particles.qrc
@@ -6,14 +6,8 @@
<file>particleresources/star.png</file>
</qresource>
<qresource prefix="/particles">
- <file>shaders/customparticle.frag</file>
- <file>shaders/customparticle.vert</file>
- <file>shaders/customparticletemplate.vert</file>
<file>shaders/imageparticle.frag</file>
<file>shaders/imageparticle.vert</file>
- <file>shaders/customparticle_core.frag</file>
- <file>shaders/customparticle_core.vert</file>
- <file>shaders/customparticletemplate_core.vert</file>
<file>shaders/imageparticle_core.frag</file>
<file>shaders/imageparticle_core.vert</file>
diff --git a/src/particles/qquickcustomparticle.cpp b/src/particles/qquickcustomparticle.cpp
deleted file mode 100644
index ecb71cb913..0000000000
--- a/src/particles/qquickcustomparticle.cpp
+++ /dev/null
@@ -1,465 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qquickcustomparticle_p.h"
-#include <QtCore/qrandom.h>
-#include <qopenglcontext.h>
-#include <QtQuick/private/qquickshadereffectmesh_p.h>
-#include <QtQuick/private/qsgshadersourcebuilder_p.h>
-#include <QtQml/qqmlinfo.h>
-
-QT_BEGIN_NAMESPACE
-
-static QSGGeometry::Attribute PlainParticle_Attributes[] = {
- QSGGeometry::Attribute::create(0, 2, GL_FLOAT, true), // Position
- QSGGeometry::Attribute::create(1, 2, GL_FLOAT), // TexCoord
- QSGGeometry::Attribute::create(2, 4, GL_FLOAT), // Data
- QSGGeometry::Attribute::create(3, 4, GL_FLOAT), // Vectors
- QSGGeometry::Attribute::create(4, 1, GL_FLOAT) // r
-};
-
-static QSGGeometry::AttributeSet PlainParticle_AttributeSet =
-{
- 5, // Attribute Count
- (2 + 2 + 4 + 4 + 1) * sizeof(float),
- PlainParticle_Attributes
-};
-
-struct PlainVertex {
- float x;
- float y;
- float tx;
- float ty;
- float t;
- float lifeSpan;
- float size;
- float endSize;
- float vx;
- float vy;
- float ax;
- float ay;
- float r;
-};
-
-struct PlainVertices {
- PlainVertex v1;
- PlainVertex v2;
- PlainVertex v3;
- PlainVertex v4;
-};
-
-/*!
- \qmltype CustomParticle
- \instantiates QQuickCustomParticle
- \inqmlmodule QtQuick.Particles
- \inherits ParticlePainter
- \brief For specifying shaders to paint particles.
- \ingroup qtquick-particles
-
- \note The maximum number of custom particles is limited to 16383.
-*/
-
-QQuickCustomParticle::QQuickCustomParticle(QQuickItem* parent)
- : QQuickParticlePainter(parent)
- , m_common(this, [this](int mappedId){this->propertyChanged(mappedId);})
- , m_myMetaObject(nullptr)
- , m_dirtyUniforms(true)
- , m_dirtyUniformValues(true)
- , m_dirtyTextureProviders(true)
- , m_dirtyProgram(true)
-{
- setFlag(QQuickItem::ItemHasContents);
-}
-
-void QQuickCustomParticle::sceneGraphInvalidated()
-{
- m_nodes.clear();
-}
-
-QQuickCustomParticle::~QQuickCustomParticle()
-{
-}
-
-void QQuickCustomParticle::componentComplete()
-{
- if (!m_myMetaObject)
- m_myMetaObject = metaObject();
-
- m_common.updateShader(this, m_myMetaObject, Key::FragmentShader);
- updateVertexShader();
- reset();
- QQuickParticlePainter::componentComplete();
-}
-
-
-//Trying to keep the shader conventions the same as in qsgshadereffectitem
-/*!
- \qmlproperty string QtQuick.Particles::CustomParticle::fragmentShader
-
- This property holds the fragment shader's GLSL source code.
- The default shader expects the texture coordinate to be passed from the
- vertex shader as "varying highp vec2 qt_TexCoord0", and it samples from a
- sampler2D named "source".
-*/
-
-void QQuickCustomParticle::setFragmentShader(const QByteArray &code)
-{
- if (m_common.source.sourceCode[Key::FragmentShader].constData() == code.constData())
- return;
- m_common.source.sourceCode[Key::FragmentShader] = code;
- m_dirtyProgram = true;
- if (isComponentComplete()) {
- m_common.updateShader(this, m_myMetaObject, Key::FragmentShader);
- reset();
- }
- emit fragmentShaderChanged();
-}
-
-/*!
- \qmlproperty string QtQuick.Particles::CustomParticle::vertexShader
-
- This property holds the vertex shader's GLSL source code.
-
- The default shader passes the texture coordinate along to the fragment
- shader as "varying highp vec2 qt_TexCoord0".
-
- To aid writing a particle vertex shader, the following GLSL code is prepended
- to your vertex shader:
- \code
- attribute highp vec2 qt_ParticlePos;
- attribute highp vec2 qt_ParticleTex;
- attribute highp vec4 qt_ParticleData; // x = time, y = lifeSpan, z = size, w = endSize
- attribute highp vec4 qt_ParticleVec; // x,y = constant velocity, z,w = acceleration
- attribute highp float qt_ParticleR;
- uniform highp mat4 qt_Matrix;
- uniform highp float qt_Timestamp;
- varying highp vec2 qt_TexCoord0;
- void defaultMain() {
- qt_TexCoord0 = qt_ParticleTex;
- highp float size = qt_ParticleData.z;
- highp float endSize = qt_ParticleData.w;
- highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y;
- highp float currentSize = mix(size, endSize, t * t);
- if (t < 0. || t > 1.)
- currentSize = 0.;
- highp vec2 pos = qt_ParticlePos
- - currentSize / 2. + currentSize * qt_ParticleTex // adjust size
- + qt_ParticleVec.xy * t * qt_ParticleData.y // apply velocity vector..
- + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.);
- gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);
- }
- \endcode
-
- defaultMain() is the same code as in the default shader, you can call this for basic
- particle functions and then add additional variables for custom effects. Note that
- the vertex shader for particles is responsible for simulating the movement of particles
- over time, the particle data itself only has the starting position and spawn time.
-*/
-
-void QQuickCustomParticle::setVertexShader(const QByteArray &code)
-{
- if (m_common.source.sourceCode[Key::VertexShader].constData() == code.constData())
- return;
- m_common.source.sourceCode[Key::VertexShader] = code;
-
- m_dirtyProgram = true;
- if (isComponentComplete()) {
- updateVertexShader();
- reset();
- }
- emit vertexShaderChanged();
-}
-
-void QQuickCustomParticle::updateVertexShader()
-{
- m_common.disconnectPropertySignals(this, Key::VertexShader);
- m_common.uniformData[Key::VertexShader].clear();
- m_common.clearSignalMappers(Key::VertexShader);
- m_common.attributes.clear();
- m_common.attributes.append("qt_ParticlePos");
- m_common.attributes.append("qt_ParticleTex");
- m_common.attributes.append("qt_ParticleData");
- m_common.attributes.append("qt_ParticleVec");
- m_common.attributes.append("qt_ParticleR");
-
- UniformData d;
- d.name = "qt_Matrix";
- d.specialType = UniformData::Matrix;
- m_common.uniformData[Key::VertexShader].append(d);
- m_common.signalMappers[Key::VertexShader].append(0);
-
- d.name = "qt_Timestamp";
- d.specialType = UniformData::None;
- m_common.uniformData[Key::VertexShader].append(d);
- m_common.signalMappers[Key::VertexShader].append(0);
-
- const QByteArray &code = m_common.source.sourceCode[Key::VertexShader];
- if (!code.isEmpty())
- m_common.lookThroughShaderCode(this, m_myMetaObject, Key::VertexShader, code);
-
- m_common.connectPropertySignals(this, m_myMetaObject, Key::VertexShader);
-}
-
-void QQuickCustomParticle::reset()
-{
- QQuickParticlePainter::reset();
- update();
-}
-
-QSGNode *QQuickCustomParticle::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
-{
- QQuickOpenGLShaderEffectNode *rootNode = static_cast<QQuickOpenGLShaderEffectNode *>(oldNode);
- if (m_pleaseReset){
- delete rootNode;//Automatically deletes children
- rootNode = nullptr;
- m_nodes.clear();
- m_pleaseReset = false;
- m_dirtyProgram = true;
- }
-
- if (m_system && m_system->isRunning() && !m_system->isPaused()){
- rootNode = prepareNextFrame(rootNode);
- if (rootNode) {
- foreach (QSGGeometryNode* node, m_nodes)
- node->markDirty(QSGNode::DirtyGeometry);
- update();
- }
- }
-
- return rootNode;
-}
-
-QQuickOpenGLShaderEffectNode *QQuickCustomParticle::prepareNextFrame(QQuickOpenGLShaderEffectNode *rootNode)
-{
- if (!rootNode)
- rootNode = buildCustomNodes();
-
- if (!rootNode)
- return nullptr;
-
- if (m_dirtyProgram) {
- const bool isES = QOpenGLContext::currentContext()->isOpenGLES();
-
- QQuickOpenGLShaderEffectMaterial *material = static_cast<QQuickOpenGLShaderEffectMaterial *>(rootNode->material());
- Q_ASSERT(material);
-
- Key s = m_common.source;
- QSGShaderSourceBuilder builder;
- if (s.sourceCode[Key::FragmentShader].isEmpty()) {
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/customparticle.frag"));
- if (isES)
- builder.removeVersion();
- s.sourceCode[Key::FragmentShader] = builder.source();
- builder.clear();
- }
-
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/customparticletemplate.vert"));
- if (isES)
- builder.removeVersion();
-
- if (s.sourceCode[Key::VertexShader].isEmpty())
- builder.appendSourceFile(QStringLiteral(":/particles/shaders/customparticle.vert"));
- s.sourceCode[Key::VertexShader] = builder.source() + s.sourceCode[Key::VertexShader];
-
- material->setProgramSource(s);
- material->attributes = m_common.attributes;
- foreach (QQuickOpenGLShaderEffectNode* node, m_nodes)
- node->markDirty(QSGNode::DirtyMaterial);
-
- m_dirtyProgram = false;
- m_dirtyUniforms = true;
- }
-
- m_lastTime = m_system->systemSync(this) / 1000.;
- if (true) //Currently this is how we update timestamp... potentially over expensive.
- buildData(rootNode);
- return rootNode;
-}
-
-QQuickOpenGLShaderEffectNode* QQuickCustomParticle::buildCustomNodes()
-{
- typedef QHash<int, QQuickOpenGLShaderEffectNode*>::const_iterator NodeHashConstIt;
-
- if (!QOpenGLContext::currentContext())
- return nullptr;
-
- if (m_count * 4 > 0xffff) {
- // Index data is ushort.
- qmlInfo(this) << "CustomParticle: Too many particles - maximum 16383 per CustomParticle";
- return nullptr;
- }
-
- if (m_count <= 0) {
- qmlInfo(this) << "CustomParticle: Too few particles";
- return nullptr;
- }
-
- if (groups().isEmpty())
- return nullptr;
-
- QQuickOpenGLShaderEffectNode *rootNode = nullptr;
- QQuickOpenGLShaderEffectMaterial *material = new QQuickOpenGLShaderEffectMaterial;
- m_dirtyProgram = true;
-
- for (auto groupId : groupIds()) {
- int count = m_system->groupData[groupId]->size();
-
- QQuickOpenGLShaderEffectNode* node = new QQuickOpenGLShaderEffectNode();
- m_nodes.insert(groupId, node);
-
- node->setMaterial(material);
-
- //Create Particle Geometry
- int vCount = count * 4;
- int iCount = count * 6;
- QSGGeometry *g = new QSGGeometry(PlainParticle_AttributeSet, vCount, iCount);
- g->setDrawingMode(GL_TRIANGLES);
- node->setGeometry(g);
- node->setFlag(QSGNode::OwnsGeometry, true);
- PlainVertex *vertices = (PlainVertex *) g->vertexData();
- for (int p=0; p < count; ++p) {
- commit(groupId, p);
- vertices[0].tx = 0;
- vertices[0].ty = 0;
-
- vertices[1].tx = 1;
- vertices[1].ty = 0;
-
- vertices[2].tx = 0;
- vertices[2].ty = 1;
-
- vertices[3].tx = 1;
- vertices[3].ty = 1;
- vertices += 4;
- }
- quint16 *indices = g->indexDataAsUShort();
- for (int i=0; i < count; ++i) {
- int o = i * 4;
- indices[0] = o;
- indices[1] = o + 1;
- indices[2] = o + 2;
- indices[3] = o + 1;
- indices[4] = o + 3;
- indices[5] = o + 2;
- indices += 6;
- }
- }
-
- NodeHashConstIt it = m_nodes.cbegin();
- rootNode = it.value();
- rootNode->setFlag(QSGNode::OwnsMaterial, true);
- NodeHashConstIt cend = m_nodes.cend();
- for (++it; it != cend; ++it)
- rootNode->appendChildNode(it.value());
-
- return rootNode;
-}
-
-void QQuickCustomParticle::sourceDestroyed(QObject *object)
-{
- m_common.sourceDestroyed(object);
-}
-
-void QQuickCustomParticle::propertyChanged(int mappedId)
-{
- bool textureProviderChanged;
- m_common.propertyChanged(this, m_myMetaObject, mappedId, &textureProviderChanged);
- m_dirtyTextureProviders |= textureProviderChanged;
- m_dirtyUniformValues = true;
- update();
-}
-
-
-void QQuickCustomParticle::buildData(QQuickOpenGLShaderEffectNode *rootNode)
-{
- if (!rootNode)
- return;
- for (int shaderType = 0; shaderType < Key::ShaderTypeCount; ++shaderType) {
- for (int i = 0; i < m_common.uniformData[shaderType].size(); ++i) {
- if (m_common.uniformData[shaderType].at(i).name == "qt_Timestamp")
- m_common.uniformData[shaderType][i].value = QVariant::fromValue(m_lastTime);
- }
- }
- m_common.updateMaterial(rootNode, static_cast<QQuickOpenGLShaderEffectMaterial *>(rootNode->material()),
- m_dirtyUniforms, true, m_dirtyTextureProviders);
- foreach (QQuickOpenGLShaderEffectNode* node, m_nodes)
- node->markDirty(QSGNode::DirtyMaterial);
- m_dirtyUniforms = m_dirtyUniformValues = m_dirtyTextureProviders = false;
-}
-
-void QQuickCustomParticle::initialize(int gIdx, int pIdx)
-{
- QQuickParticleData* datum = m_system->groupData[gIdx]->data[pIdx];
- datum->r = QRandomGenerator::global()->generateDouble();
-}
-
-void QQuickCustomParticle::commit(int gIdx, int pIdx)
-{
- if (m_nodes[gIdx] == 0)
- return;
-
- QQuickParticleData* datum = m_system->groupData[gIdx]->data[pIdx];
- PlainVertices *particles = (PlainVertices *) m_nodes[gIdx]->geometry()->vertexData();
- PlainVertex *vertices = (PlainVertex *)&particles[pIdx];
- for (int i=0; i<4; ++i) {
- vertices[i].x = datum->x - m_systemOffset.x();
- vertices[i].y = datum->y - m_systemOffset.y();
- vertices[i].t = datum->t;
- vertices[i].lifeSpan = datum->lifeSpan;
- vertices[i].size = datum->size;
- vertices[i].endSize = datum->endSize;
- vertices[i].vx = datum->vx;
- vertices[i].vy = datum->vy;
- vertices[i].ax = datum->ax;
- vertices[i].ay = datum->ay;
- vertices[i].r = datum->r;
- }
-}
-
-void QQuickCustomParticle::itemChange(ItemChange change, const ItemChangeData &value)
-{
- if (change == QQuickItem::ItemSceneChange)
- m_common.updateWindow(value.window);
- QQuickParticlePainter::itemChange(change, value);
-}
-
-
-QT_END_NAMESPACE
-
-#include "moc_qquickcustomparticle_p.cpp"
diff --git a/src/particles/qquickcustomparticle_p.h b/src/particles/qquickcustomparticle_p.h
deleted file mode 100644
index 90643fe3e4..0000000000
--- a/src/particles/qquickcustomparticle_p.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtQml module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef CUSTOM_PARTICLE_H
-#define CUSTOM_PARTICLE_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-#include "qquickparticlepainter_p.h"
-#include <private/qquickopenglshadereffectnode_p.h>
-#include <private/qquickopenglshadereffect_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QSGNode;
-struct PlainVertices;
-
-class QQuickShaderEffectMaterialObject;
-
-//Genealogy: Hybrid of UltraParticle and ShaderEffect
-class QQuickCustomParticle : public QQuickParticlePainter
-{
- Q_OBJECT
- Q_PROPERTY(QByteArray fragmentShader READ fragmentShader WRITE setFragmentShader NOTIFY fragmentShaderChanged)
- Q_PROPERTY(QByteArray vertexShader READ vertexShader WRITE setVertexShader NOTIFY vertexShaderChanged)
- QML_NAMED_ELEMENT(CustomParticle)
- QML_ADDED_IN_VERSION(2, 0)
-
-public:
- explicit QQuickCustomParticle(QQuickItem* parent=0);
- ~QQuickCustomParticle();
-
- QByteArray fragmentShader() const { return m_common.source.sourceCode[Key::FragmentShader]; }
- void setFragmentShader(const QByteArray &code);
-
- QByteArray vertexShader() const { return m_common.source.sourceCode[Key::VertexShader]; }
- void setVertexShader(const QByteArray &code);
-
-Q_SIGNALS:
- void fragmentShaderChanged();
- void vertexShaderChanged();
-
-protected:
- void initialize(int gIdx, int pIdx) override;
- void commit(int gIdx, int pIdx) override;
-
- QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
- QQuickOpenGLShaderEffectNode *prepareNextFrame(QQuickOpenGLShaderEffectNode *rootNode);
- void reset() override;
- void resize(int oldCount, int newCount);
- void componentComplete() override;
- QQuickOpenGLShaderEffectNode *buildCustomNodes();
-
- void sceneGraphInvalidated() override;
- void itemChange(ItemChange change, const ItemChangeData &value) override;
-
-private Q_SLOTS:
- void sourceDestroyed(QObject *object);
-
-private:
- void propertyChanged(int mappedId);
-
- typedef QQuickOpenGLShaderEffectMaterialKey Key;
- typedef QQuickOpenGLShaderEffectMaterial::UniformData UniformData;
-
- void buildData(QQuickOpenGLShaderEffectNode *rootNode);
- void updateVertexShader();
-
- QQuickOpenGLShaderEffectCommon m_common;
- const QMetaObject *m_myMetaObject;
-
- QHash<int, QQuickOpenGLShaderEffectNode*> m_nodes;
- qreal m_lastTime;
-
- uint m_dirtyUniforms : 1;
- uint m_dirtyUniformValues : 1;
- uint m_dirtyTextureProviders : 1;
- uint m_dirtyProgram : 1;
-};
-
-QT_END_NAMESPACE
-
-#endif //HEADER_GUARD
diff --git a/src/particles/qquickparticlesmodule.cpp b/src/particles/qquickparticlesmodule.cpp
index 801af079e6..8b535d85c7 100644
--- a/src/particles/qquickparticlesmodule.cpp
+++ b/src/particles/qquickparticlesmodule.cpp
@@ -40,9 +40,6 @@
#include <private/qtquickglobal_p.h>
#include "qquickangledirection_p.h"
-#if QT_CONFIG(quick_shadereffect)
-#include "qquickcustomparticle_p.h"
-#endif
#include "qquickellipseextruder_p.h"
#include "qquicktrailemitter_p.h"
#include "qquickfriction_p.h"
diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp
index 57812ba797..396d6f0a17 100644
--- a/src/particles/qquickparticlesystem.cpp
+++ b/src/particles/qquickparticlesystem.cpp
@@ -459,7 +459,6 @@ QQuickParticleData::QQuickParticleData()
color.g = 255;
color.b = 255;
color.a = 255;
- r = 0;
delegate = nullptr;
modelIndex = -1;
}
@@ -518,7 +517,6 @@ void QQuickParticleData::clone(const QQuickParticleData& other)
color.g = other.color.g;
color.b = other.color.b;
color.a = other.color.a;
- r = other.r;
delegate = other.delegate;
modelIndex = other.modelIndex;
diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h
index b1053d8ff8..d38cd9007a 100644
--- a/src/particles/qquickparticlesystem_p.h
+++ b/src/particles/qquickparticlesystem_p.h
@@ -324,11 +324,6 @@ public:
int modelIndex;
//Used by custom affectors
float update;
- //Used by CustomParticle
- float r;
-
- // 4 bytes wasted
-
void debugDump(QQuickParticleSystem *particleSystem) const;
bool stillAlive(QQuickParticleSystem *particleSystem) const; //Only checks end, because usually that's all you need and it's a little faster.
diff --git a/src/particles/qquickv4particledata.cpp b/src/particles/qquickv4particledata.cpp
index 459797f977..d1f47da1c0 100644
--- a/src/particles/qquickv4particledata.cpp
+++ b/src/particles/qquickv4particledata.cpp
@@ -448,7 +448,6 @@ FLOAT_GETTER_AND_SETTER(frameDuration)
FLOAT_GETTER_AND_SETTER(frameAt)
FLOAT_GETTER_AND_SETTER(frameCount)
FLOAT_GETTER_AND_SETTER(animT)
-FLOAT_GETTER_AND_SETTER(r)
FAKE_FLOAT_GETTER_AND_SETTER(curX, curX, setInstantaneousX)
FAKE_FLOAT_GETTER_AND_SETTER(curVX, curVX, setInstantaneousVX)
FAKE_FLOAT_GETTER_AND_SETTER(curAX, curAX, setInstantaneousAX)
@@ -487,7 +486,6 @@ QV4ParticleDataDeletable::QV4ParticleDataDeletable(QV4::ExecutionEngine *v4)
REGISTER_ACCESSOR(p, v4, frameAt, frameAt);
REGISTER_ACCESSOR(p, v4, frameCount, frameCount);
REGISTER_ACCESSOR(p, v4, animT, animationT);
- REGISTER_ACCESSOR(p, v4, r, r);
REGISTER_ACCESSOR(p, v4, update, update);
REGISTER_ACCESSOR(p, v4, curX, x);
REGISTER_ACCESSOR(p, v4, curVX, vx);
diff --git a/src/particles/shaders/customparticle.frag b/src/particles/shaders/customparticle.frag
deleted file mode 100644
index 64007029f7..0000000000
--- a/src/particles/shaders/customparticle.frag
+++ /dev/null
@@ -1,11 +0,0 @@
-#version 120
-
-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/particles/shaders/customparticle.vert b/src/particles/shaders/customparticle.vert
deleted file mode 100644
index b99f73ea53..0000000000
--- a/src/particles/shaders/customparticle.vert
+++ /dev/null
@@ -1,4 +0,0 @@
-void main()
-{
- defaultMain();
-} \ No newline at end of file
diff --git a/src/particles/shaders/customparticle_core.frag b/src/particles/shaders/customparticle_core.frag
deleted file mode 100644
index 699c834605..0000000000
--- a/src/particles/shaders/customparticle_core.frag
+++ /dev/null
@@ -1,13 +0,0 @@
-#version 150
-
-in vec2 qt_TexCoord0;
-
-out vec4 fragColor;
-
-uniform sampler2D source;
-uniform float qt_Opacity;
-
-void main()
-{
- fragColor = texture(source, qt_TexCoord0) * qt_Opacity;
-} \ No newline at end of file
diff --git a/src/particles/shaders/customparticle_core.vert b/src/particles/shaders/customparticle_core.vert
deleted file mode 100644
index b99f73ea53..0000000000
--- a/src/particles/shaders/customparticle_core.vert
+++ /dev/null
@@ -1,4 +0,0 @@
-void main()
-{
- defaultMain();
-} \ No newline at end of file
diff --git a/src/particles/shaders/customparticletemplate.vert b/src/particles/shaders/customparticletemplate.vert
deleted file mode 100644
index eef8458a85..0000000000
--- a/src/particles/shaders/customparticletemplate.vert
+++ /dev/null
@@ -1,28 +0,0 @@
-#version 120
-
-attribute highp vec2 qt_ParticlePos;
-attribute highp vec2 qt_ParticleTex;
-attribute highp vec4 qt_ParticleData; // x = time, y = lifeSpan, z = size, w = endSize
-attribute highp vec4 qt_ParticleVec; // x,y = constant velocity, z,w = acceleration
-attribute highp float qt_ParticleR;
-
-uniform highp mat4 qt_Matrix;
-uniform highp float qt_Timestamp;
-
-varying highp vec2 qt_TexCoord0;
-
-void defaultMain()
-{
- qt_TexCoord0 = qt_ParticleTex;
- highp float size = qt_ParticleData.z;
- highp float endSize = qt_ParticleData.w;
- highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y;
- highp float currentSize = mix(size, endSize, t * t);
- if (t < 0. || t > 1.)
- currentSize = 0.;
- highp vec2 pos = qt_ParticlePos
- - currentSize / 2. + currentSize * qt_ParticleTex // adjust size
- + qt_ParticleVec.xy * t * qt_ParticleData.y // apply velocity vector..
- + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.);
- gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);
-}
diff --git a/src/particles/shaders/customparticletemplate_core.vert b/src/particles/shaders/customparticletemplate_core.vert
deleted file mode 100644
index 15d38e797c..0000000000
--- a/src/particles/shaders/customparticletemplate_core.vert
+++ /dev/null
@@ -1,28 +0,0 @@
-#version 150 core
-
-in vec2 qt_ParticlePos;
-in vec2 qt_ParticleTex;
-in vec4 qt_ParticleData; // x = time, y = lifeSpan, z = size, w = endSize
-in vec4 qt_ParticleVec; // x,y = constant velocity, z,w = acceleration
-in float qt_ParticleR;
-
-out vec2 qt_TexCoord0;
-
-uniform mat4 qt_Matrix;
-uniform float qt_Timestamp;
-
-void defaultMain()
-{
- qt_TexCoord0 = qt_ParticleTex;
- float size = qt_ParticleData.z;
- float endSize = qt_ParticleData.w;
- float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y;
- float currentSize = mix(size, endSize, t * t);
- if (t < 0. || t > 1.)
- currentSize = 0.;
- vec2 pos = qt_ParticlePos
- - currentSize / 2. + currentSize * qt_ParticleTex // adjust size
- + qt_ParticleVec.xy * t * qt_ParticleData.y // apply velocity vector..
- + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.);
- gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);
-}
diff --git a/src/quick/doc/src/concepts/effects/particles.qdoc b/src/quick/doc/src/concepts/effects/particles.qdoc
index 0b87eb4529..1cee633b75 100644
--- a/src/quick/doc/src/concepts/effects/particles.qdoc
+++ b/src/quick/doc/src/concepts/effects/particles.qdoc
@@ -100,10 +100,9 @@
Painters are the types that visualize logical particles. For each logical particle in the groups assigned to it,
which are within its bounds (or outside, if you do not set the clip property on the type) it will be visualized
in a manner dependent on the type of ParticlePainter. The base type of ParticlePainter does not draw anything.
- ImageParticle renders an image at the particle location. CustomParticle allows you to write your own shaders to render
- the particles, passing in the logical particle state as vertex data. ItemParticle allows you to visualize logical
- particles using arbitrary QML delegates. ModelParticle is similar, but coordinates model data amongst the delegates
- in a similar manner to the view classes.
+ ImageParticle renders an image at the particle location. ItemParticle allows you to visualize logical particles
+ using arbitrary QML delegates. ModelParticle is similar, but coordinates model data amongst the delegates in a
+ similar manner to the view classes.
As the ParticlePainter is the QML type visualizing the particles in the scene, it is its Z value which is important
when trying to place particles above or below other types visually.
diff --git a/src/quick/items/qquickopenglshadereffect_p.h b/src/quick/items/qquickopenglshadereffect_p.h
index 0c2adadc62..0a2ee00115 100644
--- a/src/quick/items/qquickopenglshadereffect_p.h
+++ b/src/quick/items/qquickopenglshadereffect_p.h
@@ -77,7 +77,7 @@ namespace QtPrivate {
class MappedSlotObject;
}
-// Common class for QQuickOpenGLShaderEffect and QQuickCustomParticle.
+// Used by QQuickOpenGLShaderEffect.
struct Q_QUICK_PRIVATE_EXPORT QQuickOpenGLShaderEffectCommon
{
typedef QQuickOpenGLShaderEffectMaterialKey Key;