Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3dparticleattractor.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
7
9
24// Minimum duration in seconds
25const float MIN_DURATION = 0.001f;
26
29 , m_duration(-1)
30 , m_durationVariation(0)
31{
32}
33
56{
57 return m_positionVariation;
58}
59
61{
62 if (m_positionVariation == positionVariation)
63 return;
64
65 m_positionVariation = positionVariation;
67 Q_EMIT update();
68}
69
95
97{
98 if (m_shape == shape)
99 return;
100
101 m_shape = shape;
102 m_shapeDirty = true;
104 Q_EMIT update();
105}
106
117{
118 return m_duration;
119}
120
122{
123 if (m_duration == duration)
124 return;
125
126 m_duration = duration;
128 Q_EMIT update();
129}
130
140{
141 return m_durationVariation;
142}
143
145{
146 if (m_durationVariation == durationVariation)
147 return;
148
149 m_durationVariation = durationVariation;
151 Q_EMIT update();
152}
153
162{
163 return m_hideAtEnd;
164}
165
175{
176 return m_useCachedPositions;
177}
178
187{
188 return m_positionsAmount;
189}
190
192{
193 if (m_hideAtEnd == hideAtEnd)
194 return;
195
196 m_hideAtEnd = hideAtEnd;
198 Q_EMIT update();
199}
200
202{
203 if (m_useCachedPositions == useCachedPositions)
204 return;
205
206 m_useCachedPositions = useCachedPositions;
208 m_shapeDirty = true;
209}
210
212{
213 if (m_positionsAmount == positionsAmount)
214 return;
215
216 m_positionsAmount = positionsAmount;
218 m_shapeDirty = true;
219}
220
221void QQuick3DParticleAttractor::updateShapePositions()
222{
223 m_shapePositionList.clear();
224 if (!system() || !m_shape)
225 return;
226
227 m_shape->m_system = system();
228
229 if (m_useCachedPositions) {
230 // Get count of particles positions needed
231 int pCount = 0;
232 if (m_positionsAmount > 0) {
233 pCount = m_positionsAmount;
234 } else {
235 if (!m_particles.isEmpty()) {
236 for (auto p : m_particles) {
237 auto pp = qobject_cast<QQuick3DParticle *>(p);
238 pCount += pp->maxAmount();
239 }
240 } else {
241 pCount = system()->particleCount();
242 }
243 }
244
245 m_shapePositionList.reserve(pCount);
246 for (int i = 0; i < pCount; i++)
247 m_shapePositionList << m_shape->getPosition(i);
248 } else {
249 m_shapePositionList.clear();
250 m_shapePositionList.squeeze();
251 }
252
253 m_shapeDirty = false;
254}
255
257{
258 if (m_shapeDirty)
259 updateShapePositions();
260 m_centerPos = position();
262}
263
265{
266 if (!system())
267 return;
268
269 auto rand = system()->rand();
270 float duration = m_duration < 0 ? sd.lifetime : (m_duration / 1000.0f);
271 float durationVariation = m_durationVariation == 0
272 ? 0.0f
273 : (m_durationVariation / 1000.0f) - 2.0f * rand->get(sd.index, QPRand::AttractorDurationV) * (m_durationVariation / 1000.0f);
275 float pEnd = std::min(1.0f, std::max(0.0f, time / duration));
276 // TODO: Should we support easing?
277 //pEnd = easeInOutQuad(pEnd);
278
279 if (m_hideAtEnd && pEnd >= 1.0f) {
280 d->color.a = 0;
281 return;
282 }
283
284 float pStart = 1.0f - pEnd;
285 QVector3D pos = m_centerPos;
286
287 if (m_shape) {
288 if (m_useCachedPositions)
289 pos += m_shapePositionList[sd.index % m_shapePositionList.size()];
290 else
291 pos += m_shape->getPosition(sd.index);
292 }
293
294 if (!m_positionVariation.isNull()) {
295 pos.setX(pos.x() + m_positionVariation.x() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVX) * m_positionVariation.x());
296 pos.setY(pos.y() + m_positionVariation.y() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVY) * m_positionVariation.y());
297 pos.setZ(pos.z() + m_positionVariation.z() - 2.0f * rand->get(sd.index, QPRand::AttractorPosVZ) * m_positionVariation.z());
298 }
299
300 d->position = (pStart * d->position) + (pEnd * m_particleTransform.map(pos));
301}
302
qsizetype size() const noexcept
Definition qlist.h:397
bool isEmpty() const noexcept
Definition qlist.h:401
void squeeze()
Definition qlist.h:774
void reserve(qsizetype size)
Definition qlist.h:753
void clear()
Definition qlist.h:434
QPoint map(const QPoint &point) const
Maps point by multiplying this matrix by point.
Definition qmatrix4x4.h:908
QQuick3DNode * parentNode() const
QVector3D position
virtual QVector3D getPosition(int particleIndex)=0
QQuick3DParticleSystem * system
QList< QQuick3DParticle * > m_particles
void setUseCachedPositions(bool useCachedPositions)
void setShape(QQuick3DParticleAbstractShape *shape)
QQuick3DParticleAttractor(QQuick3DNode *parent=nullptr)
QQuick3DParticleAbstractShape * shape
void setPositionVariation(const QVector3D &positionVariation)
void setPositionsAmount(int positionsAmount)
void setDurationVariation(int durationVariation)
void affectParticle(const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d, float time) override
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
constexpr bool isNull() const noexcept
Returns true if the x, y, and z coordinates are set to 0.0, otherwise returns false.
Definition qvectornd.h:665
constexpr float y() const noexcept
Returns the y coordinate of this point.
Definition qvectornd.h:671
constexpr float x() const noexcept
Returns the x coordinate of this point.
Definition qvectornd.h:670
constexpr float z() const noexcept
Returns the z coordinate of this point.
Definition qvectornd.h:672
Combined button and popup list for selecting options.
GLfloat GLfloat p
[1]
QT_BEGIN_NAMESPACE const float MIN_DURATION
\qmltype Attractor3D \inherits Affector3D \inqmlmodule QtQuick3D.Particles3D
QMatrix4x4 calculateParticleTransform(const QQuick3DNode *parent, const QQuick3DNode *systemSharedParent)
#define Q_EMIT