4#include <QtCore/qtconfigmacros.h>
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
32
33
34
35
36
37
39
40
41
42
43
44
45
46
47
49QQuickTurbulenceAffector::QQuickTurbulenceAffector(QQuickItem *parent) :
50 QQuickParticleAffector(parent),
51 m_strength(10), m_gridSize(0), m_field(
nullptr), m_vectorField(
nullptr), m_inited(
false)
55void QQuickTurbulenceAffector::geometryChange(
const QRectF &,
const QRectF &)
60QQuickTurbulenceAffector::~QQuickTurbulenceAffector()
63 for (
int i=0; i<m_gridSize; i++)
68 for (
int i=0; i<m_gridSize; i++)
69 free(m_vectorField[i]);
74void QQuickTurbulenceAffector::initializeGrid()
79 int arg = qMax(width(), height());
80 if (m_gridSize != arg) {
82 for (
int i=0; i<m_gridSize; i++)
87 for (
int i=0; i<m_gridSize; i++)
88 free(m_vectorField[i]);
94 m_field = (qreal**)malloc(m_gridSize *
sizeof(qreal*));
95 for (
int i=0; i<m_gridSize; i++)
96 m_field[i] = (qreal*)malloc(m_gridSize *
sizeof(qreal));
97 m_vectorField = (QPointF**)malloc(m_gridSize *
sizeof(QPointF*));
98 for (
int i=0; i<m_gridSize; i++)
99 m_vectorField[i] = (QPointF*)malloc(m_gridSize *
sizeof(QPointF));
102 if (!m_noiseSource.isEmpty())
103 image = QImage(QQmlFile::urlToLocalFileOrQrc(m_noiseSource)).scaled(QSize(m_gridSize, m_gridSize));
105 image = QImage(QStringLiteral(
":particleresources/noise.png")).scaled(QSize(m_gridSize, m_gridSize));
107 for (
int i=0; i<m_gridSize; i++)
108 for (
int j=0; j<m_gridSize; j++)
109 m_field[i][j] = qGray(image.pixel(QPoint(i,j)));
110 for (
int i=0; i<m_gridSize; i++){
111 for (
int j=0; j<m_gridSize; j++){
112 m_vectorField[i][j].setX(boundsRespectingField(i-1,j) - boundsRespectingField(i,j));
113 m_vectorField[i][j].setY(boundsRespectingField(i,j) - boundsRespectingField(i,j-1));
118qreal QQuickTurbulenceAffector::boundsRespectingField(
int x,
int y)
128 return m_field[x][y];
131void QQuickTurbulenceAffector::ensureInit()
139void QQuickTurbulenceAffector::affectSystem(qreal dt)
141 if (!m_system || !m_enabled)
149 QRect boundsRect(0,0,m_gridSize,m_gridSize);
150 for (QQuickParticleGroupData *gd : m_system->groupData) {
151 if (!activeGroup(gd->index))
153 foreach (QQuickParticleData *d, gd->data){
154 if (!shouldAffect(d))
156 QPoint pos = (QPointF(d->curX(m_system), d->curY(m_system)) - m_offset).toPoint();
157 if (!boundsRect.contains(pos,
true))
161 fx += m_vectorField[pos.x()][pos.y()].x() * m_strength;
162 fy += m_vectorField[pos.x()][pos.y()].y() * m_strength;
164 d->setInstantaneousVX(d->curVX(m_system)+ fx * dt, m_system);
165 d->setInstantaneousVY(d->curVY(m_system)+ fy * dt, m_system);
174#include "moc_qquickturbulence_p.cpp"