diff options
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/particleresources/fuzzydot.png | bin | 0 -> 1799 bytes | |||
-rw-r--r-- | src/particles/particleresources/glowdot.png | bin | 0 -> 861 bytes | |||
-rw-r--r-- | src/particles/particleresources/star.png | bin | 0 -> 1550 bytes | |||
-rw-r--r-- | src/particles/particles.qrc | 3 | ||||
-rw-r--r-- | src/particles/qquickimageparticle.cpp | 25 | ||||
-rw-r--r-- | src/particles/qquickmaskextruder.cpp | 35 | ||||
-rw-r--r-- | src/particles/qquickparticleemitter.cpp | 6 | ||||
-rw-r--r-- | src/particles/qquickparticlepainter.cpp | 2 |
8 files changed, 58 insertions, 13 deletions
diff --git a/src/particles/particleresources/fuzzydot.png b/src/particles/particleresources/fuzzydot.png Binary files differnew file mode 100644 index 0000000000..bc95b703c1 --- /dev/null +++ b/src/particles/particleresources/fuzzydot.png diff --git a/src/particles/particleresources/glowdot.png b/src/particles/particleresources/glowdot.png Binary files differnew file mode 100644 index 0000000000..5c83896d22 --- /dev/null +++ b/src/particles/particleresources/glowdot.png diff --git a/src/particles/particleresources/star.png b/src/particles/particleresources/star.png Binary files differnew file mode 100644 index 0000000000..0d592cfa87 --- /dev/null +++ b/src/particles/particleresources/star.png diff --git a/src/particles/particles.qrc b/src/particles/particles.qrc index 344f9489a4..582520405f 100644 --- a/src/particles/particles.qrc +++ b/src/particles/particles.qrc @@ -1,5 +1,8 @@ <RCC> <qresource prefix="/"> <file>particleresources/noise.png</file> + <file>particleresources/fuzzydot.png</file> + <file>particleresources/glowdot.png</file> + <file>particleresources/star.png</file> </qresource> </RCC> diff --git a/src/particles/qquickimageparticle.cpp b/src/particles/qquickimageparticle.cpp index e0572ef424..0145ce4edb 100644 --- a/src/particles/qquickimageparticle.cpp +++ b/src/particles/qquickimageparticle.cpp @@ -623,6 +623,22 @@ void fillUniformArrayFromImage(float* array, const QImage& img, int size) The source image to be used. If the image is a sprite animation, use the sprite property instead. + + Since Qt 5.2, some default images are provided as resources to aid prototyping: + \table + \row + \li qrc:///particleresources/star.png + \li \inlineimage particles/star.png + \row + \li qrc:///particleresources/glowdot.png + \li \inlineimage particles/glowdot.png + \row + \li qrc:///particleresources/fuzzydot.png + \li \inlineimage particles/fuzzydot.png + \endtable + + Note that the images are white and semi-transparent, to allow colorization + and alpha levels to have maximum effect. */ /*! \qmlproperty list<Sprite> QtQuick.Particles2::ImageParticle::sprites @@ -1363,6 +1379,15 @@ void QQuickImageParticle::finishBuildParticleNodes() perfLevel = Deformable; #endif +#ifdef Q_OS_MAC + // Mac OS X 10.8.3 introduced a bug in the AMD drivers, for at least the 2011 macbook pros, + // causing point sprites who read gl_PointCoord in the frag shader to come out as + // green-red blobs. + if (perfLevel < Deformable && strstr((char *) glGetString(GL_VENDOR), "ATI")) { + perfLevel = Deformable; + } +#endif + if (perfLevel >= Colored && !m_color.isValid()) m_color = QColor(Qt::white);//Hidden default, but different from unset diff --git a/src/particles/qquickmaskextruder.cpp b/src/particles/qquickmaskextruder.cpp index 3153e2b7d0..d59902bf3a 100644 --- a/src/particles/qquickmaskextruder.cpp +++ b/src/particles/qquickmaskextruder.cpp @@ -114,12 +114,18 @@ bool QQuickMaskExtruder::contains(const QRectF &bounds, const QPointF &point) ensureInitialized(bounds);//###Current usage patterns WILL lead to different bounds/r calls. Separate list? if (m_img.isNull()) return false; - QPoint p = point.toPoint() - bounds.topLeft().toPoint(); - return m_img.rect().contains(p) && (bool)m_img.pixelIndex(p); + + QPointF pt = point - bounds.topLeft(); + QPoint p(pt.x() * m_img.width() / bounds.width(), + pt.y() * m_img.height() / bounds.height()); + return m_img.rect().contains(p) && (m_img.pixel(p) & 0xff000000); } -void QQuickMaskExtruder::ensureInitialized(const QRectF &r) +void QQuickMaskExtruder::ensureInitialized(const QRectF &rf) { + // Convert to integer coords to avoid comparing floats and ints which would + // often result in rounding errors. + QRect r = rf.toRect(); if (m_lastWidth == r.width() && m_lastHeight == r.height()) return;//Same as before if (!m_pix.isReady()) @@ -129,13 +135,22 @@ void QQuickMaskExtruder::ensureInitialized(const QRectF &r) m_mask.clear(); - m_img = m_pix.image().createAlphaMask(); - m_img = m_img.convertToFormat(QImage::Format_Mono);//Else LSB, but I think that's easier - m_img = m_img.scaled(r.size().toSize());//TODO: Do they need aspect ratio stuff? Or tiling? - for (int i=0; i<r.width(); i++){ - for (int j=0; j<r.height(); j++){ - if (m_img.pixelIndex(i,j))//Direct bit manipulation is presumably more efficient - m_mask << QPointF(i,j); + m_img = m_pix.image(); + // Image will in all likelyhood be in this format already, so + // no extra memory or conversion takes place + if (m_img.format() != QImage::Format_ARGB32 && m_img.format() != QImage::Format_ARGB32_Premultiplied) + m_img = m_img.convertToFormat(QImage::Format_ARGB32_Premultiplied); + + // resample on the fly using 16-bit + int sx = (m_img.width() << 16) / r.width(); + int sy = (m_img.height() << 16) / r.height(); + int w = r.width(); + int h = r.height(); + for (int y=0; y<h; ++y) { + const uint *sl = (const uint *) m_img.constScanLine((y * sy) >> 16); + for (int x=0; x<w; ++x) { + if (sl[(x * sx) >> 16] & 0xff000000) + m_mask << QPointF(x, y); } } } diff --git a/src/particles/qquickparticleemitter.cpp b/src/particles/qquickparticleemitter.cpp index cc410fbfbe..6627291c55 100644 --- a/src/particles/qquickparticleemitter.cpp +++ b/src/particles/qquickparticleemitter.cpp @@ -203,7 +203,7 @@ QT_BEGIN_NAMESPACE Emits count particles from this emitter immediately. */ -/*! \qmlmethod QtQuick.Particles2::Emitter::burst(int x, int y, int count) +/*! \qmlmethod QtQuick.Particles2::Emitter::burst(int count, int x, int y) Emits count particles from this emitter immediately. The particles are emitted as if the Emitter was positioned at x,y but all other properties are the same. @@ -357,7 +357,7 @@ void QQuickParticleEmitter::emitWindow(int timeStamp) m_last_timestamp = timeStamp/1000.; m_last_emission = m_last_timestamp; m_reset_last = false; - m_emitCap = particleCount(); + m_emitCap = -1; } if (m_pulseLeft){ @@ -424,6 +424,8 @@ void QQuickParticleEmitter::emitWindow(int timeStamp) if (datum->lifeSpan >= m_system->maxLife){ datum->lifeSpan = m_system->maxLife; + if (m_emitCap == -1) + m_emitCap = particleCount(); m_emitCap--;//emitCap keeps us from reemitting 'infinite' particles after their life. Unless you reset the emitter. } diff --git a/src/particles/qquickparticlepainter.cpp b/src/particles/qquickparticlepainter.cpp index a84f4a66f4..694391a701 100644 --- a/src/particles/qquickparticlepainter.cpp +++ b/src/particles/qquickparticlepainter.cpp @@ -80,8 +80,8 @@ void QQuickParticlePainter::itemChange(ItemChange change, const ItemChangeData & m_window = data.window; if (m_window) connect(m_window, SIGNAL(sceneGraphInvalidated()), this, SLOT(sceneGraphInvalidated()), Qt::DirectConnection); - } + QQuickItem::itemChange(change, data); } void QQuickParticlePainter::componentComplete() |