aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-06-24 11:26:22 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2013-06-24 11:48:46 +0200
commit1a9759855639b9e2b3cdc0687d3381dcbf6c9815 (patch)
treeb2da51f6eddddb83c2d97cdcfac24d38d2e67a4e /src/particles
parent8217ec1b888f3ff93f004801b018c5f85362c484 (diff)
parente1fc2793aef53b84a3f1e19b6d6bdf1141340074 (diff)
Merge branch 'dev' of ssh://codereview.qt-project.org/qt/qtdeclarative into wip/v4
Conflicts: src/imports/qtquick2/plugins.qmltypes src/qml/debugger/qv8debugservice.cpp src/qml/qml/qml.pri src/qml/qml/qqmlcompiler.cpp src/qml/qml/qqmlcomponent.cpp src/qml/qml/qqmlcontext.cpp src/qml/qml/qqmldata_p.h src/qml/qml/qqmlengine_p.h src/qml/qml/qqmljavascriptexpression.cpp src/qml/qml/qqmlxmlhttprequest.cpp src/qml/qml/v4/qv4bindings.cpp src/qml/qml/v4/qv4irbuilder.cpp src/qml/qml/v4/qv4jsonobject_p.h src/qml/qml/v8/qqmlbuiltinfunctions.cpp src/qml/qml/v8/qv8bindings.cpp src/qml/qml/v8/qv8contextwrapper.cpp src/qml/qml/v8/qv8listwrapper.cpp src/qml/qml/v8/qv8qobjectwrapper.cpp src/qml/qml/v8/qv8qobjectwrapper_p.h src/qml/qml/v8/qv8sequencewrapper_p_p.h src/qml/qml/v8/qv8typewrapper.cpp src/qml/qml/v8/qv8valuetypewrapper.cpp src/qml/types/qqmldelegatemodel.cpp src/quick/items/context2d/qquickcanvasitem.cpp src/quick/items/context2d/qquickcontext2d.cpp sync.profile tests/auto/qml/qjsengine/tst_qjsengine.cpp tests/benchmarks/qml/animation/animation.pro tools/qmlprofiler/qmlprofiler.pro Change-Id: I18a76b8a81d87523247fa03a44ca334b1a2360c9
Diffstat (limited to 'src/particles')
-rw-r--r--src/particles/particleresources/fuzzydot.pngbin0 -> 1799 bytes
-rw-r--r--src/particles/particleresources/glowdot.pngbin0 -> 861 bytes
-rw-r--r--src/particles/particleresources/star.pngbin0 -> 1550 bytes
-rw-r--r--src/particles/particles.qrc3
-rw-r--r--src/particles/qquickimageparticle.cpp25
-rw-r--r--src/particles/qquickmaskextruder.cpp35
-rw-r--r--src/particles/qquickparticleemitter.cpp6
-rw-r--r--src/particles/qquickparticlepainter.cpp2
8 files changed, 58 insertions, 13 deletions
diff --git a/src/particles/particleresources/fuzzydot.png b/src/particles/particleresources/fuzzydot.png
new file mode 100644
index 0000000000..bc95b703c1
--- /dev/null
+++ b/src/particles/particleresources/fuzzydot.png
Binary files differ
diff --git a/src/particles/particleresources/glowdot.png b/src/particles/particleresources/glowdot.png
new file mode 100644
index 0000000000..5c83896d22
--- /dev/null
+++ b/src/particles/particleresources/glowdot.png
Binary files differ
diff --git a/src/particles/particleresources/star.png b/src/particles/particleresources/star.png
new file mode 100644
index 0000000000..0d592cfa87
--- /dev/null
+++ b/src/particles/particleresources/star.png
Binary files differ
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()