15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
31
32
33
34
35
36
38
39
40
41
42
43
44
45
46
48QQuickTurbulenceAffector::QQuickTurbulenceAffector(QQuickItem *parent) :
49 QQuickParticleAffector(parent),
50 m_strength(10), m_gridSize(0), m_field(
nullptr), m_vectorField(
nullptr), m_inited(
false)
54void QQuickTurbulenceAffector::geometryChange(
const QRectF &,
const QRectF &)
59QQuickTurbulenceAffector::~QQuickTurbulenceAffector()
62 for (
int i=0; i<m_gridSize; i++)
67 for (
int i=0; i<m_gridSize; i++)
68 free(m_vectorField[i]);
73void QQuickTurbulenceAffector::initializeGrid()
78 int arg = qMax(width(), height());
79 if (m_gridSize != arg) {
81 for (
int i=0; i<m_gridSize; i++)
86 for (
int i=0; i<m_gridSize; i++)
87 free(m_vectorField[i]);
93 m_field = (qreal**)malloc(m_gridSize *
sizeof(qreal*));
94 for (
int i=0; i<m_gridSize; i++)
95 m_field[i] = (qreal*)malloc(m_gridSize *
sizeof(qreal));
96 m_vectorField = (QPointF**)malloc(m_gridSize *
sizeof(QPointF*));
97 for (
int i=0; i<m_gridSize; i++)
98 m_vectorField[i] = (QPointF*)malloc(m_gridSize *
sizeof(QPointF));
101 if (!m_noiseSource.isEmpty())
102 image = QImage(QQmlFile::urlToLocalFileOrQrc(m_noiseSource)).scaled(QSize(m_gridSize, m_gridSize));
104 image = QImage(QStringLiteral(
":particleresources/noise.png")).scaled(QSize(m_gridSize, m_gridSize));
106 for (
int i=0; i<m_gridSize; i++)
107 for (
int j=0; j<m_gridSize; j++)
108 m_field[i][j] = qGray(image.pixel(QPoint(i,j)));
109 for (
int i=0; i<m_gridSize; i++){
110 for (
int j=0; j<m_gridSize; j++){
111 m_vectorField[i][j].setX(boundsRespectingField(i-1,j) - boundsRespectingField(i,j));
112 m_vectorField[i][j].setY(boundsRespectingField(i,j) - boundsRespectingField(i,j-1));
117qreal QQuickTurbulenceAffector::boundsRespectingField(
int x,
int y)
127 return m_field[x][y];
130void QQuickTurbulenceAffector::ensureInit()
138void QQuickTurbulenceAffector::affectSystem(qreal dt)
140 if (!m_system || !m_enabled)
148 QRect boundsRect(0,0,m_gridSize,m_gridSize);
149 for (QQuickParticleGroupData *gd : m_system->groupData) {
150 if (!activeGroup(gd->index))
152 foreach (QQuickParticleData *d, gd->data){
153 if (!shouldAffect(d))
155 QPoint pos = (QPointF(d->curX(m_system), d->curY(m_system)) - m_offset).toPoint();
156 if (!boundsRect.contains(pos,
true))
160 fx += m_vectorField[pos.x()][pos.y()].x() * m_strength;
161 fy += m_vectorField[pos.x()][pos.y()].y() * m_strength;
163 d->setInstantaneousVX(d->curVX(m_system)+ fx * dt, m_system);
164 d->setInstantaneousVY(d->curVY(m_system)+ fy * dt, m_system);
173#include "moc_qquickturbulence_p.cpp"