34 Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
35 Q_PROPERTY(QQuick3DNode *endNode READ endNode WRITE setEndNode NOTIFY endNodeChanged)
36 Q_PROPERTY(ModelBlendMode modelBlendMode READ modelBlendMode WRITE setModelBlendMode NOTIFY modelBlendModeChanged)
37 Q_PROPERTY(
int endTime READ endTime WRITE setEndTime NOTIFY endTimeChanged)
38 Q_PROPERTY(QQuick3DNode *activationNode READ activationNode WRITE setActivationNode NOTIFY activationNodeChanged)
39 Q_PROPERTY(ModelBlendEmitMode emitMode READ emitMode WRITE setEmitMode NOTIFY emitModeChanged)
40 QML_NAMED_ELEMENT(ModelBlendParticle3D)
41 QML_ADDED_IN_VERSION(6, 2)
44 QQuick3DParticleModelBlendParticle(QQuick3DNode *parent =
nullptr);
45 ~QQuick3DParticleModelBlendParticle() override;
53 Q_ENUM(ModelBlendMode)
55 enum ModelBlendEmitMode
61 Q_ENUM(ModelBlendEmitMode)
63 QQmlComponent *delegate()
const;
64 QQuick3DNode *endNode()
const;
65 ModelBlendMode modelBlendMode()
const;
67 QQuick3DNode *activationNode()
const;
68 ModelBlendEmitMode emitMode()
const;
71 void setDelegate(QQmlComponent *setDelegate);
72 void setEndNode(QQuick3DNode *endNode);
73 void setEndTime(
int endTime);
74 void setModelBlendMode(ModelBlendMode mode);
75 void setActivationNode(QQuick3DNode *activationNode);
76 void setEmitMode(ModelBlendEmitMode emitMode);
79 void delegateChanged();
80 void blendFactorChanged();
81 void endNodeChanged();
82 void modelBlendModeChanged();
83 void endTimeChanged();
84 void activationNodeChanged();
85 void emitModeChanged();
88 void itemChange(ItemChange,
const ItemChangeData &) override;
89 void reset() override;
90 bool lastParticle()
const;
91 void doSetMaxAmount(
int amount) override;
92 void componentComplete() override;
93 int nextCurrentIndex(
const QQuick3DParticleEmitter *emitter) override;
94 void setParticleData(
int particleIndex,
95 const QVector3D &position,
96 const QVector3D &rotation,
97 const QVector4D &color,
98 float size,
float age);
99 QVector3D particleCenter(
int particleIndex)
const;
100 QVector3D particleEndPosition(
int particleIndex)
const;
101 QVector3D particleEndRotation(
int particleIndex)
const;
102 int randomIndex(
int particleIndex);
103 void commitParticles()
110 friend class QQuick3DParticleSystem;
111 friend class QQuick3DParticleEmitter;
113 struct TriangleParticleData
121 int emitterIndex = -1;
124 struct PerEmitterData
126 int particleCount = 0;
127 int emitterIndex = -1;
128 const QQuick3DParticleEmitter *emitter =
nullptr;
131 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
132 void updateParticleBuffer(QSSGParticleBuffer *buffer,
const QMatrix4x4 &sceneTransform);
134 void updateParticles();
135 void handleEndNodeChanged();
136 PerEmitterData &perEmitterData(
int emitterIndex);
138 QVector<TriangleParticleData> m_triangleParticleData;
139 QVector<QVector3D> m_centerData;
140 QHash<QByteArray, QMetaObject::Connection> m_connections;
141 QMap<
const QQuick3DParticleEmitter *, PerEmitterData> m_perEmitterData;
142 QVector<
int> m_randomParticles;
143 PerEmitterData n_noPerEmitterData;
144 int m_nextEmitterIndex = 0;
145 QQmlComponent *m_delegate =
nullptr;
146 QQuick3DModel *m_model =
nullptr;
147 QQuick3DGeometry *m_modelGeometry =
nullptr;
148 QQuick3DNode *m_endNode =
nullptr;
149 QVector3D m_endNodePosition;
150 QVector3D m_endNodeRotation;
151 QVector3D m_endNodeScale;
152 QMatrix4x4 m_endRotationMatrix;
153 int m_particleCount = 0;
154 ModelBlendMode m_modelBlendMode = Explode;
156 bool m_dataChanged =
true;
157 ModelBlendEmitMode m_emitMode = Sequential;
158 QQuick3DNode *m_activationNode =
nullptr;
159 float m_maxTriangleRadius = 0.f;
static QVector3D reflect(const QVector3D &I, QVector3D &N)
static QMatrix4x4 rotationFromNormal(const QVector3D &n)