From 1aa012a1c83ce8905e5440d3e7ae11192dc73878 Mon Sep 17 00:00:00 2001 From: Alan Alpert <alan.alpert@nokia.com> Date: Tue, 6 Sep 2011 10:40:21 +1000 Subject: [PATCH] Particles module refactoring en masse All the little changes in one commit. StochasticDirection -> Direction AngledDirection -> AngleDirection TargetedDirection -> TargetDirection QSGCustomParticle is now Affector's implementation (C++ only refactor) FollowEmitter -> TrailEmitter Kill -> Age and gained lifeLeft property ModelParticle is removed, use ItemParticle instead. Added RectangleShape to replace Shape for the case of Rectangles Abstract Types are no longer createable, despite sensible defaults. GLSL variables in CustomParticle now begin with qt_ JS variables are now such that x,vx,ax are current (old ones are now initialX, initialVX, initialAX). Same for y. A few more were extended. Emitter::emitCap -> Emitter::maximumEmitted. Set to -1 for noCap: false Emitter::noCap is gone. Emitter::emitting -> Emitter::enabled Affector::active -> Affector::enabled Affector::collisionParticles -> Affector::whenCollidingWith Affector::signal is gone. PointAttractor -> Attractor Attractor/Wander::physics -> ::affectedParameter ParticleSystem::fastForward is gone ParticleSystem::startTime is gone (use Emitter::startTime) ParticleSystem::clear -> ParticleSystem::empty And various Doc fixes. Change-Id: Ia3b02b987f692e6f1bd14c42e575381bdfb7bbb5 Reviewed-on: http://codereview.qt-project.org/4231 Reviewed-by: Alan Alpert <alan.alpert@nokia.com> --- .../flickr/content/ImageDetails.qml | 47 +- .../declarative/flickr/content/Progress.qml | 4 +- .../declarative/flickr/content/StreamView.qml | 107 ----- .../flickr/content/UnifiedDelegate.qml | 8 - examples/declarative/flickr/flickr.qml | 74 ++-- .../declarative/particles/allsmiles/plain.qml | 2 +- .../declarative/particles/allsmiles/smile.qml | 12 +- .../particles/allsmiles/smilefactory.qml | 14 +- .../particles/allsmiles/spriteparticles.qml | 2 - .../allsmiles/spritestateparticles.qml | 3 +- .../allsmiles/spritevariedparticles.qml | 3 +- .../particles/allsmiles/ultraparticles.qml | 3 +- .../particles/asteroid/asteroid.qml | 1 - .../particles/asteroid/blackhole.qml | 19 +- .../particles/custom/blurparticles.qml | 6 +- .../declarative/particles/custom/custom.qml | 31 +- .../particles/custom/delegates.qml | 2 +- .../particles/custom/fallingleaves.qml | 18 +- .../declarative/particles/custom/shader.qml | 20 +- .../particles/exampleslauncher.qml | 5 - .../particles/modelparticles/bubbles.qml | 82 ---- .../modelparticles/content/Delegate.qml | 88 ---- .../modelparticles/content/Delegate2.qml | 79 ---- .../content/ExpandingDelegate.qml | 204 --------- .../modelparticles/content/RssModel.qml | 53 --- .../modelparticles/content/bubble.png | Bin 3413 -> 0 bytes .../modelparticles/content/script.js | 27 -- .../particles/modelparticles/gridsplosion.qml | 144 ------ .../particles/modelparticles/package.qml | 91 ---- .../particles/modelparticles/stream.qml | 276 ------------ examples/declarative/particles/snow/snow.qml | 11 +- .../spaceexplorer/content/helpers.js | 8 - .../spaceexplorer/content/particle4.png | Bin 1799 -> 0 bytes .../spaceexplorer/content/powerupScore.png | Bin 83169 -> 0 bytes .../content/powerupScore_gone.png | Bin 140 -> 0 bytes .../content/powerupScore_got.png | Bin 81528 -> 0 bytes .../spaceexplorer/content/rocket.png | Bin 7315 -> 0 bytes .../spaceexplorer/content/rocket2.png | Bin 1918 -> 0 bytes .../spaceexplorer/content/rocketEye.png | Bin 2073 -> 0 bytes .../particles/spaceexplorer/content/star.png | Bin 1550 -> 0 bytes .../particles/spaceexplorer/spaceexplorer.qml | 417 ------------------ .../particles/trails/combustion.qml | 8 +- .../particles/trails/dynamicemitters.qml | 6 +- .../particles/trails/fireballs.qml | 6 +- .../particles/trails/fireworks.qml | 17 +- .../declarative/particles/trails/layered.qml | 2 +- .../declarative/particles/trails/list.qml | 4 +- .../particles/trails/overburst.qml | 10 +- .../declarative/particles/trails/portal.qml | 10 +- .../declarative/particles/trails/shimmer.qml | 1 - .../declarative/particles/trails/trails.qml | 8 +- .../particles/trails/turbulence.qml | 10 +- .../plasmapatrol/content/BlasterHardpoint.qml | 10 +- .../plasmapatrol/content/CannonHardpoint.qml | 6 +- .../plasmapatrol/content/Cruiser.qml | 10 +- .../plasmapatrol/content/Frigate.qml | 4 +- .../plasmapatrol/content/LaserHardpoint.qml | 8 +- .../content/PlasmaPatrolParticles.qml | 10 +- .../plasmapatrol/content/Sloop.qml | 4 +- .../declarative/plasmapatrol/plasmapatrol.qml | 4 +- .../samegame/SamegameCore/BoomBlock.qml | 6 +- src/declarative/particles/particles.pri | 30 +- src/declarative/particles/qsgage.cpp | 81 ++++ .../particles/{qsgkill.cpp => qsgage_p.h} | 57 ++- ...leddirection.cpp => qsgangledirection.cpp} | 22 +- ...leddirection_p.h => qsgangledirection_p.h} | 6 +- .../particles/qsgcumulativedirection.cpp | 10 +- .../particles/qsgcumulativedirection_p.h | 10 +- .../particles/qsgcustomaffector.cpp | 80 ++++ .../{qsgkill_p.h => qsgcustomaffector_p.h} | 26 +- .../particles/qsgcustomparticle.cpp | 94 ++-- ...ochasticdirection.cpp => qsgdirection.cpp} | 10 +- ...ochasticdirection_p.h => qsgdirection_p.h} | 4 +- .../particles/qsgimageparticle.cpp | 6 +- .../particles/qsgimageparticle_p.h | 22 +- .../particles/qsgmodelparticle.cpp | 335 -------------- .../particles/qsgmodelparticle_p.h | 140 ------ .../particles/qsgparticleaffector.cpp | 54 +-- .../particles/qsgparticleaffector_p.h | 62 +-- .../particles/qsgparticleemitter.cpp | 65 +-- .../particles/qsgparticleemitter_p.h | 184 ++++---- .../particles/qsgparticleextruder.cpp | 22 +- .../particles/qsgparticleextruder_p.h | 19 +- .../particles/qsgparticlepainter.cpp | 4 + .../particles/qsgparticlesmodule.cpp | 34 +- .../particles/qsgparticlesystem.cpp | 81 +++- .../particles/qsgparticlesystem_p.h | 32 +- .../particles/qsgpointattractor.cpp | 42 +- .../particles/qsgpointattractor_p.h | 20 +- .../particles/qsgpointdirection.cpp | 4 +- .../particles/qsgpointdirection_p.h | 4 +- .../particles/qsgrectangleextruder.cpp | 86 ++++ .../particles/qsgrectangleextruder_p.h | 88 ++++ ...eddirection.cpp => qsgtargetdirection.cpp} | 28 +- ...eddirection_p.h => qsgtargetdirection_p.h} | 6 +- ...gfollowemitter.cpp => qsgtrailemitter.cpp} | 46 +- ...gfollowemitter_p.h => qsgtrailemitter_p.h} | 7 +- src/declarative/particles/qsgturbulence.cpp | 2 +- .../particles/qsgv8particledata.cpp | 58 +-- src/declarative/particles/qsgwander.cpp | 33 +- src/declarative/particles/qsgwander_p.h | 22 +- 101 files changed, 1102 insertions(+), 2839 deletions(-) delete mode 100644 examples/declarative/flickr/content/StreamView.qml delete mode 100644 examples/declarative/particles/modelparticles/bubbles.qml delete mode 100644 examples/declarative/particles/modelparticles/content/Delegate.qml delete mode 100644 examples/declarative/particles/modelparticles/content/Delegate2.qml delete mode 100644 examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml delete mode 100644 examples/declarative/particles/modelparticles/content/RssModel.qml delete mode 100644 examples/declarative/particles/modelparticles/content/bubble.png delete mode 100644 examples/declarative/particles/modelparticles/content/script.js delete mode 100644 examples/declarative/particles/modelparticles/gridsplosion.qml delete mode 100644 examples/declarative/particles/modelparticles/package.qml delete mode 100644 examples/declarative/particles/modelparticles/stream.qml delete mode 100644 examples/declarative/particles/spaceexplorer/content/helpers.js delete mode 100644 examples/declarative/particles/spaceexplorer/content/particle4.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/powerupScore_got.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/rocket.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/rocket2.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/rocketEye.png delete mode 100644 examples/declarative/particles/spaceexplorer/content/star.png delete mode 100644 examples/declarative/particles/spaceexplorer/spaceexplorer.qml create mode 100644 src/declarative/particles/qsgage.cpp rename src/declarative/particles/{qsgkill.cpp => qsgage_p.h} (70%) rename src/declarative/particles/{qsgangleddirection.cpp => qsgangledirection.cpp} (84%) rename src/declarative/particles/{qsgangleddirection_p.h => qsgangledirection_p.h} (95%) create mode 100644 src/declarative/particles/qsgcustomaffector.cpp rename src/declarative/particles/{qsgkill_p.h => qsgcustomaffector_p.h} (84%) rename src/declarative/particles/{qsgstochasticdirection.cpp => qsgdirection.cpp} (85%) rename src/declarative/particles/{qsgstochasticdirection_p.h => qsgdirection_p.h} (95%) delete mode 100644 src/declarative/particles/qsgmodelparticle.cpp delete mode 100644 src/declarative/particles/qsgmodelparticle_p.h create mode 100644 src/declarative/particles/qsgrectangleextruder.cpp create mode 100644 src/declarative/particles/qsgrectangleextruder_p.h rename src/declarative/particles/{qsgtargeteddirection.cpp => qsgtargetdirection.cpp} (81%) rename src/declarative/particles/{qsgtargeteddirection_p.h => qsgtargetdirection_p.h} (97%) rename src/declarative/particles/{qsgfollowemitter.cpp => qsgtrailemitter.cpp} (85%) rename src/declarative/particles/{qsgfollowemitter_p.h => qsgtrailemitter_p.h} (93%) diff --git a/examples/declarative/flickr/content/ImageDetails.qml b/examples/declarative/flickr/content/ImageDetails.qml index d45f8e80e9..8d3cdfb494 100644 --- a/examples/declarative/flickr/content/ImageDetails.qml +++ b/examples/declarative/flickr/content/ImageDetails.qml @@ -164,7 +164,7 @@ Flipable { anchors.fill: parent frequency: 100 strength: 250 - active: false + enabled: false } Item{ @@ -180,7 +180,7 @@ Flipable { function imageOutAnim(){ bigImage.visible = false; noiseIn.visible = false; - turbulence.active = true; + turbulence.enabled = true; endEffectTimer.start(); pixelEmitter.burst(2048); } @@ -190,7 +190,7 @@ Flipable { repeat: false running: false onTriggered:{ - turbulence.active = false; + turbulence.enabled = false; noiseIn.visible = false; bigImage.visible = true; } @@ -245,7 +245,7 @@ Flipable { size: 4 lifeSpan: flipDuration emitRate: 2048 - emitting: false + enabled: false } CustomParticle{ id: blowOut @@ -253,54 +253,23 @@ Flipable { property real maxWidth: effectBox.width property real maxHeight: effectBox.height vertexShader:" - attribute highp vec2 vPos; - attribute highp vec2 vTex; - attribute highp vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize - attribute highp vec4 vVec; // x,y = constant speed, z,w = acceleration - attribute highp float r; - uniform highp float maxWidth; uniform highp float maxHeight; - uniform highp mat4 qt_Matrix; - uniform highp float timestamp; - uniform lowp float qt_Opacity; - varying highp vec2 fTex2; - varying lowp float fFade; void main() { - fTex2 = vec2(vPos.x / maxWidth, vPos.y / maxHeight); - highp float size = vData.z; - highp float endSize = vData.w; - - highp float t = (timestamp - vData.x) / vData.y; - - highp float currentSize = mix(size, endSize, t * t); - - if (t < 0. || t > 1.) - currentSize = 0.; - - highp vec2 pos = vPos - - currentSize / 2. + currentSize * vTex // adjust size - + vVec.xy * t * vData.y // apply speed vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); - - gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); - - highp float fadeIn = min(t * 10., 1.); - highp float fadeOut = 1. - max(0., min((t - 0.75) * 4., 1.)); - - fFade = 1.0;//fadeIn * fadeOut * qt_Opacity; + defaultMain(); + fTex2 = vec2(qt_ParticlePos.x / maxWidth, qt_ParticlePos.y / maxHeight); } " property variant pictureTexture: pictureSource fragmentShader: " + uniform lowp float qt_Opacity; uniform sampler2D pictureTexture; varying highp vec2 fTex2; - varying highp float fFade; void main() { - gl_FragColor = texture2D(pictureTexture, fTex2) * fFade; + gl_FragColor = texture2D(pictureTexture, fTex2) * qt_Opacity; }" } diff --git a/examples/declarative/flickr/content/Progress.qml b/examples/declarative/flickr/content/Progress.qml index 28fa0c3bac..598ff7123c 100644 --- a/examples/declarative/flickr/content/Progress.qml +++ b/examples/declarative/flickr/content/Progress.qml @@ -69,14 +69,14 @@ Item{ Emitter{ y: 2; height: parent.height-4; x: 2; width: Math.max(parent.width * progress - 4, 0); - speed: AngledDirection{ angleVariation: 180; magnitudeVariation: 12 } + speed: AngleDirection{ angleVariation: 180; magnitudeVariation: 12 } system: barSys emitRate: width; lifeSpan: 1000 size: 20 sizeVariation: 4 endSize: 12 - emitCap: parent.width; + maximumEmitted: parent.width; } Text { diff --git a/examples/declarative/flickr/content/StreamView.qml b/examples/declarative/flickr/content/StreamView.qml deleted file mode 100644 index 9aa6b746a8..0000000000 --- a/examples/declarative/flickr/content/StreamView.qml +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtDeclarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 - -Item{ - id: container - property alias model: mp.model - property alias delegate: mp.delegate - property bool jumpStarted: false - ParticleSystem{ - id: sys - anchors.fill:parent - } - ModelParticle{ - id: mp - fade: false - system: sys - anchors.fill: parent - onModelCountChanged: { - if(!jumpStarted && modelCount > 0){ - console.log("Jumping"); - jumpStarted = true; - sys.fastForward(8000); - } - } - } - property real emitterSpacing: parent.width/3 - Emitter{ - system: sys - width: emitterSpacing - 64 - x: emitterSpacing*0 + 32 - y: -128 - height: 32 - speed: PointDirection{ y: (container.height + 128)/12 } - emitRate: 0.4 - lifeSpan: 1000000//eventually -1 should mean a million seconds for neatness - emitCap: 15 - } - Emitter{ - system: sys - width: emitterSpacing - 64 - x: emitterSpacing*1 + 32 - y: -128 - height: 32 - speed: PointDirection{ y: (container.height + 128)/12 } - emitRate: 0.4 - lifeSpan: 1000000//eventually -1 should mean a million seconds for neatness - emitCap: 15 - } - Emitter{ - system: sys - width: emitterSpacing - 64 - x: emitterSpacing*2 + 32 - y: -128 - height: 32 - speed: PointDirection{ y: (container.height + 128)/12 } - emitRate: 0.4 - lifeSpan: 1000000//eventually -1 should mean a million seconds for neatness - emitCap: 15 - } - Kill{ - system: sys - y: container.height + 64 - width: container.width - height: 6400 - } -} diff --git a/examples/declarative/flickr/content/UnifiedDelegate.qml b/examples/declarative/flickr/content/UnifiedDelegate.qml index 24bd146b9f..5c8ce75d05 100644 --- a/examples/declarative/flickr/content/UnifiedDelegate.qml +++ b/examples/declarative/flickr/content/UnifiedDelegate.qml @@ -65,12 +65,6 @@ Package { id: streamwrapper; width: 80; height: 80 Package.name: "stream" - function pleaseFreeze(){ - ModelParticle.particle.freeze(streamwrapper); - } - function pleaseUnfreeze(){ - ModelParticle.particle.unfreeze(streamwrapper); - } } Item { //anchors.centerIn: parent//Doesn't animate :( @@ -112,7 +106,6 @@ Package { transitions: [ Transition { from: "Show"; to: "Details" - ScriptAction{ script: streamwrapper.pleaseFreeze(); } ParentAnimation { via: foreground NumberAnimation { properties: "x,y"; duration: 500; easing.type: Easing.InOutQuad } @@ -125,7 +118,6 @@ Package { via: foreground NumberAnimation { properties: "x,y"; duration: 500; easing.type: Easing.InOutQuad } } - ScriptAction{ script: streamwrapper.pleaseUnfreeze(); } } } ] diff --git a/examples/declarative/flickr/flickr.qml b/examples/declarative/flickr/flickr.qml index a222b41341..14e4fcaedf 100644 --- a/examples/declarative/flickr/flickr.qml +++ b/examples/declarative/flickr/flickr.qml @@ -45,7 +45,7 @@ import "content" Item { id: screen; width: 320; height: 480 - property bool inGridView : false + property bool inGridView : true Rectangle { id: background @@ -54,40 +54,38 @@ Item { Image { source: "content/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 } ParticleSystem { id: bgParticles - startTime: 16000 - } - ImageParticle { - particles: ["trail"] - source: "content/images/particle.png" - color: "#1A1A6F" - alpha: 0.1 - colorVariation: 0.01 - blueVariation: 0.8 - system: bgParticles - } - Emitter { - particle: "drops" - width: parent.width - emitRate: 0.5 - lifeSpan: 20000 - speed: PointDirection{ - y: {screen.height/18} - } - system: bgParticles - } - FollowEmitter { - follow: "drops" - particle: "trail" - emitRatePerParticle: 18 - size: 32 - endSize: 0 - sizeVariation: 4 - lifeSpan: 1200 - system: bgParticles anchors.fill: parent - emitWidth: 16 - emitHeight: 16 - emitShape: EllipseShape{} + ImageParticle { + particles: ["trail"] + source: "content/images/particle.png" + color: "#1A1A6F" + alpha: 0.1 + colorVariation: 0.01 + blueVariation: 0.8 + } + Emitter { + particle: "drops" + width: parent.width + emitRate: 0.5 + lifeSpan: 20000 + startTime: 16000 + speed: PointDirection{ + y: {screen.height/18} + } + } + TrailEmitter { + follow: "drops" + particle: "trail" + emitRatePerParticle: 18 + size: 32 + endSize: 0 + sizeVariation: 4 + lifeSpan: 1200 + anchors.fill: parent + emitWidth: 16 + emitHeight: 16 + emitShape: EllipseShape{} + } } VisualDataModel{ @@ -107,14 +105,8 @@ Item { cellWidth: (parent.width-2)/4; cellHeight: cellWidth; width: parent.width; height: parent.height } - StreamView{ - id: photoStreamView - model: vdm.parts.stream - width: parent.width; height: parent.height - } - states: State { - name: "GridView"; when: screen.inGridView == true + name: "GridView"; when: state.inGridView == true } transitions: Transition { diff --git a/examples/declarative/particles/allsmiles/plain.qml b/examples/declarative/particles/allsmiles/plain.qml index 890a5782d1..89198845b8 100644 --- a/examples/declarative/particles/allsmiles/plain.qml +++ b/examples/declarative/particles/allsmiles/plain.qml @@ -17,7 +17,7 @@ Rectangle{ emitRate: 1000 size: 20 lifeSpan: 10000 - speed: AngledDirection{angleVariation: 360; magnitudeVariation: 100;} + speed: AngleDirection{angleVariation: 360; magnitudeVariation: 100;} } MouseArea{ anchors.fill: parent diff --git a/examples/declarative/particles/allsmiles/smile.qml b/examples/declarative/particles/allsmiles/smile.qml index bfce60cc4a..e091d99e80 100644 --- a/examples/declarative/particles/allsmiles/smile.qml +++ b/examples/declarative/particles/allsmiles/smile.qml @@ -77,8 +77,8 @@ Rectangle{ uniform lowp float qt_Opacity; void main() { - fTex2 = vec2(vPos.x / maxWidth, vPos.y / maxHeight); - highp float t = (timestamp - vData.x) / vData.y; + fTex2 = vec2(qt_ParticlePos.x / maxWidth, qt_ParticlePos.y / maxHeight); + highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y; fFade = min(t*4., (1.-t*t)*.75) * qt_Opacity; defaultMain(); } @@ -88,19 +88,19 @@ Rectangle{ fragmentShader: " uniform sampler2D particleTexture; uniform sampler2D pictureTexture; - varying highp vec2 fTex; + varying highp vec2 qt_TexCoord0; varying highp vec2 fTex2; varying lowp float fFade; void main() { - gl_FragColor = texture2D(pictureTexture, fTex2) * texture2D(particleTexture, fTex).w * fFade; + gl_FragColor = texture2D(pictureTexture, fTex2) * texture2D(particleTexture, qt_TexCoord0).w * fFade; }" } Emitter{ id: emitter system: sys - emitting: false + enabled: false lifeSpan: 4000 - emitCap: 1200 + maximumEmitted: 1200 anchors.fill: parent size: 32 speed: PointDirection{ xVariation: 12; yVariation: 12 } diff --git a/examples/declarative/particles/allsmiles/smilefactory.qml b/examples/declarative/particles/allsmiles/smilefactory.qml index 5b36eee3cd..fe651491b9 100644 --- a/examples/declarative/particles/allsmiles/smilefactory.qml +++ b/examples/declarative/particles/allsmiles/smilefactory.qml @@ -58,33 +58,33 @@ Rectangle{ system: sys particles: ["goingDown"] source: "content/squarefacespriteXX.png" - rotation: 180 yVector: PointDirection{ y: 0.5; yVariation: 0.25; xVariation: 0.25; } + rotation: 180 } Timer{ running: true repeat: false interval: 100 - onTriggered: emitA.emitting = true; + onTriggered: emitA.enabled = true; } Timer{ running: true repeat: false interval: 4200 - onTriggered: emitB.emitting = true; + onTriggered: emitB.enabled = true; } Timer{ running: true repeat: false interval: 8400 - onTriggered: emitC.emitting = true; + onTriggered: emitC.enabled = true; } Emitter{ id: emitA x: 0 y: 120 system: sys - emitting: false + enabled: false particle: "goingRight" speed: PointDirection{ x: 100 } lifeSpan: 4000 @@ -96,7 +96,7 @@ Rectangle{ x: 400 y: 240 system: sys - emitting: false + enabled: false particle: "goingLeft" speed: PointDirection{ x: -100 } lifeSpan: 4000 @@ -108,7 +108,7 @@ Rectangle{ x: 0 y: 360 system: sys - emitting: false + enabled: false particle: "goingDown" speed: PointDirection{ x: 100 } lifeSpan: 4000 diff --git a/examples/declarative/particles/allsmiles/spriteparticles.qml b/examples/declarative/particles/allsmiles/spriteparticles.qml index f5479f1570..705016e050 100644 --- a/examples/declarative/particles/allsmiles/spriteparticles.qml +++ b/examples/declarative/particles/allsmiles/spriteparticles.qml @@ -78,7 +78,6 @@ Rectangle{ id: particles2 emitRate: 6000 lifeSpan: 720 - emitting: true size: 10 shape: mask } @@ -89,7 +88,6 @@ Rectangle{ id: particles emitRate: 60 lifeSpan: 1440 - emitting: true speed: PointDirection{xVariation: 10; yVariation: 10;} size: 30 sizeVariation: 10 diff --git a/examples/declarative/particles/allsmiles/spritestateparticles.qml b/examples/declarative/particles/allsmiles/spritestateparticles.qml index a599c69a63..06b78cdba4 100644 --- a/examples/declarative/particles/allsmiles/spritestateparticles.qml +++ b/examples/declarative/particles/allsmiles/spritestateparticles.qml @@ -172,8 +172,7 @@ Rectangle{ system: sys emitRate: 16 lifeSpan: 10000 - emitting: true - speed: AngledDirection{angle: 90; magnitude: 60; angleVariation: 5} + speed: AngleDirection{angle: 90; magnitude: 60; angleVariation: 5} acceleration: PointDirection{ y: 10 } size: 30 sizeVariation: 10 diff --git a/examples/declarative/particles/allsmiles/spritevariedparticles.qml b/examples/declarative/particles/allsmiles/spritevariedparticles.qml index d6e13727ff..4696bfb4ff 100644 --- a/examples/declarative/particles/allsmiles/spritevariedparticles.qml +++ b/examples/declarative/particles/allsmiles/spritevariedparticles.qml @@ -98,8 +98,7 @@ Rectangle{ width: parent.width emitRate: 16 lifeSpan: 8000 - emitting: true - speed: AngledDirection{angle: 90; magnitude: 300; magnitudeVariation: 100; angleVariation: 5} + speed: AngleDirection{angle: 90; magnitude: 300; magnitudeVariation: 100; angleVariation: 5} acceleration: PointDirection{ y: 10 } size: 30 sizeVariation: 10 diff --git a/examples/declarative/particles/allsmiles/ultraparticles.qml b/examples/declarative/particles/allsmiles/ultraparticles.qml index eda1c8f859..9094e83801 100644 --- a/examples/declarative/particles/allsmiles/ultraparticles.qml +++ b/examples/declarative/particles/allsmiles/ultraparticles.qml @@ -86,8 +86,7 @@ Rectangle{ id: particles emitRate: 200 lifeSpan: 6000 - emitting: true - speed: AngledDirection{angleVariation: 360; magnitude: 80; magnitudeVariation: 40} + speed: AngleDirection{angleVariation: 360; magnitude: 80; magnitudeVariation: 40} size: 40 endSize: 80 } diff --git a/examples/declarative/particles/asteroid/asteroid.qml b/examples/declarative/particles/asteroid/asteroid.qml index 2ecfc42a98..ea2fabd51d 100644 --- a/examples/declarative/particles/asteroid/asteroid.qml +++ b/examples/declarative/particles/asteroid/asteroid.qml @@ -94,7 +94,6 @@ Item { particle: "meteor" emitRate: 12 lifeSpan: 5000 - emitting: true acceleration: PointDirection{ xVariation: 80; yVariation: 80; } size: 15 endSize: 300 diff --git a/examples/declarative/particles/asteroid/blackhole.qml b/examples/declarative/particles/asteroid/blackhole.qml index 57474f955e..7e8a7a9edc 100644 --- a/examples/declarative/particles/asteroid/blackhole.qml +++ b/examples/declarative/particles/asteroid/blackhole.qml @@ -70,7 +70,7 @@ Rectangle{ system: particles emitRate: 40 lifeSpan: 4000 - emitting: true + enabled: true size: 30 sizeVariation: 10 speed: PointDirection{ x: 220; xVariation: 40 } @@ -81,7 +81,7 @@ Rectangle{ system: particles emitRate: 10 lifeSpan: 4000 - emitting: true + enabled: true size: 30 sizeVariation: 10 speed: PointDirection{ x: 220; xVariation: 40 } @@ -145,16 +145,16 @@ Rectangle{ colorVariation: 0.2 } - PointAttractor{ + Attractor{ id: gs; pointX: root.width/2; pointY: root.height/2; strength: 4000000; system: particles - physics: PointAttractor.Acceleration - proportionalToDistance: PointAttractor.InverseQuadratic + affectedParameter: Attractor.Acceleration + proportionalToDistance: Attractor.InverseQuadratic } - Kill{ + Age{ system: particles - x: gs.x - 8; - y: gs.y - 8; + x: gs.pointX - 8; + y: gs.pointY - 8; width: 16 height: 16 } @@ -174,7 +174,6 @@ Rectangle{ system: particles emitRate: 200 lifeSpan: 1000 - emitting: true size: 10 endSize: 4 sizeVariation: 4 @@ -187,7 +186,7 @@ Rectangle{ system: particles emitRate: 32 lifeSpan: 2000 - emitting: spacePressed + enabled: spacePressed size: 40 speed: PointDirection{ x: 256; } x: parent.width diff --git a/examples/declarative/particles/custom/blurparticles.qml b/examples/declarative/particles/custom/blurparticles.qml index 238608c002..df0fa18971 100644 --- a/examples/declarative/particles/custom/blurparticles.qml +++ b/examples/declarative/particles/custom/blurparticles.qml @@ -75,7 +75,7 @@ Rectangle{ void main() { defaultMain(); - highp float t = (timestamp - vData.x) / vData.y; + highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y; highp float fadeIn = min(t * 10., 1.); highp float fadeOut = 1. - max(0., min((t - 0.75) * 4., 1.)); @@ -126,11 +126,11 @@ Rectangle{ fragmentShader: " uniform sampler2D source; uniform sampler2D blurred; - varying highp vec2 fTex; + varying highp vec2 qt_TexCoord0; varying highp float fBlur; varying highp float fFade; void main() { - gl_FragColor = mix(texture2D(source, fTex), texture2D(blurred, fTex), min(1.0,fBlur*3.0)) * fFade; + gl_FragColor = mix(texture2D(source, qt_TexCoord0), texture2D(blurred, qt_TexCoord0), min(1.0,fBlur*3.0)) * fFade; }" } diff --git a/examples/declarative/particles/custom/custom.qml b/examples/declarative/particles/custom/custom.qml index 4b75cf6ebe..50de60b332 100644 --- a/examples/declarative/particles/custom/custom.qml +++ b/examples/declarative/particles/custom/custom.qml @@ -5,6 +5,7 @@ ParticleSystem{ id: sys width: 360 height: 600 + running: true Rectangle{ z: -1 anchors.fill: parent @@ -33,14 +34,14 @@ ParticleSystem{ size: 12 anchors.centerIn: parent onEmitParticle:{ - particle.size = Math.max(12,Math.min(492,Math.tan(particle.t/2)*24)); + particle.startSize = Math.max(12,Math.min(492,Math.tan(particle.t/2)*24)); var theta = Math.floor(Math.random() * 6.0) / 6.0; theta *= 2.0*Math.PI; theta += sys.convert(sys.petalRotation); - particle.vx = petalLength * Math.cos(theta); - particle.vy = petalLength * Math.sin(theta); - particle.ax = particle.vx * -0.5; - particle.ay = particle.vy * -0.5; + particle.initialVX = petalLength * Math.cos(theta); + particle.initialVY = petalLength * Math.sin(theta); + particle.initialAX = particle.initialVX * -0.5; + particle.initialAY = particle.initialVY * -0.5; } } CustomParticle{ @@ -50,21 +51,21 @@ ParticleSystem{ varying highp vec2 fPos; void main() { - fTex = vTex; - highp float size = vData.z; - highp float endSize = vData.w; + qt_TexCoord0 = qt_ParticleTex; + highp float size = qt_ParticleData.z; + highp float endSize = qt_ParticleData.w; - highp float t = (timestamp - vData.x) / vData.y; + highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y; highp float currentSize = mix(size, endSize, t * t); if (t < 0. || t > 1.) currentSize = 0.; - highp vec2 pos = vPos - - currentSize / 2. + currentSize * vTex // adjust size - + vVec.xy * t * vData.y // apply speed vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); + highp vec2 pos = qt_ParticlePos + - currentSize / 2. + currentSize * qt_ParticleTex // adjust size + + qt_ParticleVec.xy * t * qt_ParticleData.y // apply speed vector.. + + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.); gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); @@ -78,9 +79,9 @@ ParticleSystem{ fragmentShader: " varying highp vec2 fPos; varying lowp float fFade; - varying highp vec2 fTex; + varying highp vec2 qt_TexCoord0; void main() {//*2 because this generates dark colors mostly - highp vec2 circlePos = fTex*2.0 - vec2(1.0,1.0); + highp vec2 circlePos = qt_TexCoord0*2.0 - vec2(1.0,1.0); highp float dist = length(circlePos); highp float circleFactor = max(min(1.0 - dist, 1.0), 0.0); gl_FragColor = vec4(fPos.x*2.0 - fPos.y, fPos.y*2.0 - fPos.x, fPos.x*fPos.y*2.0, 0.0) * circleFactor * fFade; diff --git a/examples/declarative/particles/custom/delegates.qml b/examples/declarative/particles/custom/delegates.qml index 4b01c66396..960a398fcb 100644 --- a/examples/declarative/particles/custom/delegates.qml +++ b/examples/declarative/particles/custom/delegates.qml @@ -75,7 +75,7 @@ Rectangle{ emitRate: 1 lifeSpan: 4800 lifeSpanVariation: 1600 - speed: AngledDirection{angleVariation: 360; magnitude: 40; magnitudeVariation: 20} + speed: AngleDirection{angleVariation: 360; magnitude: 40; magnitudeVariation: 20} } ItemParticle{ delegate: Text{ diff --git a/examples/declarative/particles/custom/fallingleaves.qml b/examples/declarative/particles/custom/fallingleaves.qml index 3572490451..55fa77ffe9 100644 --- a/examples/declarative/particles/custom/fallingleaves.qml +++ b/examples/declarative/particles/custom/fallingleaves.qml @@ -53,6 +53,7 @@ Item { particle.r -= particle.rotation * coefficient; if (particle.r == 0.0) particle.r -= particle.rotation * 0.000001; + particle.update = 1; } } @@ -65,16 +66,17 @@ Item { anchors.bottom: parent.bottom onAffectParticle:{ var pseudoRand = (Math.floor(particle.t*1327) % 10) + 1; - var yslow = pseudoRand * 0.001 + 1.01; - var xslow = pseudoRand * 0.0005 + 1.0; - if (particle.curVY < 1) - particle.curVY == 0; + var yslow = pseudoRand * 0.01 + 1.01; + var xslow = pseudoRand * 0.005 + 1.0; + if (particle.vy < 1) + particle.vy = 0; else - particle.curVY = (particle.curVY / yslow); - if (particle.curVX < 1) - particle.curVX == 0; + particle.vy = (particle.vy / yslow); + if (particle.vx < 1) + particle.vx = 0; else - particle.curVX = (particle.curVX / xslow); + particle.vx = (particle.vx / xslow); + particle.update = 1; } } ImageParticle{ diff --git a/examples/declarative/particles/custom/shader.qml b/examples/declarative/particles/custom/shader.qml index 6253679cb7..df0e3660cf 100644 --- a/examples/declarative/particles/custom/shader.qml +++ b/examples/declarative/particles/custom/shader.qml @@ -33,21 +33,21 @@ ParticleSystem{ varying highp vec2 fPos; void main() { - fTex = vTex; - highp float size = vData.z; - highp float endSize = vData.w; + qt_TexCoord0 = qt_ParticleTex; + highp float size = qt_ParticleData.z; + highp float endSize = qt_ParticleData.w; - highp float t = (timestamp - vData.x) / vData.y; + highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y; highp float currentSize = mix(size, endSize, t * t); if (t < 0. || t > 1.) currentSize = 0.; - highp vec2 pos = vPos - - currentSize / 2. + currentSize * vTex // adjust size - + vVec.xy * t * vData.y // apply speed vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); + highp vec2 pos = qt_ParticlePos + - currentSize / 2. + currentSize * qt_ParticleTex // adjust size + + qt_ParticleVec.xy * t * qt_ParticleData.y // apply speed vector.. + + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.); gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); @@ -61,9 +61,9 @@ ParticleSystem{ fragmentShader: " varying highp vec2 fPos; varying lowp float fFade; - varying highp vec2 fTex; + varying highp vec2 qt_TexCoord0; void main() {//*2 because this generates dark colors mostly - highp vec2 circlePos = fTex*2.0 - vec2(1.0,1.0); + highp vec2 circlePos = qt_TexCoord0*2.0 - vec2(1.0,1.0); highp float dist = length(circlePos); highp float circleFactor = max(min(1.0 - dist, 1.0), 0.0); gl_FragColor = vec4(fPos.x*2.0 - fPos.y, fPos.y*2.0 - fPos.x, fPos.x*fPos.y*2.0, 0.0) * circleFactor * fFade; diff --git a/examples/declarative/particles/exampleslauncher.qml b/examples/declarative/particles/exampleslauncher.qml index dfb966536a..91641e595b 100644 --- a/examples/declarative/particles/exampleslauncher.qml +++ b/examples/declarative/particles/exampleslauncher.qml @@ -55,17 +55,12 @@ Rectangle{ VisualDataModel{//TODO: Transitions between modes id: vdm model: [ - "../spaceexplorer/spaceexplorer.qml", "../snow/snow.qml", "../asteroid/asteroid.qml", "../asteroid/blackhole.qml", "../custom/blurparticles.qml", "../custom/custom.qml", "../custom/fallingleaves.qml", - "../modelparticles/bubbles.qml", - "../modelparticles/gridsplosion.qml", - "../modelparticles/package.qml", - "../modelparticles/stream.qml", "../allsmiles/plain.qml", "../allsmiles/smile.qml", "../allsmiles/smilefactory.qml", diff --git a/examples/declarative/particles/modelparticles/bubbles.qml b/examples/declarative/particles/modelparticles/bubbles.qml deleted file mode 100644 index 23f0b82d01..0000000000 --- a/examples/declarative/particles/modelparticles/bubbles.qml +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 -import "../../modelviews/listview/content" as OtherDemo -import "content/script.js" as Script -import "content" -//Needs OtherDemo to be updated to QtQuick 2.0 - -Item{ - id: root - width: 400 - height: 400 - Rectangle{ - anchors.fill: parent - color: "lightsteelblue" - } - ParticleSystem{ - id: sys; - } - Emitter{ - system: sys - particle: "A" - width: parent.width/2 - x: parent.width/4 - y:parent.height - speed: PointDirection{ y: -64; yVariation: 16 } - emitRate: 1 - lifeSpan: 8000 - } - Wander{ - system: sys - xVariance: 400 - pace: 200 - } - ModelParticle{ - id: mp - z: 0 - system: sys - particles: ["A"] - model: OtherDemo.RecipesModel{} - delegate: ExpandingDelegate{} - } -} diff --git a/examples/declarative/particles/modelparticles/content/Delegate.qml b/examples/declarative/particles/modelparticles/content/Delegate.qml deleted file mode 100644 index ae1dffb63b..0000000000 --- a/examples/declarative/particles/modelparticles/content/Delegate.qml +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 - -//![0] -Package { - Text { id: listDelegate; width: 200; height: 25; text: 'Empty'; Package.name: 'list' } - Text { id: gridDelegate; width: 100; height: 50; text: 'Empty'; Package.name: 'grid' } - - Rectangle { - id: wrapper - width: 200; height: 25 - color: 'lightsteelblue' - - Text { text: display; anchors.centerIn: parent } - MouseArea { - anchors.fill: parent - onClicked: { - if (wrapper.state == 'inList') - wrapper.state = 'inGrid'; - else - wrapper.state = 'inList'; - } - } - - state: 'inList' - states: [ - State { - name: 'inList' - ParentChange { target: wrapper; parent: listDelegate } - }, - State { - name: 'inGrid' - ParentChange { - target: wrapper; parent: gridDelegate - x: 0; y: 0; width: gridDelegate.width; height: gridDelegate.height - } - } - ] - - transitions: [ - Transition { - ParentAnimation { - NumberAnimation { properties: 'x,y,width,height'; duration: 300 } - } - } - ] - } -} -//![0] diff --git a/examples/declarative/particles/modelparticles/content/Delegate2.qml b/examples/declarative/particles/modelparticles/content/Delegate2.qml deleted file mode 100644 index a05fa348b9..0000000000 --- a/examples/declarative/particles/modelparticles/content/Delegate2.qml +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 - -//![0] -Package { - Item { id: gridDelegate; width: w; height: h; Package.name: 'grid' } - Item { id: particleDelegate; width: w; height: h; Package.name: 'particles' - - Rectangle { - id: wrapper - width: w; height: h; - color: col - rotation: Math.random()*360 - Behavior on rotation{RotationAnimation{}} - - states: State{ - name: "gridded" - when: root.inGrid - PropertyChanges{ - target: wrapper - rotation: 0 - } - ParentChange{ - target: wrapper - parent: gridDelegate - x:0 - y:0 - } - } - transitions: [ - Transition { - ParentAnimation { - NumberAnimation { properties: 'x,y,width,height'; duration: 300 } - } - } - ] - } - } -} -//![0] diff --git a/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml b/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml deleted file mode 100644 index e6fcb6dcf7..0000000000 --- a/examples/declarative/particles/modelparticles/content/ExpandingDelegate.qml +++ /dev/null @@ -1,204 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import "../../../modelviews/listview/content" - -// This example illustrates expanding a list item to show a more detailed view. - - // Delegate for the recipes. This delegate has two modes: - // 1. List mode (default), which just shows the picture and title of the recipe. - // 2. Details mode, which also shows the ingredients and method. - Component { - id: recipeDelegate - - Item { - id: recipe - - // Create a property to contain the visibility of the details. - // We can bind multiple element's opacity to this one property, - // rather than having a "PropertyChanges" line for each element we - // want to fade. - property real detailsOpacity : 0 - - //this bit changed for aesthetics - width: 70 - height: 70 - // A simple rounded rectangle for the background - Rectangle { - id: background - x: 2; y: 2; width: parent.width - x*2; height: parent.height - y*2 - color: "ivory" - border.color: "orange" - radius: 5 - } - Image{ - anchors.fill:parent - anchors.margins: -32 - source: "bubble.png" - } - - - // This mouse region covers the entire delegate. - // When clicked it changes mode to 'Details'. If we are already - // in Details mode, then no change will happen. - MouseArea { - anchors.fill: parent - onClicked: recipe.state = 'Details'; - } - - // Lay out the page: picture, title and ingredients at the top, and method at the - // bottom. Note that elements that should not be visible in the list - // mode have their opacity set to recipe.detailsOpacity. - Row { - id: topLayout - x: 10; y: 10; height: recipeImage.height; width: parent.width - spacing: 10 - - Image { - id: recipeImage - width: 50; height: 50 - source: "../../modelviews/listview/" + picture - } - - Column { - width: background.width - recipeImage.width - 20; height: recipeImage.height - spacing: 5 - - Text { - text: title - font.bold: true; font.pointSize: 16 - } - - Text { - text: "Ingredients" - font.pointSize: 12; font.bold: true - opacity: recipe.detailsOpacity - } - - Text { - text: ingredients - wrapMode: Text.WordWrap - width: parent.width - opacity: recipe.detailsOpacity - } - } - } - - Item { - id: details - x: 10; width: parent.width - 20 - anchors { top: topLayout.bottom; topMargin: 10; bottom: parent.bottom; bottomMargin: 10 } - opacity: recipe.detailsOpacity - - Text { - id: methodTitle - anchors.top: parent.top - text: "Method" - font.pointSize: 12; font.bold: true - } - - Flickable { - id: flick - width: parent.width - anchors { top: methodTitle.bottom; bottom: parent.bottom } - contentHeight: methodText.height - clip: true - - Text { id: methodText; text: method; wrapMode: Text.WordWrap; width: details.width } - } - - Image { - anchors { right: flick.right; top: flick.top } - source: "../../modelviews/listview/" + "content/pics/moreUp.png" - opacity: flick.atYBeginning ? 0 : 1 - } - - Image { - anchors { right: flick.right; bottom: flick.bottom } - source: "../../modelviews/listview/" + "content/pics/moreDown.png" - opacity: flick.atYEnd ? 0 : 1 - } - } - - // A button to close the detailed view, i.e. set the state back to default (''). - TextButton { - y: 10 - anchors { right: background.right; rightMargin: 10 } - opacity: recipe.detailsOpacity - text: "Close" - - onClicked: recipe.state = ''; - } - - states: State { - name: "Details" - - PropertyChanges { target: background; color: "white" } - PropertyChanges { target: recipeImage; width: 130; height: 130 } // Make picture bigger - PropertyChanges { target: recipe; detailsOpacity: 1; x: 0; opacity: 1 } // Make details visible - PropertyChanges { target: recipe; height: root.height; width: root.height; x:0; y:0; z:100} // Fill the entire list area with the detailed view - - // Move the list so that this item is at the top. - //PropertyChanges { target: recipe.ListView.view; explicit: true; contentY: recipe.y } - - // Disallow flicking while we're in detailed view - //PropertyChanges { target: recipe.ListView.view; interactive: false } - } - - transitions: Transition { - //The only strictly necessary particle specific lines - to: "Details" - reversible: true - ScriptAction{script:{ - if(state == "Details") - mp.freeze(index); - else - mp.unfreeze(index); - } - } - // Make the state changes smooth - ParallelAnimation { - ColorAnimation { property: "color"; duration: 500 } - NumberAnimation { duration: 300; properties: "detailsOpacity,opacity,x,y,height,width" } - } - } - } - } diff --git a/examples/declarative/particles/modelparticles/content/RssModel.qml b/examples/declarative/particles/modelparticles/content/RssModel.qml deleted file mode 100644 index edb3ceac42..0000000000 --- a/examples/declarative/particles/modelparticles/content/RssModel.qml +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 - -XmlListModel { - property string tags : "" - - source: "http://api.flickr.com/services/feeds/photos_public.gne?"+(tags ? "tags="+tags+"&" : "") - query: "/feed/entry" - namespaceDeclarations: "declare default element namespace 'http://www.w3.org/2005/Atom';" - - XmlRole { name: "title"; query: "title/string()" } - XmlRole { name: "content"; query: "content/string()" } - XmlRole { name: "hq"; query: "link[@rel='enclosure']/@href/string()" } -} diff --git a/examples/declarative/particles/modelparticles/content/bubble.png b/examples/declarative/particles/modelparticles/content/bubble.png deleted file mode 100644 index c7f479e9e39ee1d4db3d17783bfc206afd6d953a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3413 zcmV-b4XW~qP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00001b5ch_0Itp) z=>Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS_ z6b%TBtO17r001I%MObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakAa8CUVIWOmV~41B zLjV8_r%6OXRCwCeoBMNB_jScT>*z{C;%yKw8}l%R!3H}ab`n4Gnl_VknzWP7^zZ9T zf5{(^rqgCRow{{wS{!T~{K8-xgL%s!2_&J%S^eRzBOM*?6#|5U&J2UDbk4cwyT5y{ zz4qSgh{t@`#x{}`{9Y1eS<d}jeeQJLsyl42s{5|02dq45xehJYLoMd2aqS+U-*&&G zKA_ijPwl!Am;&zFo&=_gqL^Lmo<&jo<qc5nhHZ+XsN!0ZdTkF%+6+8pdq~m{umxBL ztcd{>1I_}Iz%5|d_Eq4jr0c+#?Yoj@D}&YX;!$wop{{I#SIrm#2D8ZBz&_wPU<a@j z*l2qVP~`f$FBf^98DIjq30wxgu>GZ^^S~A0rlgq;9`;a%cxVGO-7gE<0lWwtwS7R+ z4qyN<a5oFP4UA{Er}H=2?gIuStpnEC9sv5X*b(3Y@Ck4dIA?pLD2nn?!$J?U^Yt&u zgKr030KNyj1PmpnN3x68fE%_)B;5kWZBJ!!&hGaD{aO4*V2h;fz)ss+C9O>ud<MK{ z`+eYiQ52((Vgx<N;_Gf^yU2qc1zwZ%U0|E-Dd3W%uYj*?UjS}Ms&@Xa?HQnyR8|-w zsQ`Lnh&8s?N!kSL1a{lrCuuM6RPJ*IIBxs6q|3Ias)biZSc)<9Feq=k1?;f>eMvvJ zeJJsK5%>uBJT7}ZUNC8UHVZDZ>-RoP8xWQMdlCX`fyxli**+Rv*(B+@?YAVoW&4bz z@!AG02@~|7ZeNyVFR(|_&usrp($jJ8Pb8fNJ_D`-V~P72x3_t2(e<5bB6))i3h1%j zD`~*?7D@YUAC`0!*q_vS0{C~}LrEje47HdcS`WDR9!Upn{{r~2qz$$|m-N1*)3(0` zZUo?F0ZVc>H|+HLS}G+*n~^kYds@;&413k~B}vDCmw`8c^}wL*cO;E1m6)|2!0r2h zgSLMIylK0T^r56b#_cajx)Wr-$LjTXTr6#Mab3rgW&)mL;R@FzjoN-C##oz-a@_W< zx<R{bLTf2>Gcmu{_Aey8nK(TOybGKHuGyXd$`0wV0=AyAET<(+SNXqNk<`r?`FYm% zI4~{gZaied_UphQNxuT_N;;90OHmYEF`=sm)OM=~;Qdt6Pk<gtCvE?aq>n;QCX1qQ zW5-*Po&xp&PuuR3biww=0ml0SR1FvE&(y|9PuadH>5T1}81+ZM5#UbP<DY{=UBjWZ z1Q*<3`&CIlO`M$q-pS&xhPS)6aE1OJ0$#QKePC~Dfp;YRlkHJS?zX^gn^6ZfNhF=# zl61~?k*x7!;21C*&T)3JP`Dom_5nwe>YfJ9Cgx9d+WFwbe&9{uuk#?!gbhyFzAkBf z(B1U~Ed{WeDNd5hvYZM%K9h{G9{8c89|70nCBxmaL8}wlsabm`@J90d4cjLJc-NBK zn~OgL{08`&FvIm#u>*`q`qK7rT(~NNa2r&X%<1b*mc;iAFk<_hq(9ky%Jxx7Z`l5< zEX((bqL``-UB7>;>H4)326K~RiLZ}<KZn{*)C(Egy;=M}0RL$F`INlX&P~K?-UcpJ z{J&<LIU_8^6DoJEc|v7`Z-FzCwuPSW174BzMLf2-Mv6{uR+go*`>)vE7CL)c($_)O zvX1h$_W*wj{5^26T6`8W37oe5d*DP-6t}BguXuvmPot%>x5@~OwwfhP1(!ax{aH?Z z2{;fBz4tzy5I6Mmh@=-KP1G3PaMDlR9k(Pq{9W9>w|38Q;632Cz`ukl*MZHC+LLIc z$r89N>3p8~vZOr$<DqQq0>c%}6cM-FV*AC^_1^$zZC7#M%oxuG^bXtZ&!1*vtaoky z7WiEXqnX71+&|{gaLFOiG(h8;Y1_AKe+hgMU_2seucY2)W@&XGAHBdck`Bbx&u8bx zfZ0YGX#v|40&8>rXwE+Y{0H#1?Mopnom{;NgXQY=ImGA+a4x)HX9}o~Q#&l01_x4h zZVO>KpK^ApLlsx1#y<<Jw|zHd>dCnNSxGnRm@#kXIU~3eIzMa}1Wac`kuL_cUr2i1 zlupyU0XmR_%{h4xIB)x6Dy$hdw#asw2E{)Ee@LDFwe4>tjU*=P_4(XxH!1I<?tUXJ zmgzoS3HyBB_8v*QY=2d!;;rU`09$Q8lU#jO(v8qbH;G8T>_!@ytyFDOO}15iUaUFs zs2$!0e{qVk(QuY=Nn3$k={il`lLcxau`PLYTGFuXu`at`Pe0Si7WXW^LfiV~RSsY7 z=}#k!N=f4(UZbJ$JJM^MH+*AVed*q=k2~K?Dx0l8XpMYedu~C^pBn|tJvn^2kH$R> zOl9$7NzX%)1{VXtzF<Iq2+wFxb3x(KX;Dwwgeq}94cxX}RiB%}apq?k&8CO#!Fa|* zYW$hH3opks=5Zf2JSfvi9?#%qEih2``c@+Z3Q4W(_*5)d0$vRZ?_dDOgC~GlNqy-{ z)Wfmp;zbL(x2tAG-NfqP*R<`~G;?~Y^+=+qH6WX*M2#D*y2G_2X}ucXsT&BEaTNtM zduubhRcC~(qe!=?!n*}6`c?zUtHGo*>+7!<Oshey(Woh8yCtbVMbT`)aGnV^uCLO@ zjHH3IvRZWySgyJJ3WY$C-o#)wdlHyj0D_HcrqWNJ%th<t1*%BSD#`{*Mq5XFEMJ7O z->ws~=4z%T4NDqHZNDkJpswVoPi~&b3{Zi1c+E!J8&jCwuzh>Mu%=<MGR4icC_J`G z+E9hTawsxZBL4Gyk~AP`i=>TN_&1qe&7EI#Sj@NS0$I|K?JdBXPVKWNc=s!kw;|2Z z^{Hwv)+<5V9h;&fX(inTwoBR_9YCv|KcBQPXn1Fls&BjP-3jLlwC9)QVi-Wu;Cb7Z zfejgLZL7d=x$5`F$o>?>-ymr>uq!jfbGC;&c7+>_&e_Du=ivi;bE6H-Il>ccfPUI) zm3^5{UZE}8xZTkJ9qQ<Bfzz~w4m*J76H99zbey#ki*L*hd(->do5pSdd}8~ndP8(U zTfABBrVRcVIF(%b0`1AqR@wr`xoe&<EGTTROW3|dTdH>{4ccpTP^m0H_QsU<TDrSe zfL)mrJR4%sQ(3+~rdr9PJ{rqrC@R!#z+u{RiUN3__E2ZCQS9Bz1nX`c;P@2yAfFGX z$G*$<nrgUN^O_Z1d_%ET6?U6}gTQxe@5oH>xa}*ADfayhkmD+FJiY#{z%kn|O4=@I zO*PqBX(M!5{Kg2VzL#(vp*@WKxG0JRv0u+%txoOf+SGMADvLh=8-ab2-eg_}bR~E( zH{5uf^+Hqil?~_()jeSQHA%-J;dvYQ?@Alc1kA1m=<ubZlKw9q@atf~q@<ZN8ZMK$ zK~t!>TqSf}n_OQ^v`d?S{kDGq{2;9F1n{5KhOyl?rnT6Y2IR`j+5QXIAnBL3kL7`S za{9HhEaya0^{(+!w0etlb~}=;;7_llO|}n8dKGw`wygG)q<^KYE1tX`eQzzHsX!(^ z=V^-(*G7JFEN%1_ZSllqNq3?I>nLSkibvE%4_&~o2Urt=a{zcPGPxn(6G^`VPTC%; z^Mh{RtEISJLnwI|_$Ba@^b5`bf1)jd_&PCHNn_{QPY>b&9o`)hZ5?qRZPC`w2sXbf z>E#q_AKL!Cq<1T!<o(1~_r-uJ$JfGP*7lh&sxjMtCFu~bIS(}_m6bG>Y4I%JvMf7F zW$T}t6<t8CC++M(+6wah$@51f?aQ<L5%{+VH^({^NnJC_!=P_8fIER7+Wt9hS<GxD zrJ=3Uxj<VsJ4#z2K3f^1n^#mq>8hYf4}V?q`>uf95lPP_D_sNL3O;>qdweNw|G)<5 zL_W&0EYfIrS<>qvA6rA9E&^W?aYd@IQQG3FyR_AwWi5RwUE7}8ixZVfd{-Fge%sGV z+H8AV(x<lH1^)N3%jLUaLVni=?37f!F!7zF%$aEPE{9NEr!7txP02kKkAV621O^i0 z8v}Af39X_0?M_1Mr0ox)1zMRGChqqoX+Z3>{c;MC1DVMW&{mR6q#ZTJ{3|nc1N7G# zv4ge;Qix5*aOV?VA4HYD@~_NvA|@SPnp$Uj2-qE|&4E;9Tl2Tx#JQQ5&ZyCvzmr8@ zO(=blCe0P#R;Pup=u1;gfUJuwYxnI9XV_x95-twWe&uCtrP#`~Wn}Q<=|v3Fmbnfm zt&UY8(|qOjQG1jt_2Oh@kp7UEzPNpLQJJaKbTY<W+AmJ}VZZY)(wSL}ug<PSkM4=R r=dy*sQXjk_ZoWtV->K?*+;0B=FyF&@_|ZP900000NkvXXu0mjfm<5ue diff --git a/examples/declarative/particles/modelparticles/content/script.js b/examples/declarative/particles/modelparticles/content/script.js deleted file mode 100644 index e8ef93a847..0000000000 --- a/examples/declarative/particles/modelparticles/content/script.js +++ /dev/null @@ -1,27 +0,0 @@ -.pragma library - -function getWidth(string) { - return (string.match(/width=\"([0-9]+)\"/))[1] -} - -function getHeight(string) { - return (string.match(/height=\"([0-9]+)\"/))[1] -} - -function getImagePath(string) { - var pattern = /src=\"http:\/\/(\S+)\"/ - return (string.match(pattern))[1] -} - -function calculateScale(width, height, cellSize) { - var widthScale = (cellSize * 1.0) / width - var heightScale = (cellSize * 1.0) / height - var scale = 0 - - if (widthScale <= heightScale) { - scale = widthScale; - } else if (heightScale < widthScale) { - scale = heightScale; - } - return scale; -} diff --git a/examples/declarative/particles/modelparticles/gridsplosion.qml b/examples/declarative/particles/modelparticles/gridsplosion.qml deleted file mode 100644 index 9232eb426d..0000000000 --- a/examples/declarative/particles/modelparticles/gridsplosion.qml +++ /dev/null @@ -1,144 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 -import "content" - -Rectangle{ - id: root - width: 240 - height: 240 - property bool inGrid: false - ParticleSystem{ id: sys } - Emitter{ - system: sys - id: burster; - emitting: false - emitRate: 1000 - lifeSpan: 50000 - emitCap: 100; - speed: PointDirection{xVariation: 400; yVariation: 400} - anchors.centerIn: parent - Timer{ - interval: 1000 - running: true - repeat: false - onTriggered: burster.pulse(0.1); - } - Timer{ - interval: 2000 - running: true - repeat: false - onTriggered: {inGrid = true;}// sys.running = false;} - } - } - ImageParticle{ - system: sys - source: "../trails/content/particle.png" - color: "black" - colorVariation: 0.0 - } - GridView{ id: grid; cellWidth: 40; cellHeight: 40 - model: theModel.parts.grid - width: 120 - height: 120 - } - ModelParticle{ - system: sys - model: theModel.parts.particles - fade: false - } - Friction{ - system: sys - factor: 5 - } - VisualDataModel{ - id: theModel - delegate: Delegate2{} - model: ListModel{ - ListElement{ - w: 40 - h: 20 - col: "forestgreen" - } - ListElement{ - w: 20 - h: 40 - col: "salmon" - } - ListElement{ - w: 20 - h: 20 - col: "lightsteelblue" - } - ListElement{ - w: 40 - h: 40 - col: "goldenrod" - } - ListElement{ - w: 40 - h: 20 - col: "forestgreen" - } - ListElement{ - w: 20 - h: 40 - col: "salmon" - } - ListElement{ - w: 20 - h: 20 - col: "lightsteelblue" - } - ListElement{ - w: 40 - h: 40 - col: "goldenrod" - } - ListElement{ - w: 0 - h: 0 - col: "white"//Hack because add isn't working well with old stuff - } - } - } -} diff --git a/examples/declarative/particles/modelparticles/package.qml b/examples/declarative/particles/modelparticles/package.qml deleted file mode 100644 index d374a93446..0000000000 --- a/examples/declarative/particles/modelparticles/package.qml +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 -import "content" - -Rectangle { - color: "white" - width: 400 - height: 200 - - ListModel { - id: myModel - ListElement { display: "One" } - ListElement { display: "Two" } - ListElement { display: "Three" } - ListElement { display: "Four" } - ListElement { display: "Five" } - ListElement { display: "Six" } - ListElement { display: "Seven" } - ListElement { display: "Eight" } - } - //![0] - VisualDataModel { - id: visualModel - delegate: Delegate {} - model: myModel - } - - ListView { - width: 200; height:200 - model: visualModel.parts.list - } - ModelParticle{ - x: 200; width: 200; height:200 - model: visualModel.parts.grid - system: sys - clip: true; - } - //![0] - ParticleSystem{ - id: sys - anchors.fill: parent - } - Emitter{ - system: sys - width: 100 - x: 250 - speed: PointDirection{ y: 40 } - lifeSpan: 5000 - emitRate: 1.6 - } -} diff --git a/examples/declarative/particles/modelparticles/stream.qml b/examples/declarative/particles/modelparticles/stream.qml deleted file mode 100644 index 0938f17cd4..0000000000 --- a/examples/declarative/particles/modelparticles/stream.qml +++ /dev/null @@ -1,276 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 -import "content/script.js" as Script -import "content" - -Item{ - id: root - width: 640 - height: 480 - Rectangle{ - anchors.fill: parent - color: "black" - z: -1 - } - Item{ - id: loading - Behavior on opacity{NumberAnimation{}} - anchors.fill: parent - Text{ - anchors.centerIn: parent - text: "Loading" - color: "white" - } - } - ParticleSystem{ - id: sys; - running: true - startTime: 12000//Doesn't actually work with the loading time though... - } - Emitter{ - id: emitter - system: sys - height: parent.height - 132/2 - x: -132/2 - y: 132/2 - speed: PointDirection{ x: 32; xVariation: 8 } - emitRate: 0.5 - lifeSpan: 120000 //TODO: A -1 or something which does 'infinite'? (but need disable fade first) - particle: "photos" - } - Kill{ - system: sys - x: parent.width + 132/2 - height: parent.height - width: 1000 - } - ImageParticle{ - system: sys - particles: ["fireworks"] - source: "../trails/content/star.png" - color: "lightsteelblue" - alpha: 0 - colorVariation: 0 - z: 1000 - } - ItemParticle{ - id: mp - z: 0 - system: sys - fade: false - particles: ["photos"] - } - Component{ - id: alertDelegate - Rectangle{ - width: 132 - height: 132 - NumberAnimation on scale{ - running: true - loops: 1 - from: 0.2 - to: 1 - } - Image{ - source: "../asteroid/content/rocket.png" - anchors.centerIn: parent - } - Text{ - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - text: "A new ship has arrived!" - } - } - } - property Item alertItem; - function alert(){ - //resetter.active = false - force.active = true; - alertItem = alertDelegate.createObject(root); - alertItem.x = root.width/2 - alertItem.width/2 - alertItem.y = root.height/2 - alertItem.height/2 - spawnFireworks.pulse(0.2); - stopAlert.start(); - } - focus: true - Keys.onSpacePressed: alert(); - Timer{ - id: stopAlert - running: false - repeat: false - interval: 800 - onTriggered: { - force.active = false - //resetter.active = true; - mp.take(alertItem, true); - centerEmitter.burst(1); - } - } - PointAttractor{ - id: force - system: sys - pointX: root.width/2 - pointY: root.height/2 - strength: -10000 - active: false - anchors.centerIn: parent - width: parent.width/2 - height: parent.height/2 - particles:["photos"] - physics: PointAttractor.Position - } - Emitter{ - id: centerEmitter - speed: PointDirection{ x: 32; xVariation: 8;} - emitRate: 0.5 - lifeSpan: 12000 //TODO: A -1 or something which does 'infinite'? (but need disable fade first) - emitCap: 20 - particle: "photos" - system: sys - anchors.centerIn: parent - emitting: false - - //TODO: Zoom in effect - } - Emitter{ - id: spawnFireworks - particle: "fireworks" - system: sys - emitCap: 400 - emitRate: 400 - lifeSpan: 2800 - x: parent.width/2 - y: parent.height/2 - 64 - width: 8 - height: 8 - emitting: false - size: 32 - endSize: 8 - speed: AngledDirection{ magnitude: 160; magnitudeVariation: 120; angleVariation: 90; angle: 270 } - acceleration: PointDirection{ y: 160 } - } - Item{ x: -1000; y: -1000 //offscreen - Repeater{//Load them here, add to system on completed - model: theModel - delegate: theDelegate - } - } - RssModel{id: theModel; tags:"particle,particles"} - Component { - id: theDelegate - Rectangle { - id: container - border.width: 2 - property real myRand: Math.random();//'depth' - z: Math.floor(myRand * 100) - scale: (myRand + 1.0)/2; - //TODO: Darken based on 'depth' - width: 132 - height: 132 - //ItemParticle.onAttached: console.log("I'm in" + x + "," + y + ":" + opacity); - ItemParticle.onDetached: mp.take(container);//respawns - function manage() - { - if(state == "selected"){ - // console.log("Taking " + index); - mp.freeze(container); - }else{ - // console.log("Returning " +index); - mp.unfreeze(container); - } - } - Image{ - id: img - anchors.centerIn: parent - smooth: true; source: "http://" + Script.getImagePath(content); cache: true - fillMode: Image.PreserveAspectFit; - width: parent.width-4; height: parent.height-4 - onStatusChanged: if(img.status == Image.Ready){ - container.opacity = 0; - loading.opacity = 0; - mp.take(container); - } - } - Text{ - anchors.bottom: parent.bottom - width: parent.width - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideRight - text: title - color: "black" - } - MouseArea{ - anchors.fill: parent - onClicked: container.state == "selected" ? container.state = "" : container.state = "selected" - } - states: State{ - name: "selected" - ParentChange{ - target: container - parent: root - x: 0 - y: 0 - } - PropertyChanges{ - target: container - width: root.width - height: root.height - z: 101 - opacity: 1 - rotation: 0 - } - } - transitions: Transition{ - to: "selected" - reversible: true - SequentialAnimation{ - ScriptAction{script: container.manage();} - ParallelAnimation{ - ParentAnimation{NumberAnimation{ properties: "x,y" }}//Doesn't work, particles takes control of x,y instantly - NumberAnimation{ properties: "width, height, z, rotation" } - } - } - } - } - } -} diff --git a/examples/declarative/particles/snow/snow.qml b/examples/declarative/particles/snow/snow.qml index b988c53f4a..39e322fe84 100644 --- a/examples/declarative/particles/snow/snow.qml +++ b/examples/declarative/particles/snow/snow.qml @@ -61,14 +61,13 @@ Rectangle{ id: wanderer system: particles anchors.fill: parent - xVariance: 360/(wanderer.physics+1); - pace: 100*(wanderer.physics+1); + xVariance: 360/(wanderer.affectedParameter+1); + pace: 100*(wanderer.affectedParameter+1); } Emitter { system: particles emitRate: 20 lifeSpan: 7000 - emitting: true speed: PointDirection{ y:80; yVariation: 40; } acceleration: PointDirection{ y: 4 } size: 20 @@ -81,15 +80,15 @@ Rectangle{ anchors.horizontalCenter: parent.horizontalCenter UI.Button{ text:"dx/dt" - onClicked: wanderer.physics = Wander.Position; + onClicked: wanderer.affectedParameter = Wander.Position; } UI.Button{ text:"dv/dt" - onClicked: wanderer.physics = Wander.Velocity; + onClicked: wanderer.affectedParameter = Wander.Velocity; } UI.Button{ text:"da/dt" - onClicked: wanderer.physics = Wander.Acceleration; + onClicked: wanderer.affectedParameter = Wander.Acceleration; } } } diff --git a/examples/declarative/particles/spaceexplorer/content/helpers.js b/examples/declarative/particles/spaceexplorer/content/helpers.js deleted file mode 100644 index c38c4c0eed..0000000000 --- a/examples/declarative/particles/spaceexplorer/content/helpers.js +++ /dev/null @@ -1,8 +0,0 @@ -function intersects(item, x, y, e){ - return x+e >= item.x && x-e <= item.x + item.width && y+e >= item.y && y-e <= item.y + item.height; -} - -function direction(x1, y1, x2, y2){ - return Math.atan2(y2-y1, x2-x1) * (180/Math.PI); -} - diff --git a/examples/declarative/particles/spaceexplorer/content/particle4.png b/examples/declarative/particles/spaceexplorer/content/particle4.png deleted file mode 100644 index bc95b703c1da0dffae27cd4a2a35d26ef73decdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1799 zcmaJ?dsIw$9G~4H37Hy_!gZV0qULF4nyb-c?jV}UPEk%HO*6N;YVN(=xufYpHDoK~ zaXKl<#@ZH39)&C$wU*L`l0$^mqT&#?C9muq#Qw4EJ?Gxv@B2HS&*%I6otwKrHD~1T z@xvJm#>k+#u$o>0>pN^H{WYeh_R@<hrHG(H@mMNZOCpQ_JsyJqK?ZFcqDHj(l%xj4 zm%*?B(Xa?ALKzI{a05qc#c<39f@U)qzJ6vxt4lyAAO?v;F&Wr%;uHv=dKnllQu369 z9EnHgrjkf#swzyEnxK>FLBCmmuNk5R3<#wK%!WkF2$^NzdtHd$TaURQ@E$@X$iNRl zMJN{la-2i}5r^lk<B55In9t!0XGkOxFF?TK^SC?#moM<<OCX^D;_-lw4@i3>^|6o| zp8e4mZOOoRiXtE`H#s?(lPu)mWE__-l}fD|0)aP;@HVDkl-BHx89fFRV8o~+QG!Bo z46rI{V{j8C1L;UVq+lRE$zsNjWugnlHERhjpTo1JGyqg8{~u~Fd_o&3HS#&${}eWc zr4R^LjTmtgsiPYg>tS_8Kynh%QaBlg<B0=RTo8{_xG^3l0C}hgP-=B3X0_krl}acG zGg4YihXlbgkXGQJs2&QCC`2$U^x?@xQa)e7lk((ZsYE37fhA&*Tqqgf!nn?4Krm{6 ztN+ZUDT8pWqhKIt&oDxw%Mtx-5;p+vQ-;vNV-XLk_mQg~JQm5ITrM39*V@>BHG1HP zo*wJ=)7a9+r@==sdfG{PtV^of0_fY476b=`nXm8L5{X~-AD#V6zA-_4oz;5D0;6}b z?4tVKo%+I_ZDu5eGQBUcHjB{;ab>gQiav>>Oz1wd$f-waTpk;DRWUtkaiMhLgq+`H z!WZ3@MouK6IR+k@GomieQ)LtUo0oG3=C5HDWM-)PZY_1Ljo`7?Rd0B?a>wXnneC2I znft)q_7B=+=W}v^M-Hi$`2jAyFAai_)sg;>?G6kV54mA^T{iXFo!3sxQMN9Y+hv|U z&Q;9TIq>*A!dSne)y=XdI{Zll@wGWGN2xh9N@EWV>+|Yk`!L@G&gF){f+=K3zyFiD z1lv5-Y$@_y8Bzo`Wld&h*rr)l)VgU}G~I3UikX>iLlSZS{=g@BT_qdCU8|zqgPHse zzZ-WO*A$oM-nX1;&1Ro_r37V`H`3-AKuECt&t?6MWiit{J?yFi(@neTq@{W6oEpok z6^VX#Q_fwRxOvWO*nJ<<^~{85XL1^3zw-e9#l@n(zS?y4%V#N`hU_cAc>n&=2VJ{| zUEJTm6o#7)zd6m;j7jcTxJdP9tW#J^R?^|!x#%M=FxtiCD0x5q%6vruQ5W)1Zrl3D z)@Ns>8PD&&2p)R7pgr$kXqsd4PdjWj?Rh8Q#E*5k&u-tlB|p+qjg39%YFFoXd&u#| zhFsDIb1(RY_5AOdHT`Z9@zQcHmd%Y?Y%*I|RCFlr?D{4(R6c9wjIocpkB#Ar_rI#E z>gq1{6gMXb(c;G<!HE)6y{Vm(Ra%@RobJCR_*B^T7WKPl9S|s}93CYo#G5*6i>}@z zVr;9r?xlIn9wS_sJ!Ws+g_JE%Rc#*IBJIkX>NEP*9&d4}xs?B~;0GN)x6muNP_ydk zrVN&QWq7q9*Ze56=GwW6NtR==ZLKe>9-5<Ostzr&dAe(oZ4a@dsi%7#Lvv|fwcc%^ z;B9*S+L0bRH-;*<5}mep8kRcL6x+JrFf4Y8*zI{)yvlLvcjEQS+?e;GBP%wgm1M-c zPOA;y*~44ZzkRd|b#QxbBI70B`$$8@o@MTbOIn=Cu5lg0O1p92Ub$Pi&A!+7VD{UY zWm!4kf$pOxvu!%tO|s)rtz)r9qe^ido(7-HDqD7e)tj`#0lf{ER;2S9r0e#&4XJD% zu_1QrYL8XaEv^3MuX`NMb9;#Kx4u8(_~ZQi&gN}Pp03Zo-~VdLX@)PO(C#tgIcfbh M1u0Z;MPRh$A2}Ss-2eap diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore.png b/examples/declarative/particles/spaceexplorer/content/powerupScore.png deleted file mode 100644 index e8c368aea745f7035734e6145b7e970945acd3e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83169 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 a+Y!>K7RknWW>f!r$r`FUD&<O6VgCb<kRSB` diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png b/examples/declarative/particles/spaceexplorer/content/powerupScore_gone.png deleted file mode 100644 index 4076327a1aa5ef44bd38a1ac1f78b2fca5738633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^DIm<j1|$m}O$`B3oCO|{#S9F5zCb*O@!q#N;Xpw< yPZ!6KiaBo&8ZrWThZcPG&*j!%0AvyY8kRH8S;D}$taNH0NVTV{pUXO@geCxeb{iuA diff --git a/examples/declarative/particles/spaceexplorer/content/powerupScore_got.png b/examples/declarative/particles/spaceexplorer/content/powerupScore_got.png deleted file mode 100644 index 4297245d49b087348d737b4ce4fb3761a62c2f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81528 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 z	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 diff --git a/examples/declarative/particles/spaceexplorer/content/rocket.png b/examples/declarative/particles/spaceexplorer/content/rocket.png deleted file mode 100644 index a171610b03e3a0e2aaa6e681fc590afce841e929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7315 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 AX8-^I diff --git a/examples/declarative/particles/spaceexplorer/content/rocket2.png b/examples/declarative/particles/spaceexplorer/content/rocket2.png deleted file mode 100644 index 7110f8fdc6b11752b0d7beadcb4a13046003cb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1918 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 Ef;-%<XaE2J diff --git a/examples/declarative/particles/spaceexplorer/content/rocketEye.png b/examples/declarative/particles/spaceexplorer/content/rocketEye.png deleted file mode 100644 index 20005937d2fe79da543a6ebe8353de5facd9ded2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2073 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 S$G>-64?v^rPgWuSi1{z)KKSVX diff --git a/examples/declarative/particles/spaceexplorer/content/star.png b/examples/declarative/particles/spaceexplorer/content/star.png deleted file mode 100644 index 0d592cfa8752ac8a75f92614369011812be88639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1550 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8<fR&VF+bTgE72zA8;GAESs$i;Tpqp%9W}skZsAp(w zVs37(qhMrUXrOOkq;F`XYiMp|Y-D9%pa2C*K--E^(yW49+@N*=dA3R!B_#z``ugSN z<$C4Ddih1^`i7R4mLM~XjC6r2bc-wVN)jt{^NN*WCb*;)Cl_TFlw{`TDS%8&Ov*1U zu~h=P6yk;40=Thx#n4~^2AF<DVu8M)o&m^9FonLp_?717!c`ZS1f?R}i`C%bkjjEo z{h-w1{L-RiV8o><gRCmBaxO|uEXgkl$<NP$g<?QPeo20DMt*^UbFis`Z(?$09*7TC z@9S&jnO9trn3tUD>0+w{G(j&jGsViu#lY3g$;Hsn#lXza(AB`g+{MiW80;?2=H^aD zE=DlDF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2aTIr+HAl zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CH6P#S^9&43O`a}}Ar-f_ zgy;5MHV`<ga<fkNP0$1OZWi$e5_8%ff9Uo;DCrROmOsL7+g-J#t!Wb8`X^>p<(R*9 ztIE23WZv_c-;e1T78`z0dT;&s--DB{7!M|$H(fbdV1aO|M#WTq5u0i`ZD!Gk;<Q~~ zy__GPW3hIeeyZX3+ldLQnkG0+EW97De9+QE#rVOE|Hl~21GCr6={d8Z{5;1yvCV>i zF6OQ5waWeYQ$jM+c6FfAU%QE&32G6^fwS(^GcDwlz3o=O=xf3$wCkU6%0^a3xunCo zO!kbOp$@_e-Ar2hq*&Cw=cFDnvyFK*t;t(Jv1j#$207JvJ45Y{?odlTYjt_QpMyPX zxWH9ejvv!EUyt~}^WKbe?F`8cYn}#GYF98Su?VHlIL`Ual<9u@m!3CaF{_I1aNJv< za^E3|C+T_<>#;YQc3W;(9rDxOyMA}@*YtzY=Wn0Wl%M#^?uVb?0%tD)<q*XU${+nc z$Q_DSSiCWAqj`Ph0l9OH@1@sgiZVYlj5c&-dw=0>9H$+}KdyP)&zjyh`u4QXV=qa6 zE$~O^p#8#UdpY8pPK56{y>aStqX3DuWnA2Kf`2|7yMM4Myx`Q@jdR~mRG7ngQXuAK zW-8n2yUqnuzt0I({>2(J*S*F0=}Kc3=Nl2vJbng6cH1yT-zehC)d>yQ=5=7A@g0`f zyvDN~SC%Yc+H&C(tH+uoC!f>=p8oZFdYAg#n0#@Yb<f?#5OJw+_c!KFcYpug6Q7%& zbNp9v?}O(OoB5_LGRv}Sdvsl^V&SE8ZFzs(uI^s`!DzD1L5`*@-lm*6%+9tc%?pe( zl7u%cEDf-Hx^a(_r$zgLmH%h({7XN=FKN?$V57>U<k!mTi;_G42`4a=UU<;6N?oZM PR6={Y`njxgN@xNA$LK`L diff --git a/examples/declarative/particles/spaceexplorer/spaceexplorer.qml b/examples/declarative/particles/spaceexplorer/spaceexplorer.qml deleted file mode 100644 index cb8acb815e..0000000000 --- a/examples/declarative/particles/spaceexplorer/spaceexplorer.qml +++ /dev/null @@ -1,417 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 2.0 -import QtQuick.Particles 2.0 -import "content/helpers.js" as Helpers - -Rectangle{ - id: root - width: 360 - height: 540 - color: "black" - Image{ - anchors.centerIn: parent - source: "../asteroid/content/finalfrontier.png" - } - property bool spacePressed: false - property int holeSize: 4 - focus: true - Keys.onPressed: { - if (event.key == Qt.Key_Space) { - spacePressed = true; - event.accepted = true; - } - } - Keys.onReleased: { - if (event.key == Qt.Key_Space) { - spacePressed = false; - event.accepted = true; - } - } - - function fakeMove(){ - fakeMoving = rocket.x < 80 || rocket.x+rocket.width-root.width > -80 || rocket.y < 80 || rocket.y+rocket.height-root.height > -80; - if(fakeMoving) - fakeMovementDir = Helpers.direction(root.width/2, root.height/2, rocket.x, rocket.y) + 180; - } - property bool fakeMoving: false - property real fakeMovementDir: 0 - - Emitter{ - particle: "stars2" - system: background - emitRate: 60 - lifeSpan: 4000 - emitting: true - size: 10 - sizeVariation: 10 - anchors.fill: parent - } - ParticleSystem{ id: background } - ImageParticle{ - particles: ["stars2"] - system: background - anchors.fill: parent - source: "content/star.png" - color: "white" - colorVariation: 0.1 - } - Gravity{ - system: background - anchors.fill: parent - acceleration: fakeMoving?10:0 - angle: fakeMovementDir - } - Text{ - color: "white" - anchors.bottom: parent.bottom - anchors.right: parent.right - text:"Drag the ship, but don't hit a black hole!" - font.pixelSize: 10 - } - Text{ - color: "white" - font.pixelSize: 36 - anchors.centerIn: parent - text: "GAME OVER" - opacity: gameOver ? 1 : 0 - Behavior on opacity{NumberAnimation{}} - } - Text{ - color: "white" - font.pixelSize: 18 - anchors.left: parent.left - anchors.bottom: parent.bottom - anchors.margins: 8 - text: "Score: " + score - } - Image{ - source: "content/star.png" - width: 40 - height: 40 - anchors.right: parent.right - anchors.top: parent.top - MouseArea{ - anchors.fill: parent - anchors.margins: -20 - onClicked: shoot = !shoot - } - } - property int score: 0 - property bool gameOver: false - property bool shoot: true - property int maxLives: 3 - property int lives: maxLives - property bool alive: !Helpers.intersects(rocket, gs1.x, gs1.y, holeSize) && !Helpers.intersects(rocket, gs2.x, gs2.y, holeSize) && !Helpers.intersects(rocket, gs3.x, gs3.y, holeSize) && !Helpers.intersects(rocket, gs4.x, gs4.y, holeSize); - onAliveChanged: if(!alive){ - lives -= 1; - if(lives == -1){ - console.log("game over"); - gameOver = true; - } - } - Row{ - Repeater{ - model: maxLives - delegate: Image{ - opacity: index < lives ? 1 : 0 - Behavior on opacity{NumberAnimation{}} - source: "content/rocket.png" - } - } - } - - property real courseDur: 10000 - property real vorteX: width/4 - property real vorteY: height/4 - Behavior on vorteX{NumberAnimation{duration: courseDur}} - Behavior on vorteY{NumberAnimation{duration: courseDur}} - property real vorteX2: width/4 - property real vorteY2: 3*height/4 - Behavior on vorteX2{NumberAnimation{duration: courseDur}} - Behavior on vorteY2{NumberAnimation{duration: courseDur}} - property real vorteX3: 3*width/4 - property real vorteY3: height/4 - Behavior on vorteX3{NumberAnimation{duration: courseDur}} - Behavior on vorteY3{NumberAnimation{duration: courseDur}} - property real vorteX4: 3*width/4 - property real vorteY4: 3*height/4 - Behavior on vorteX4{NumberAnimation{duration: courseDur}} - Behavior on vorteY4{NumberAnimation{duration: courseDur}} - Timer{ - id: vorTimer - interval: courseDur - running: true - repeat: true - triggeredOnStart: true - onTriggered: { - vorteX = Math.random() * width * 2 - width * 0.5; - vorteY = Math.random() * height * 2 - height * 0.5; - vorteX2 = Math.random() * width * 2 - width * 0.5; - vorteY2 = Math.random() * height * 2 - height * 0.5; - vorteX3 = Math.random() * width * 2 - width * 0.5; - vorteY3 = Math.random() * height * 2 - height * 0.5; - vorteX4 = Math.random() * width * 2 - width * 0.5; - vorteY4 = Math.random() * height * 2 - height * 0.5; - } - } - - - - ParticleSystem{ id: foreground } - ImageParticle{ - particles: ["stars"] - anchors.fill: parent - system: foreground - source: "content/star.png" - color: "white" - colorVariation: 0.1 - } - ImageParticle{ - particles: ["shot"] - anchors.fill: parent - system: foreground - source: "content/star.png" - - color: "orange" - colorVariation: 0.3 - } - ImageParticle{ - id: engine - particles: ["engine"] - anchors.fill: parent - system: foreground - source: "content/particle4.png" - - color: "orange" - SequentialAnimation on color { - loops: Animation.Infinite - ColorAnimation { - from: "red" - to: "cyan" - duration: 1000 - } - ColorAnimation { - from: "cyan" - to: "red" - duration: 1000 - } - } - - colorVariation: 0.2 - } - ImageParticle{ - particles: ["powerups"] - anchors.fill: parent - system: foreground - sprites:[Sprite{ - name: "norm" - source: "content/powerupScore.png" - frames: 35 - duration: 40 - to: {"norm":1, "got":0} - }, - Sprite{ - name: "got" - source: "content/powerupScore_got.png" - frames: 22 - duration: 40 - to: {"null":1} - }, - Sprite{ - name: "null" - source: "content/powerupScore_gone.png" - frames: 1 - duration: 1000 - } - ] - } - SpriteGoal{ - x: rocket.x - 30 - y: rocket.y - 30 - width: 60 - height: 60 - goalState: "got" - jump: true - onAffected: if(!gameOver) score += 1000 - system: foreground - } - PointAttractor{ - proportionalToDistance: PointAttractor.InverseQuadratic; - id: gs1; pointX: vorteX; pointY: vorteY; strength: 800000; - system: foreground - } - Kill{ - x: gs1.pointX - holeSize; - y: gs1.pointY - holeSize; - width: holeSize * 2 - height: holeSize * 2 - system: foreground - } - - PointAttractor{ - proportionalToDistance: PointAttractor.InverseQuadratic; - id: gs2; pointX: vorteX2; pointY: vorteY2; strength: 800000; - system: foreground - } - Kill{ - x: gs2.pointX - holeSize; - y: gs2.pointY - holeSize; - width: holeSize * 2 - height: holeSize * 2 - system: foreground - } - - PointAttractor{ - proportionalToDistance: PointAttractor.InverseQuadratic; - id: gs3; pointX: vorteX3; pointY: vorteY3; strength: 800000; - system: foreground - } - Kill{ - x: gs3.pointX - holeSize; - y: gs3.pointY - holeSize; - width: holeSize * 2 - height: holeSize * 2 - system: foreground - } - PointAttractor{ - id: gs4; pointX: vorteX4; pointY: vorteY4; strength: 800000; - proportionalToDistance: PointAttractor.InverseQuadratic; - system: foreground - } - Kill{ - x: gs4.pointX - holeSize; - y: gs4.pointY - holeSize; - width: holeSize * 2 - height: holeSize * 2 - system: foreground - } - Emitter{ - particle: "powerups" - system: foreground - emitRate: 1 - lifeSpan: 6000 - emitting: !gameOver - size: 60 - sizeVariation: 10 - anchors.fill: parent - } - Emitter{ - particle: "stars" - system: foreground - emitRate: 40 - lifeSpan: 4000 - emitting: !gameOver - size: 30 - sizeVariation: 10 - anchors.fill: parent - } - SpriteImage{ - id: rocket - //Sprites or children for default? - Sprite{ - name: "normal" - source: "content/rocket2.png" - frames: 1 - duration: 1000 - to: {"normal": 0.9, "winking" : 0.1} - } - Sprite{ - name: "winking" - source: "content/rocketEye.png" - frames: 10 - duration: 40 - to: {"normal" : 1} - } - x: root.width/2 - y: root.height/2 - property int lx: 0 - property int ly: 0 - property int lastX: 0 - property int lastY: 0 - width: 45 - height: 22 - onXChanged:{ lastX = lx; lx = x; fakeMove()} - onYChanged:{ lastY = ly; ly = y; fakeMove()} - rotation: Helpers.direction(lastX, lastY, x, y) - data:[ - MouseArea{ - id: ma - anchors.fill: parent; - drag.axis: Drag.XandYAxis - drag.target: rocket - }, - Emitter{ - system: foreground - particle: "engine" - emitRate: 100 - lifeSpan: 1000 - emitting: !gameOver - size: 10 - endSize: 4 - sizeVariation: 4 - speed: PointDirection{ - x: -128 * Math.cos(rocket.rotation * (Math.PI / 180)) - y: -128 * Math.sin(rocket.rotation * (Math.PI / 180)) - } - anchors.verticalCenter: parent.verticalCenter - height: 4 - width: 4 - - }, - Emitter{ - system: foreground - particle: "shot" - emitRate: 16 - lifeSpan: 1600 - emitting: !gameOver && shoot - size: 40 - speed: PointDirection{ - x: 256 * Math.cos(rocket.rotation * (Math.PI / 180)) - y: 256 * Math.sin(rocket.rotation * (Math.PI / 180)) - } - x: parent.width - 4 - y: parent.height/2 - } - ] - } -} - diff --git a/examples/declarative/particles/trails/combustion.qml b/examples/declarative/particles/trails/combustion.qml index f244300524..e4a21e9beb 100644 --- a/examples/declarative/particles/trails/combustion.qml +++ b/examples/declarative/particles/trails/combustion.qml @@ -70,7 +70,7 @@ Rectangle { color: "#2060160f" } SpriteGoal{ - collisionParticles: ["lit"] + whenCollidingWith: ["lit"] goalState: "lighting" jump: true systemStates: true @@ -85,7 +85,7 @@ Rectangle { name: "lit" duration: 10000 onEntered: score++; - FollowEmitter{ + TrailEmitter{ id: fireballFlame particle: "flame" @@ -99,7 +99,7 @@ Rectangle { endSize: 4 } - FollowEmitter{ + TrailEmitter{ id: fireballSmoke particle: "smoke" @@ -185,7 +185,7 @@ Rectangle { goalState: "lighting" jump: true systemStates: true - active: ma.pressed + enabled: ma.pressed width: 18 height: 18 x: ma.mouseX - width/2 diff --git a/examples/declarative/particles/trails/dynamicemitters.qml b/examples/declarative/particles/trails/dynamicemitters.qml index dbf3f8fa82..dac5d93035 100644 --- a/examples/declarative/particles/trails/dynamicemitters.qml +++ b/examples/declarative/particles/trails/dynamicemitters.qml @@ -63,12 +63,11 @@ Rectangle{ Emitter{ id: emitMore system: sys - emitting: true emitRate: 128 lifeSpan: 600 size: 16 endSize: 8 - speed: AngledDirection{angleVariation:360; magnitude: 60} + speed: AngleDirection{angleVariation:360; magnitude: 60} } property int life: 2600 @@ -77,10 +76,9 @@ Rectangle{ function go(){ xAnim.start(); yAnim.start(); - container.emitting = true + container.enabled = true } system: sys - emitting: true emitRate: 32 lifeSpan: 600 size: 24 diff --git a/examples/declarative/particles/trails/fireballs.qml b/examples/declarative/particles/trails/fireballs.qml index 4cc2eacc25..97a0c0ac5f 100644 --- a/examples/declarative/particles/trails/fireballs.qml +++ b/examples/declarative/particles/trails/fireballs.qml @@ -98,7 +98,7 @@ Rectangle { sizeVariation: 8 endSize: 4 } - FollowEmitter{ + TrailEmitter{ id: fireSmoke particle: "B" system: particles @@ -116,7 +116,7 @@ Rectangle { sizeVariation: 8 endSize: 16 } - FollowEmitter{ + TrailEmitter{ id: fireballFlame anchors.fill: parent system: particles @@ -133,7 +133,7 @@ Rectangle { endSize: 4 } - FollowEmitter{ + TrailEmitter{ id: fireballSmoke anchors.fill: parent system: particles diff --git a/examples/declarative/particles/trails/fireworks.qml b/examples/declarative/particles/trails/fireworks.qml index a84f5d8b3c..437d9ee3d6 100644 --- a/examples/declarative/particles/trails/fireworks.qml +++ b/examples/declarative/particles/trails/fireworks.qml @@ -59,13 +59,13 @@ Rectangle{ name: "splode" duration: 400 to: {"dead":1} - FollowEmitter{ + TrailEmitter{ particle: "works" emitRatePerParticle: 100 lifeSpan: 1000 - emitCap: 1200 + maximumEmitted: 1200 size: 8 - speed: AngledDirection{angle: 270; angleVariation: 45; magnitude: 20; magnitudeVariation: 20;} + speed: AngleDirection{angle: 270; angleVariation: 45; magnitude: 20; magnitudeVariation: 20;} acceleration: PointDirection{y:100; yVariation: 20} } }, @@ -73,8 +73,7 @@ Rectangle{ name: "dead" duration: 1000 Affector{ - onceOff: true - signal: true + once: true onAffected: worksEmitter.burst(400,x,y) } } @@ -91,7 +90,7 @@ Rectangle{ particle: "fire" width: parent.width y: parent.height - emitting: false + enabled: false emitRate: 80 lifeSpan: 6000 speed: PointDirection{y:-100;} @@ -100,14 +99,14 @@ Rectangle{ Emitter{ id: worksEmitter particle: "works" - emitting: false + enabled: false emitRate: 100 lifeSpan: 1600 - emitCap: 6400 + maximumEmitted: 6400 size: 8 speed: CumulativeDirection{ PointDirection{y:-100} - AngledDirection{angleVariation: 360; magnitudeVariation: 80;} + AngleDirection{angleVariation: 360; magnitudeVariation: 80;} } acceleration: PointDirection{y:100; yVariation: 20} } diff --git a/examples/declarative/particles/trails/layered.qml b/examples/declarative/particles/trails/layered.qml index d4a823b556..9af5f0bd64 100644 --- a/examples/declarative/particles/trails/layered.qml +++ b/examples/declarative/particles/trails/layered.qml @@ -53,7 +53,6 @@ Rectangle{ } ParticleSystem{ id: sys - startTime: 4000 } Emitter{ system: sys @@ -61,6 +60,7 @@ Rectangle{ width: root.width emitRate: 200 lifeSpan: 4000 + startTime: 4000 speed: PointDirection{ y: -120; } } ImageParticle{ diff --git a/examples/declarative/particles/trails/list.qml b/examples/declarative/particles/trails/list.qml index 7e8fb44003..b64e49456b 100644 --- a/examples/declarative/particles/trails/list.qml +++ b/examples/declarative/particles/trails/list.qml @@ -57,6 +57,7 @@ Rectangle { source: "content/star.png" color: "white" colorVariation: 0.0 + rotationSpeed: 360 } // Define a delegate component. A component will be @@ -95,11 +96,12 @@ Rectangle { Emitter{ anchors.fill: parent system: particles; - emitting: anim.running + enabled: anim.running emitRate: 600 lifeSpan: 600 size: 16 endSize: 8 + sizeVariation: 8 } } } diff --git a/examples/declarative/particles/trails/overburst.qml b/examples/declarative/particles/trails/overburst.qml index 620ae46088..baf1bf3046 100644 --- a/examples/declarative/particles/trails/overburst.qml +++ b/examples/declarative/particles/trails/overburst.qml @@ -47,7 +47,7 @@ Rectangle{ height: 540 ParticleSystem{ id: sys - onClearChanged: if (clear) sys.pause(); + onEmptyChanged: if (empty) sys.pause(); } ImageParticle{ system: sys @@ -60,12 +60,12 @@ Rectangle{ //burst on click id: bursty system: sys - emitting: ma.pressed + enabled: ma.pressed x: ma.mouseX y: ma.mouseY emitRate: 16000 - emitCap: 4000 - acceleration: AngledDirection{angleVariation: 360; magnitude: 360; } + maximumEmitted: 4000 + acceleration: AngleDirection{angleVariation: 360; magnitude: 360; } size: 8 endSize: 16 sizeVariation: 4 @@ -78,7 +78,7 @@ Rectangle{ MouseArea{ width: 100 height: 100 - onClicked: bursty.noCap = true; + onClicked: bursty.maximumEmitted = -1; id: ma2 Rectangle{ anchors.fill: parent diff --git a/examples/declarative/particles/trails/portal.qml b/examples/declarative/particles/trails/portal.qml index 8cf323b0f5..85efd9a594 100644 --- a/examples/declarative/particles/trails/portal.qml +++ b/examples/declarative/particles/trails/portal.qml @@ -52,7 +52,6 @@ Rectangle{ } ParticleSystem{ id: particles - startTime: 2000 } ImageParticle{ particles: ["center","edge"] @@ -68,12 +67,11 @@ Rectangle{ system: particles emitRate: 200 lifeSpan: 2000 - emitting: true size: 20 sizeVariation: 2 endSize: 0 shape: EllipseShape{fill: false} - speed: TargetedDirection{ + speed: TargetDirection{ targetX: root.width/2 targetY: root.height/2 proportionalMagnitude: true @@ -83,22 +81,22 @@ Rectangle{ Emitter{ anchors.fill: parent particle: "edge" + startTime: 2000 system: particles emitRate: 4000 lifeSpan: 2000 - emitting: true size: 20 sizeVariation: 2 endSize: 0 shape: EllipseShape{fill: false} - speed: TargetedDirection{ + speed: TargetDirection{ targetX: root.width/2 targetY: root.height/2 proportionalMagnitude: true magnitude: 0.1 magnitudeVariation: 0.1 } - acceleration: TargetedDirection{ + acceleration: TargetDirection{ targetX: root.width/2 targetY: root.height/2 targetVariation: 200 diff --git a/examples/declarative/particles/trails/shimmer.qml b/examples/declarative/particles/trails/shimmer.qml index d195a4477b..90b47bc6b7 100644 --- a/examples/declarative/particles/trails/shimmer.qml +++ b/examples/declarative/particles/trails/shimmer.qml @@ -72,7 +72,6 @@ Rectangle{ system: particles emitRate: 2000 lifeSpan: 2000 - emitting: true size: 30 sizeVariation: 10 } diff --git a/examples/declarative/particles/trails/trails.qml b/examples/declarative/particles/trails/trails.qml index 689de4eb41..1b6f9e00c7 100644 --- a/examples/declarative/particles/trails/trails.qml +++ b/examples/declarative/particles/trails/trails.qml @@ -57,10 +57,10 @@ Rectangle{ //burst on click id: bursty system: sys - emitting: false + enabled: false emitRate: 2000 lifeSpan: 500 - acceleration: AngledDirection{ angle: 90; angleVariation: 360; magnitude: 640; } + acceleration: AngleDirection{ angle: 90; angleVariation: 360; magnitude: 640; } size: 8 endSize: 16 sizeVariation: 4 @@ -68,12 +68,12 @@ Rectangle{ Emitter{ system: sys speedFromMovement: 4.0 - emitting: ma.pressed + enabled: ma.pressed x: ma.mouseX y: ma.mouseY emitRate: 400 lifeSpan: 2000 - acceleration: AngledDirection{ angle: 90; angleVariation: 22; magnitude: 32; } + acceleration: AngleDirection{ angle: 90; angleVariation: 22; magnitude: 32; } size: 8 endSize: 16 sizeVariation: 8 diff --git a/examples/declarative/particles/trails/turbulence.qml b/examples/declarative/particles/trails/turbulence.qml index 3f822c7889..62216c3460 100644 --- a/examples/declarative/particles/trails/turbulence.qml +++ b/examples/declarative/particles/trails/turbulence.qml @@ -91,9 +91,9 @@ Rectangle{ endSize: 10 sizeVariation: 10 acceleration: PointDirection{ y: -40 } - speed: AngledDirection{ angle: 270; magnitude: 20; angleVariation: 22; magnitudeVariation: 5 } + speed: AngleDirection{ angle: 270; magnitude: 20; angleVariation: 22; magnitudeVariation: 5 } } - FollowEmitter{ + TrailEmitter{ id: smoke1 width: root.width height: 258 @@ -108,9 +108,9 @@ Rectangle{ endSize: 8 sizeVariation: 8 acceleration: PointDirection{ y: -40 } - speed: AngledDirection{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 } + speed: AngleDirection{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 } } - FollowEmitter{ + TrailEmitter{ id: smoke2 width: root.width height: 232 @@ -124,6 +124,6 @@ Rectangle{ endSize: 24 sizeVariation: 8 acceleration: PointDirection{ y: -40 } - speed: AngledDirection{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 } + speed: AngleDirection{ angle: 270; magnitude: 40; angleVariation: 22; magnitudeVariation: 5 } } } diff --git a/examples/declarative/plasmapatrol/content/BlasterHardpoint.qml b/examples/declarative/plasmapatrol/content/BlasterHardpoint.qml index 87c1822c05..384275fc94 100644 --- a/examples/declarative/plasmapatrol/content/BlasterHardpoint.qml +++ b/examples/declarative/plasmapatrol/content/BlasterHardpoint.qml @@ -57,10 +57,10 @@ Item { id: visualization particle: "blaster" system: container.system - emitting: show + enabled: show anchors.fill: parent shape: EllipseShape{} - speed: TargetedDirection{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true} + speed: TargetDirection{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true} lifeSpan: 1000 emitRate: 64 @@ -115,17 +115,17 @@ Item { Emitter{ id: emitter particle: "blaster" - emitting: false + enabled: false system: container.system anchors.centerIn: parent lifeSpan: 1000 emitRate: 16 - emitCap: blasts + maximumEmitted: blasts size: 24 endSize:16 sizeVariation: 8 - speed: TargetedDirection{ + speed: TargetDirection{ id: blastVector targetX: target.x; targetY: target.y; magnitude: 1.1; proportionalMagnitude: true } diff --git a/examples/declarative/plasmapatrol/content/CannonHardpoint.qml b/examples/declarative/plasmapatrol/content/CannonHardpoint.qml index e0c23c1d63..b2c7aca1fd 100644 --- a/examples/declarative/plasmapatrol/content/CannonHardpoint.qml +++ b/examples/declarative/plasmapatrol/content/CannonHardpoint.qml @@ -52,7 +52,7 @@ Item { Emitter{ id: visualization particle: "cannon" - emitting: container.show + enabled: container.show system: container.system anchors.centerIn: parent lifeSpan: 2000 @@ -81,7 +81,7 @@ Item { Emitter{ id: emitter particle: "cannon" - emitting: false + enabled: false system: container.system anchors.centerIn: parent @@ -89,7 +89,7 @@ Item { emitRate: 1 size: 8 endSize: 4 - speed: TargetedDirection{ + speed: TargetDirection{ id: blastVector targetX: target.x; targetY: target.y; magnitude: 1.1; proportionalMagnitude: true } diff --git a/examples/declarative/plasmapatrol/content/Cruiser.qml b/examples/declarative/plasmapatrol/content/Cruiser.qml index 4f600b961f..b0d20023db 100644 --- a/examples/declarative/plasmapatrol/content/Cruiser.qml +++ b/examples/declarative/plasmapatrol/content/Cruiser.qml @@ -66,20 +66,20 @@ Item { emitRate: hp > 0 ? hp * 1 + 20 : 0 lifeSpan: 2400 - emitCap: (maxHP * 1 + 20)*2.4 + maximumEmitted: (maxHP * 1 + 20)*2.4 size: 48 sizeVariation: 16 endSize: 16 - speed: AngledDirection{angleVariation:360; magnitudeVariation: 32} + speed: AngleDirection{angleVariation:360; magnitudeVariation: 32} } Emitter{ system: container.system particle: "cruiserArmor" anchors.fill: parent shape: EllipseShape{ fill: false } - emitting: hp>0 + enabled: hp>0 emitRate: 16 lifeSpan: 2000 @@ -90,12 +90,12 @@ Item { SpriteGoal{ id: destructor system: container.system - active: container.hp <=0 + enabled: container.hp <=0 anchors.fill: parent particles: ["cruiserArmor"] goalState: "death" // jump: true - onceOff: true + once: true } } diff --git a/examples/declarative/plasmapatrol/content/Frigate.qml b/examples/declarative/plasmapatrol/content/Frigate.qml index 5c61177f66..8d493b81d5 100644 --- a/examples/declarative/plasmapatrol/content/Frigate.qml +++ b/examples/declarative/plasmapatrol/content/Frigate.qml @@ -61,7 +61,7 @@ Item { size: 92 emitRate: 1 lifeSpan: 4800 - emitting: hp > 0 + enabled: hp > 0 } Emitter{ system: container.system @@ -76,7 +76,7 @@ Item { endSize: 8 emitRate: hp > 0 ? hp * 1 + 20 : 0 lifeSpan: 1200 - emitCap: (maxHP * 1 + 20)*2 + maximumEmitted: (maxHP * 1 + 20)*2 } Timer{ id: fireControl diff --git a/examples/declarative/plasmapatrol/content/LaserHardpoint.qml b/examples/declarative/plasmapatrol/content/LaserHardpoint.qml index ffc4be7acb..45712bf68a 100644 --- a/examples/declarative/plasmapatrol/content/LaserHardpoint.qml +++ b/examples/declarative/plasmapatrol/content/LaserHardpoint.qml @@ -54,9 +54,9 @@ Item { particle: "laser" system: container.system anchors.fill: parent - emitting: container.show + enabled: container.show shape: EllipseShape{} - speed: TargetedDirection{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true } + speed: TargetDirection{ targetX: width/2; targetY: width/2; magnitude: -1; proportionalMagnitude: true } lifeSpan: 1000 emitRate: 64 @@ -87,7 +87,7 @@ Item { Emitter{ id: emitter particle: "laser" - emitting: false + enabled: false system: container.system x: Math.min(container.width/2, target.x); width: Math.max(container.width/2, target.x) - x; @@ -99,7 +99,7 @@ Item { lifeSpan: 1000 emitRate: 8000 - emitCap: 800 + maximumEmitted: 800 size: 16 endSize: 0 diff --git a/examples/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml b/examples/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml index 1ce1d065a5..792ba7ab72 100644 --- a/examples/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml +++ b/examples/declarative/plasmapatrol/content/PlasmaPatrolParticles.qml @@ -144,21 +144,21 @@ Item{ } ] } - FollowEmitter{ + TrailEmitter{ system: sys particle: "cannonWake" follow: "cannon" emitRatePerParticle: 64 lifeSpan: 600 - speed: AngledDirection{ angleVariation: 360; magnitude: 48} + speed: AngleDirection{ angleVariation: 360; magnitude: 48} size: 16 endSize: 8 sizeVariation: 2 - emitting: true + enabled: true width: 1000//XXX: Terrible hack height: 1000 } - FollowEmitter{ + TrailEmitter{ system: sys particle: "cannonCore" follow: "cannon" @@ -166,7 +166,7 @@ Item{ lifeSpan: 128 size: 24 endSize: 8 - emitting: true + enabled: true width: 1000//XXX: Terrible hack height: 1000 } diff --git a/examples/declarative/plasmapatrol/content/Sloop.qml b/examples/declarative/plasmapatrol/content/Sloop.qml index cfb5798ec6..82e57f5161 100644 --- a/examples/declarative/plasmapatrol/content/Sloop.qml +++ b/examples/declarative/plasmapatrol/content/Sloop.qml @@ -65,9 +65,9 @@ Item { emitRate: hp > 0 ? hp + 20 : 0 lifeSpan: blinkInterval - emitCap: (maxHP + 20) + maximumEmitted: (maxHP + 20) - acceleration: AngledDirection{angleVariation: 360; magnitude: 8} + acceleration: AngleDirection{angleVariation: 360; magnitude: 8} size: 24 endSize: 4 diff --git a/examples/declarative/plasmapatrol/plasmapatrol.qml b/examples/declarative/plasmapatrol/plasmapatrol.qml index be6d15ec13..4ea464b9f8 100644 --- a/examples/declarative/plasmapatrol/plasmapatrol.qml +++ b/examples/declarative/plasmapatrol/plasmapatrol.qml @@ -96,7 +96,7 @@ Rectangle { Emitter{ anchors.fill: parent system: particles - emitting: true + enabled: true particle: "default" emitRate: 1200 lifeSpan: 1200 @@ -104,7 +104,7 @@ Rectangle { size: 16 endSize: 0 sizeVariation: 8 - speed: AngledDirection{angleVariation:360; magnitudeVariation: 6} + speed: AngleDirection{angleVariation:360; magnitudeVariation: 6} } } Button{ diff --git a/examples/declarative/samegame/SamegameCore/BoomBlock.qml b/examples/declarative/samegame/SamegameCore/BoomBlock.qml index 4f8ef70851..1c84fa8614 100644 --- a/examples/declarative/samegame/SamegameCore/BoomBlock.qml +++ b/examples/declarative/samegame/SamegameCore/BoomBlock.qml @@ -86,12 +86,12 @@ Item { } anchors.fill: parent - speed: TargetedDirection{targetX: block.width/2; targetY: block.height/2; magnitude: -60; magnitudeVariation: 60} + speed: TargetDirection{targetX: block.width/2; targetY: block.height/2; magnitude: -60; magnitudeVariation: 60} shape: EllipseShape{fill:true} - emitting: false; + enabled: false; lifeSpan: 700; lifeSpanVariation: 100 emitRate: 1000 - emitCap: 100 //only fires 0.1s bursts (still 2x old number, ImageParticle wants less than 16000 max though) + maximumEmitted: 100 //only fires 0.1s bursts (still 2x old number) size: 28 endSize: 14 } diff --git a/src/declarative/particles/particles.pri b/src/declarative/particles/particles.pri index 9f63cd81b9..527bd9ae61 100644 --- a/src/declarative/particles/particles.pri +++ b/src/declarative/particles/particles.pri @@ -1,18 +1,18 @@ INCLUDEPATH += $$PWD HEADERS += \ - $$PWD/qsgangleddirection_p.h \ + $$PWD/qsgangledirection_p.h \ $$PWD/qsgcustomparticle_p.h \ + $$PWD/qsgcustomaffector_p.h \ $$PWD/qsgellipseextruder_p.h \ - $$PWD/qsgfollowemitter_p.h \ + $$PWD/qsgtrailemitter_p.h \ $$PWD/qsgfriction_p.h \ $$PWD/qsggravity_p.h \ $$PWD/qsgimageparticle_p.h \ $$PWD/qsgitemparticle_p.h \ - $$PWD/qsgkill_p.h \ + $$PWD/qsgage_p.h \ $$PWD/qsglineextruder_p.h \ $$PWD/qsgmaskextruder_p.h \ - $$PWD/qsgmodelparticle_p.h \ $$PWD/qsgparticleaffector_p.h \ $$PWD/qsgparticleemitter_p.h \ $$PWD/qsgparticleextruder_p.h \ @@ -22,27 +22,28 @@ HEADERS += \ $$PWD/qsgpointattractor_p.h \ $$PWD/qsgpointdirection_p.h \ $$PWD/qsgspritegoal_p.h \ - $$PWD/qsgstochasticdirection_p.h \ - $$PWD/qsgtargeteddirection_p.h \ + $$PWD/qsgdirection_p.h \ + $$PWD/qsgtargetdirection_p.h \ $$PWD/qsgturbulence_p.h \ $$PWD/qsgwander_p.h \ $$PWD/qsgtargetaffector_p.h \ $$PWD/qsgcumulativedirection_p.h \ - $$PWD/qsgv8particledata_p.h + $$PWD/qsgv8particledata_p.h \ + $$PWD/qsgrectangleextruder_p.h SOURCES += \ - $$PWD/qsgangleddirection.cpp \ + $$PWD/qsgangledirection.cpp \ $$PWD/qsgcustomparticle.cpp \ + $$PWD/qsgcustomaffector.cpp \ $$PWD/qsgellipseextruder.cpp \ - $$PWD/qsgfollowemitter.cpp \ + $$PWD/qsgtrailemitter.cpp \ $$PWD/qsgfriction.cpp \ $$PWD/qsggravity.cpp \ $$PWD/qsgimageparticle.cpp \ $$PWD/qsgitemparticle.cpp \ - $$PWD/qsgkill.cpp \ + $$PWD/qsgage.cpp \ $$PWD/qsglineextruder.cpp \ $$PWD/qsgmaskextruder.cpp \ - $$PWD/qsgmodelparticle.cpp \ $$PWD/qsgparticleaffector.cpp \ $$PWD/qsgparticleemitter.cpp \ $$PWD/qsgparticleextruder.cpp \ @@ -52,13 +53,14 @@ SOURCES += \ $$PWD/qsgpointattractor.cpp \ $$PWD/qsgpointdirection.cpp \ $$PWD/qsgspritegoal.cpp \ - $$PWD/qsgstochasticdirection.cpp \ - $$PWD/qsgtargeteddirection.cpp \ + $$PWD/qsgdirection.cpp \ + $$PWD/qsgtargetdirection.cpp \ $$PWD/qsgturbulence.cpp \ $$PWD/qsgwander.cpp \ $$PWD/qsgtargetaffector.cpp \ $$PWD/qsgcumulativedirection.cpp \ - $$PWD/qsgv8particledata.cpp + $$PWD/qsgv8particledata.cpp \ + $$PWD/qsgrectangleextruder.cpp RESOURCES += \ $$PWD/particles.qrc diff --git a/src/declarative/particles/qsgage.cpp b/src/declarative/particles/qsgage.cpp new file mode 100644 index 0000000000..2c0678fd0e --- /dev/null +++ b/src/declarative/particles/qsgage.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Declarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsgage_p.h" +#include "qsgparticleemitter_p.h" +QT_BEGIN_NAMESPACE +/*! + \qmlclass Age QSGAgeAffector + \inqmlmodule QtQuick.Particles 2 + \inherits Affector + \brief The Age affector allows you to prematurely age particles + + The Age affector allows you to alter where the particle is in its lifecycle. Common uses + are to expire particles prematurely, possibly giving them time to animate out. + + The Age affector only applies to particles which are still alive. +*/ +/*! + \qmlproperty int QtQuick.Particles2::Age::lifeLeft + + The amount of life to set the particle to have. Affected particles + will jump to a point in their life where they will have this many + milliseconds left to live. +*/ + +QSGAgeAffector::QSGAgeAffector(QSGItem *parent) : + QSGParticleAffector(parent), m_lifeLeft(0) +{ +} + + +bool QSGAgeAffector::affectParticle(QSGParticleData *d, qreal dt) +{ + Q_UNUSED(dt); + if (d->stillAlive()){ + qreal curT = (qreal)m_system->m_timeInt/1000.0; + qreal ttl = (qreal)m_lifeLeft/1000.0; + d->t = curT - (d->lifeSpan - ttl) + 1; + return true; + } + return false; +} +QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgkill.cpp b/src/declarative/particles/qsgage_p.h similarity index 70% rename from src/declarative/particles/qsgkill.cpp rename to src/declarative/particles/qsgage_p.h index dfd26e3f39..c4c9929ad8 100644 --- a/src/declarative/particles/qsgkill.cpp +++ b/src/declarative/particles/qsgage_p.h @@ -39,30 +39,49 @@ ** ****************************************************************************/ -#include "qsgkill_p.h" -#include "qsgparticleemitter_p.h" +#ifndef KILLAFFECTOR_H +#define KILLAFFECTOR_H +#include "qsgparticleaffector_p.h" + +QT_BEGIN_HEADER + QT_BEGIN_NAMESPACE -/*! - \qmlclass Kill QSGKillAffector - \inqmlmodule QtQuick.Particles 2 - \inherits Affector - \brief The Kill affector allows you to expire affected particles -*/ +QT_MODULE(Declarative) + -QSGKillAffector::QSGKillAffector(QSGItem *parent) : - QSGParticleAffector(parent) +class QSGAgeAffector : public QSGParticleAffector { -} + Q_OBJECT + Q_PROPERTY(int lifeLeft READ lifeLeft WRITE setLifeLeft NOTIFY lifeLeftChanged) +public: + explicit QSGAgeAffector(QSGItem *parent = 0); -bool QSGKillAffector::affectParticle(QSGParticleData *d, qreal dt) -{ - Q_UNUSED(dt); - if (d->stillAlive()){ - d->t -= d->lifeSpan + 1; - return true; + int lifeLeft() const + { + return m_lifeLeft; + } + +protected: + virtual bool affectParticle(QSGParticleData *d, qreal dt); +signals: + void lifeLeftChanged(int arg); + +public slots: + void setLifeLeft(int arg) + { + if (m_lifeLeft != arg) { + m_lifeLeft = arg; + emit lifeLeftChanged(arg); + } } - return false; -} + +private: + +int m_lifeLeft; +}; + QT_END_NAMESPACE +QT_END_HEADER +#endif // KILLAFFECTOR_H diff --git a/src/declarative/particles/qsgangleddirection.cpp b/src/declarative/particles/qsgangledirection.cpp similarity index 84% rename from src/declarative/particles/qsgangleddirection.cpp rename to src/declarative/particles/qsgangledirection.cpp index ab39b8a575..10a31bf07e 100644 --- a/src/declarative/particles/qsgangleddirection.cpp +++ b/src/declarative/particles/qsgangledirection.cpp @@ -39,21 +39,21 @@ ** ****************************************************************************/ -#include "qsgangleddirection_p.h" +#include "qsgangledirection_p.h" #include <cmath> QT_BEGIN_NAMESPACE const qreal CONV = 0.017453292519943295; /*! - \qmlclass AngledDirection QSGAngledDirection + \qmlclass AngleDirection QSGAngleDirection \inqmlmodule QtQuick.Particles 2 - \inherits StochasticDirection - \brief The AngledDirection element allows you to specify a direction that varies in angle + \inherits Direction + \brief The AngleDirection element allows you to specify a direction that varies in angle The AngledDirection element allows both the specification of a direction by angle and magnitude, as well as varying the parameters by angle or magnitude. */ /*! - \qmlproperty real QtQuick.Particles2::AngledDirection::angle + \qmlproperty real QtQuick.Particles2::AngleDirection::angle This property specifies the base angle for the direction. The angle of this direction will vary by no more than angleVariation from this angle. @@ -63,7 +63,7 @@ const qreal CONV = 0.017453292519943295; The default value is zero. */ /*! - \qmlproperty real QtQuick.Particles2::AngledDirection::magnitude + \qmlproperty real QtQuick.Particles2::AngleDirection::magnitude This property specifies the base magnitude for the direction. The magnitude of this direction will vary by no more than magnitudeVariation from this magnitude. @@ -73,7 +73,7 @@ const qreal CONV = 0.017453292519943295; The default value is zero. */ /*! - \qmlproperty real QtQuick.Particles2::AngledDirection::angleVariation + \qmlproperty real QtQuick.Particles2::AngleDirection::angleVariation This property specifies the maximum angle variation for the direction. The angle of the direction will vary by up to angleVariation clockwise and anticlockwise from the value specified in angle. @@ -83,7 +83,7 @@ const qreal CONV = 0.017453292519943295; The default value is zero. */ /*! - \qmlproperty real QtQuick.Particles2::AngledDirection::magnitudeVariation + \qmlproperty real QtQuick.Particles2::AngleDirection::magnitudeVariation This property specifies the base magnitude for the direction. The magnitude of this direction will vary by no more than magnitudeVariation from the base magnitude. @@ -92,8 +92,8 @@ const qreal CONV = 0.017453292519943295; The default value is zero. */ -QSGAngledDirection::QSGAngledDirection(QObject *parent) : - QSGStochasticDirection(parent) +QSGAngleDirection::QSGAngleDirection(QObject *parent) : + QSGDirection(parent) , m_angle(0) , m_magnitude(0) , m_angleVariation(0) @@ -102,7 +102,7 @@ QSGAngledDirection::QSGAngledDirection(QObject *parent) : } -const QPointF &QSGAngledDirection::sample(const QPointF &from) +const QPointF &QSGAngleDirection::sample(const QPointF &from) { //TODO: Faster qreal theta = m_angle*CONV - m_angleVariation*CONV + rand()/float(RAND_MAX) * m_angleVariation*CONV * 2; diff --git a/src/declarative/particles/qsgangleddirection_p.h b/src/declarative/particles/qsgangledirection_p.h similarity index 95% rename from src/declarative/particles/qsgangleddirection_p.h rename to src/declarative/particles/qsgangledirection_p.h index 4d5522d13c..870a7eb0d9 100644 --- a/src/declarative/particles/qsgangleddirection_p.h +++ b/src/declarative/particles/qsgangledirection_p.h @@ -41,14 +41,14 @@ #ifndef QSGANGLEDDIRECTION_H #define QSGANGLEDDIRECTION_H -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" QT_BEGIN_HEADER QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGAngledDirection : public QSGStochasticDirection +class QSGAngleDirection : public QSGDirection { Q_OBJECT Q_PROPERTY(qreal angle READ angle WRITE setAngle NOTIFY angleChanged) @@ -56,7 +56,7 @@ class QSGAngledDirection : public QSGStochasticDirection Q_PROPERTY(qreal angleVariation READ angleVariation WRITE setAngleVariation NOTIFY angleVariationChanged) Q_PROPERTY(qreal magnitudeVariation READ magnitudeVariation WRITE setMagnitudeVariation NOTIFY magnitudeVariationChanged) public: - explicit QSGAngledDirection(QObject *parent = 0); + explicit QSGAngleDirection(QObject *parent = 0); const QPointF &sample(const QPointF &from); qreal angle() const { diff --git a/src/declarative/particles/qsgcumulativedirection.cpp b/src/declarative/particles/qsgcumulativedirection.cpp index 1d7523972b..8e4e6b681d 100644 --- a/src/declarative/particles/qsgcumulativedirection.cpp +++ b/src/declarative/particles/qsgcumulativedirection.cpp @@ -45,24 +45,24 @@ QT_BEGIN_NAMESPACE /*! \qmlclass CumulativeDirection QSGCumulativeDirection \inqmlmodule QtQuick.Particles 2 - \inherits StochasticDirection + \inherits Direction \brief The CumulativeDirection element allows you to specify a direction made of other directions The CumulativeDirection element will act as a direction that sums the directions within it. */ -QSGCumulativeDirection::QSGCumulativeDirection(QObject *parent):QSGStochasticDirection(parent) +QSGCumulativeDirection::QSGCumulativeDirection(QObject *parent):QSGDirection(parent) { } -QDeclarativeListProperty<QSGStochasticDirection> QSGCumulativeDirection::directions() +QDeclarativeListProperty<QSGDirection> QSGCumulativeDirection::directions() { - return QDeclarativeListProperty<QSGStochasticDirection>(this, m_directions);//TODO: Proper list property + return QDeclarativeListProperty<QSGDirection>(this, m_directions);//TODO: Proper list property } const QPointF &QSGCumulativeDirection::sample(const QPointF &from) { QPointF ret; - foreach (QSGStochasticDirection* dir, m_directions) + foreach (QSGDirection* dir, m_directions) ret += dir->sample(from); return ret; } diff --git a/src/declarative/particles/qsgcumulativedirection_p.h b/src/declarative/particles/qsgcumulativedirection_p.h index c54a795931..4f93fed1bd 100644 --- a/src/declarative/particles/qsgcumulativedirection_p.h +++ b/src/declarative/particles/qsgcumulativedirection_p.h @@ -41,7 +41,7 @@ #ifndef QSGCUMULATIVEDIRECTION_P_H #define QSGCUMULATIVEDIRECTION_P_H -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" #include <QDeclarativeListProperty> QT_BEGIN_HEADER @@ -49,16 +49,16 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGCumulativeDirection : public QSGStochasticDirection +class QSGCumulativeDirection : public QSGDirection { Q_OBJECT - Q_PROPERTY(QDeclarativeListProperty<QSGStochasticDirection> directions READ directions) + Q_PROPERTY(QDeclarativeListProperty<QSGDirection> directions READ directions) Q_CLASSINFO("DefaultProperty", "directions") public: explicit QSGCumulativeDirection(QObject *parent = 0); - QDeclarativeListProperty<QSGStochasticDirection> directions(); + QDeclarativeListProperty<QSGDirection> directions(); const QPointF &sample(const QPointF &from); private: - QList<QSGStochasticDirection*> m_directions; + QList<QSGDirection*> m_directions; }; #endif // QSGCUMULATIVEDIRECTION_P_H diff --git a/src/declarative/particles/qsgcustomaffector.cpp b/src/declarative/particles/qsgcustomaffector.cpp new file mode 100644 index 0000000000..70e1dbe035 --- /dev/null +++ b/src/declarative/particles/qsgcustomaffector.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Declarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsgcustomaffector_p.h" +#include <QDebug> +QT_BEGIN_NAMESPACE + +//TODO: Move docs (and inherit) to real base when docs can propagate +//TODO: Document particle 'type' +/*! + \qmlsignal QtQuick.Particles2::Affector::affectParticle(particle, dt) + + This handler is called when particles are selected to be affected. + + dt is the time since the last time it was affected. Use dt to normalize + trajectory manipulations to real time. + + Note that JS is slower to execute, so it is not recommended to use this in + high-volume particle systems. +*/ +QSGCustomAffector::QSGCustomAffector(QSGItem *parent) : + QSGParticleAffector(parent) +{ +} + +bool QSGCustomAffector::isAffectConnected() +{ + static int idx = QObjectPrivate::get(this)->signalIndex("affectParticle(QDeclarativeV8Handle,qreal)"); + return QObjectPrivate::get(this)->isSignalConnected(idx); +} + +bool QSGCustomAffector::affectParticle(QSGParticleData *d, qreal dt) +{ + if (isAffectConnected()){ + d->update = 0.0; + emit affectParticle(d->v8Value(), dt); + return d->update == 1.0; + } + return true; +} + +QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgkill_p.h b/src/declarative/particles/qsgcustomaffector_p.h similarity index 84% rename from src/declarative/particles/qsgkill_p.h rename to src/declarative/particles/qsgcustomaffector_p.h index d1e2292f13..7f39200298 100644 --- a/src/declarative/particles/qsgkill_p.h +++ b/src/declarative/particles/qsgcustomaffector_p.h @@ -39,8 +39,12 @@ ** ****************************************************************************/ -#ifndef KILLAFFECTOR_H -#define KILLAFFECTOR_H +#ifndef CUSTOMAFFECTOR_H +#define CUSTOMAFFECTOR_H + +#include <QObject> +#include "qsgparticlesystem_p.h" +#include "qsgparticleextruder_p.h" #include "qsgparticleaffector_p.h" QT_BEGIN_HEADER @@ -49,20 +53,22 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) - -class QSGKillAffector : public QSGParticleAffector +class QSGCustomAffector : public QSGParticleAffector { Q_OBJECT + public: - explicit QSGKillAffector(QSGItem *parent = 0); -protected: - virtual bool affectParticle(QSGParticleData *d, qreal dt); -signals: + explicit QSGCustomAffector(QSGItem *parent = 0); +signals: + void affectParticle(QDeclarativeV8Handle particle, qreal dt); public slots: - +protected: + bool isAffectConnected(); + virtual bool affectParticle(QSGParticleData *d, qreal dt); +private: }; QT_END_NAMESPACE QT_END_HEADER -#endif // KILLAFFECTOR_H +#endif // CUSTOMAFFECTOR_H diff --git a/src/declarative/particles/qsgcustomparticle.cpp b/src/declarative/particles/qsgcustomparticle.cpp index 00e3ec185b..6c95fe66c0 100644 --- a/src/declarative/particles/qsgcustomparticle.cpp +++ b/src/declarative/particles/qsgcustomparticle.cpp @@ -47,36 +47,36 @@ QT_BEGIN_NAMESPACE //Includes comments because the code isn't self explanatory static const char qt_particles_template_vertex_code[] = - "attribute highp vec2 vPos; \n" - "attribute highp vec2 vTex; \n" - "attribute highp vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize \n" - "attribute highp vec4 vVec; // x,y = constant speed, z,w = acceleration \n" - "attribute highp float r; \n" - "uniform highp mat4 qt_Matrix; \n" - "uniform highp float timestamp; \n" - "varying highp vec2 fTex; \n" - "void defaultMain() { \n" - " fTex = vTex; \n" - " highp float size = vData.z; \n" - " highp float endSize = vData.w; \n" - " highp float t = (timestamp - vData.x) / vData.y; \n" - " highp float currentSize = mix(size, endSize, t * t); \n" - " if (t < 0. || t > 1.) \n" - " currentSize = 0.; \n" - " highp vec2 pos = vPos \n" - " - currentSize / 2. + currentSize * vTex // adjust size \n" - " + vVec.xy * t * vData.y // apply speed vector.. \n" - " + 0.5 * vVec.zw * pow(t * vData.y, 2.); \n" - " gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); \n" - "}\n"; + "attribute highp vec2 qt_ParticlePos;\n" + "attribute highp vec2 qt_ParticleTex;\n" + "attribute highp vec4 qt_ParticleData; // x = time, y = lifeSpan, z = size, w = endSize\n" + "attribute highp vec4 qt_ParticleVec; // x,y = constant speed, z,w = acceleration\n" + "attribute highp float qt_ParticleR;\n" + "uniform highp mat4 qt_Matrix;\n" + "uniform highp float qt_Timestamp;\n" + "varying highp vec2 qt_TexCoord0;\n" + "void defaultMain() {\n" + " qt_TexCoord0 = qt_ParticleTex;\n" + " highp float size = qt_ParticleData.z;\n" + " highp float endSize = qt_ParticleData.w;\n" + " highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y;\n" + " highp float currentSize = mix(size, endSize, t * t);\n" + " if (t < 0. || t > 1.)\n" + " currentSize = 0.;\n" + " highp vec2 pos = qt_ParticlePos\n" + " - currentSize / 2. + currentSize * qt_ParticleTex // adjust size\n" + " + qt_ParticleVec.xy * t * qt_ParticleData.y // apply speed vector..\n" + " + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.);\n" + " gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1);\n" + "}"; static const char qt_particles_default_vertex_code[] = "void main() { \n" " defaultMain(); \n" "}"; -static const char qt_particles_default_fragment_code[] =//TODO: Default frag requires source? +static const char qt_particles_default_fragment_code[] = "uniform sampler2D source; \n" - "varying highp vec2 fTex; \n" + "varying highp vec2 qt_TexCoord0; \n" "uniform lowp float qt_Opacity; \n" "void main() { \n" " gl_FragColor = texture2D(source, fTex) * qt_Opacity; \n" @@ -150,7 +150,7 @@ void QSGCustomParticle::componentComplete() This property holds the fragment shader's GLSL source code. The default shader expects the texture coordinate to be passed from the - vertex shader as "varying highp vec2 fTex", and it samples from a + vertex shader as "varying highp vec2 qt_TexCoord0", and it samples from a sampler2D named "source". */ @@ -171,31 +171,31 @@ void QSGCustomParticle::setFragmentShader(const QByteArray &code) This property holds the vertex shader's GLSL source code. The default shader passes the texture coordinate along to the fragment - shader as "varying highp vec2 fTex". + shader as "varying highp vec2 qt_TexCoord0". To aid writing a particle vertex shader, the following GLSL code is prepended to your vertex shader: \code - attribute highp vec2 vPos; - attribute highp vec2 vTex; - attribute highp vec4 vData; // x = time, y = lifeSpan, z = size, w = endSize - attribute highp vec4 vVec; // x,y = constant speed, z,w = acceleration - attribute highp float r; + attribute highp vec2 qt_ParticlePos; + attribute highp vec2 qt_ParticleTex; + attribute highp vec4 qt_ParticleData; // x = time, y = lifeSpan, z = size, w = endSize + attribute highp vec4 qt_ParticleVec; // x,y = constant speed, z,w = acceleration + attribute highp float qt_ParticleR; uniform highp mat4 qt_Matrix; - uniform highp float timestamp; - varying highp vec2 fTex; + uniform highp float qt_Timestamp; + varying highp vec2 qt_TexCoord0; void defaultMain() { - fTex = vTex; - highp float size = vData.z; - highp float endSize = vData.w; - highp float t = (timestamp - vData.x) / vData.y; + qt_TexCoord0 = qt_ParticleTex; + highp float size = qt_ParticleData.z; + highp float endSize = qt_ParticleData.w; + highp float t = (qt_Timestamp - qt_ParticleData.x) / qt_ParticleData.y; highp float currentSize = mix(size, endSize, t * t); if (t < 0. || t > 1.) currentSize = 0.; - highp vec2 pos = vPos - - currentSize / 2. + currentSize * vTex // adjust size - + vVec.xy * t * vData.y // apply speed vector.. - + 0.5 * vVec.zw * pow(t * vData.y, 2.); + highp vec2 pos = qt_ParticlePos + - currentSize / 2. + currentSize * qt_ParticleTex // adjust size + + qt_ParticleVec.xy * t * qt_ParticleData.y // apply speed vector.. + + 0.5 * qt_ParticleVec.zw * pow(t * qt_ParticleData.y, 2.); gl_Position = qt_Matrix * vec4(pos.x, pos.y, 0, 1); } \endcode @@ -340,7 +340,11 @@ void QSGCustomParticle::updateProperties() vertexCode = qt_particles_template_vertex_code + vertexCode; m_source.attributeNames.clear(); - m_source.attributeNames << "vPos" << "vTex" << "vData" << "vVec" << "r"; + m_source.attributeNames << "qt_ParticlePos" + << "qt_ParticleTex" + << "qt_ParticleData" + << "qt_ParticleVec" + << "qt_ParticleR"; lookThroughShaderCode(vertexCode); lookThroughShaderCode(fragmentCode); @@ -384,8 +388,8 @@ void QSGCustomParticle::lookThroughShaderCode(const QByteArray &code) m_source.respectsMatrix = true; } else if (name == "qt_Opacity") { m_source.respectsOpacity = true; - } else if (name == "timestamp") { - //TODO: Copy the whole thing just because I have one more uniform? + } else if (name == "qt_Timestamp") { + //Not strictly necessary } else { m_source.uniformNames.insert(name); if (type == "sampler2D") { @@ -513,12 +517,12 @@ QSGShaderEffectNode* QSGCustomParticle::buildCustomNodes() return *(m_nodes.begin()); } -static const QByteArray timestampName("timestamp"); void QSGCustomParticle::buildData() { if (!m_rootNode) return; + const QByteArray timestampName("qt_Timestamp"); QVector<QPair<QByteArray, QVariant> > values; QVector<QPair<QByteArray, QPointer<QSGItem> > > textures; const QVector<QPair<QByteArray, QPointer<QSGItem> > > &oldTextures = m_material.textureProviders(); diff --git a/src/declarative/particles/qsgstochasticdirection.cpp b/src/declarative/particles/qsgdirection.cpp similarity index 85% rename from src/declarative/particles/qsgstochasticdirection.cpp rename to src/declarative/particles/qsgdirection.cpp index cdbc9f15ad..f233a56f61 100644 --- a/src/declarative/particles/qsgstochasticdirection.cpp +++ b/src/declarative/particles/qsgdirection.cpp @@ -39,23 +39,23 @@ ** ****************************************************************************/ -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" QT_BEGIN_NAMESPACE /*! - \qmlclass StochasticDirection QSGStochasticDirection + \qmlclass Direction QSGDirection \inqmlmodule QtQuick.Particles 2 - \brief The StochasticDirection elements allow you to specify a vector space. + \brief The Direction elements allow you to specify a vector space. */ -QSGStochasticDirection::QSGStochasticDirection(QObject *parent) : +QSGDirection::QSGDirection(QObject *parent) : QObject(parent) { } -const QPointF &QSGStochasticDirection::sample(const QPointF &from) +const QPointF &QSGDirection::sample(const QPointF &from) { return m_ret; } diff --git a/src/declarative/particles/qsgstochasticdirection_p.h b/src/declarative/particles/qsgdirection_p.h similarity index 95% rename from src/declarative/particles/qsgstochasticdirection_p.h rename to src/declarative/particles/qsgdirection_p.h index 764937fc00..f64d5644e7 100644 --- a/src/declarative/particles/qsgstochasticdirection_p.h +++ b/src/declarative/particles/qsgdirection_p.h @@ -52,11 +52,11 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGStochasticDirection : public QObject +class QSGDirection : public QObject { Q_OBJECT public: - explicit QSGStochasticDirection(QObject *parent = 0); + explicit QSGDirection(QObject *parent = 0); virtual const QPointF &sample(const QPointF &from); signals: diff --git a/src/declarative/particles/qsgimageparticle.cpp b/src/declarative/particles/qsgimageparticle.cpp index b31d763f82..007cfb98db 100644 --- a/src/declarative/particles/qsgimageparticle.cpp +++ b/src/declarative/particles/qsgimageparticle.cpp @@ -608,7 +608,7 @@ void fillUniformArrayFromImage(float* array, const QImage& img, int size) Acceptable values are \list \o None: Particles just appear and disappear. - \o Fade: Particles fade in from 0. opacity at the start of their life, and fade out to 0. at the end. + \o Fade: Particles fade in from 0 opacity at the start of their life, and fade out to 0 at the end. \o Scale: Particles scale in from 0 size at the start of their life, and scale back to 0 at the end. \endlist @@ -812,7 +812,7 @@ void QSGImageParticle::setAutoRotation(bool arg) reset(); } -void QSGImageParticle::setXVector(QSGStochasticDirection* arg) +void QSGImageParticle::setXVector(QSGDirection* arg) { if (m_xVector != arg) { m_xVector = arg; @@ -822,7 +822,7 @@ void QSGImageParticle::setXVector(QSGStochasticDirection* arg) reset(); } -void QSGImageParticle::setYVector(QSGStochasticDirection* arg) +void QSGImageParticle::setYVector(QSGDirection* arg) { if (m_yVector != arg) { m_yVector = arg; diff --git a/src/declarative/particles/qsgimageparticle_p.h b/src/declarative/particles/qsgimageparticle_p.h index eb890e285c..01eacbad99 100644 --- a/src/declarative/particles/qsgimageparticle_p.h +++ b/src/declarative/particles/qsgimageparticle_p.h @@ -42,7 +42,7 @@ #ifndef ULTRAPARTICLE_H #define ULTRAPARTICLE_H #include "qsgparticlepainter_p.h" -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" #include <QDeclarativeListProperty> #include <qsgsimplematerial.h> @@ -172,9 +172,9 @@ class QSGImageParticle : public QSGParticlePainter //###Call i/j? Makes more sense to those with vector calculus experience, and I could even add the cirumflex in QML? //xVector is the vector from the top-left point to the top-right point, and is multiplied by current size - Q_PROPERTY(QSGStochasticDirection* xVector READ xVector WRITE setXVector NOTIFY xVectorChanged) + Q_PROPERTY(QSGDirection* xVector READ xVector WRITE setXVector NOTIFY xVectorChanged) //yVector is the same, but top-left to bottom-left. The particle is always a parallelogram. - Q_PROPERTY(QSGStochasticDirection* yVector READ yVector WRITE setYVector NOTIFY yVectorChanged) + Q_PROPERTY(QSGDirection* yVector READ yVector WRITE setYVector NOTIFY yVectorChanged) Q_PROPERTY(QDeclarativeListProperty<QSGSprite> sprites READ sprites) Q_PROPERTY(EntryEffect entryEffect READ entryEffect WRITE setEntryEffect NOTIFY entryEffectChanged) @@ -243,9 +243,9 @@ public: bool autoRotation() const { return m_autoRotation; } - QSGStochasticDirection* xVector() const { return m_xVector; } + QSGDirection* xVector() const { return m_xVector; } - QSGStochasticDirection* yVector() const { return m_yVector; } + QSGDirection* yVector() const { return m_yVector; } bool bloat() const { return m_bloat; } @@ -282,9 +282,9 @@ signals: void autoRotationChanged(bool arg); - void xVectorChanged(QSGStochasticDirection* arg); + void xVectorChanged(QSGDirection* arg); - void yVectorChanged(QSGStochasticDirection* arg); + void yVectorChanged(QSGDirection* arg); void bloatChanged(bool arg); @@ -312,9 +312,9 @@ public slots: void setAutoRotation(bool arg); - void setXVector(QSGStochasticDirection* arg); + void setXVector(QSGDirection* arg); - void setYVector(QSGStochasticDirection* arg); + void setYVector(QSGDirection* arg); void setBloat(bool arg); @@ -364,8 +364,8 @@ private: qreal m_rotationSpeed; qreal m_rotationSpeedVariation; bool m_autoRotation; - QSGStochasticDirection* m_xVector; - QSGStochasticDirection* m_yVector; + QSGDirection* m_xVector; + QSGDirection* m_yVector; QList<QSGSprite*> m_sprites; QSGSpriteEngine* m_spriteEngine; diff --git a/src/declarative/particles/qsgmodelparticle.cpp b/src/declarative/particles/qsgmodelparticle.cpp deleted file mode 100644 index c013d726a3..0000000000 --- a/src/declarative/particles/qsgmodelparticle.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Declarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qsgmodelparticle_p.h" -#include <QtDeclarative/private/qsgvisualitemmodel_p.h> -#include <qsgnode.h> -#include <QTimer> -#include <QDebug> - -QT_BEGIN_NAMESPACE -/*! - \qmlclass ModelParticle QSGModelParticle - \inqmlmodule QtQuick.Particles 2 - \inherits ParticlePainter - \brief The ModelParticle element allows you to specify a model and delegate pair to paint particles. - -*/ - - -/*! - \qmlmethod void QtQuick.Particles2::ModelParticle::freeze(Item item) - - Suspends the flow of time for the logical particle which item represents, allowing you to control its movement. -*/ - -/*! - \qmlmethod void QtQuick.Particles2::ModelParticle::unfreeze(Item item) - - Restarts the flow of time for the logical particle which item represents, allowing it to be moved by the particle system again. -*/ - -/*! - \qmlproperty bool QtQuick.Particles2::ModelParticle::fade - - If true, the item will automatically be faded in and out - at the ends of its lifetime. If false, you will have to - implement any entry effect yourself. - - Default is true. -*/ - -/*! - \qmlproperty model QtQuick.Particles2::ModelParticle::model - - The model to use as a data source. Every time a particle is - emitted, the next model entry will be used with a delegate - to visualize it. -*/ - -/*! - \qmlproperty Component QtQuick.Particles2::ModelParticle::delegate - - An instance of the delegate will be created for every model - entry, and moved along with it. -*/ - -QSGModelParticle::QSGModelParticle(QSGItem *parent) : - QSGParticlePainter(parent), m_ownModel(false), m_comp(0), m_model(0), m_fade(true), m_modelCount(0) -{ - setFlag(QSGItem::ItemHasContents); - QTimer* manageDelegates = new QTimer(this);//TODO: don't leak - connect(manageDelegates, SIGNAL(timeout()), - this, SLOT(processPending())); - manageDelegates->setInterval(16); - manageDelegates->setSingleShot(false); - manageDelegates->start(); -} - -QSGModelParticle::~QSGModelParticle() -{ - if (m_ownModel) - delete m_model; -} - -QVariant QSGModelParticle::model() const -{ - return m_dataSource; -} - -void QSGModelParticle::setModel(const QVariant &arg) -{ - if (arg == m_dataSource) - return; - m_dataSource = arg; - if (qobject_cast<QSGVisualDataModel*>(arg.value<QObject*>())) { - if (m_ownModel && m_model) - delete m_model; - m_model = qobject_cast<QSGVisualDataModel*>(arg.value<QObject*>()); - m_ownModel = false; - }else{ - if (!m_model || !m_ownModel) - m_model = new QSGVisualDataModel(qmlContext(this)); - m_model->setModel(m_dataSource); - m_ownModel = true; - } - if (m_comp) - m_model->setDelegate(m_comp); - emit modelChanged(); - emit modelCountChanged(); - connect(m_model, SIGNAL(countChanged()), - this, SIGNAL(modelCountChanged())); - connect(m_model, SIGNAL(countChanged()), - this, SLOT(updateCount())); - updateCount(); -} - -void QSGModelParticle::updateCount() -{ - int newCount = 0; - if (m_model) - newCount = m_model->count(); - if (newCount < 0) - return;//WTF? - if (m_modelCount == 0 || newCount == 0){ - m_available.clear(); - for (int i=0; i<newCount; i++) - m_available << i; - }else if (newCount < m_modelCount){ - for (int i=newCount; i<m_modelCount; i++) //existing ones must leave normally, but aren't readded - m_available.removeAll(i); - }else if (newCount > m_modelCount){ - for (int i=m_modelCount; i<newCount; i++) - m_available << i; - } - m_modelCount = newCount; -} - -QDeclarativeComponent *QSGModelParticle::delegate() const -{ - if (m_model) - return m_model->delegate(); - return 0; -} - -void QSGModelParticle::setDelegate(QDeclarativeComponent *comp) -{ - if (QSGVisualDataModel *dataModel = qobject_cast<QSGVisualDataModel*>(m_model)) - if (comp == dataModel->delegate()) - return; - m_comp = comp; - if (m_model) - m_model->setDelegate(comp); - emit delegateChanged(); -} - -int QSGModelParticle::modelCount() const -{ - if (m_model) - const_cast<QSGModelParticle*>(this)->updateCount();//TODO: Investigate why this doesn't get called properly - return m_modelCount; -} - - -void QSGModelParticle::freeze(QSGItem* item) -{ - m_stasis << item; -} - - -void QSGModelParticle::unfreeze(QSGItem* item) -{ - m_stasis.remove(item); -} - -void QSGModelParticle::initialize(int gIdx, int pIdx) -{ - if (!m_model || !m_model->count()) - return; - if (m_available.isEmpty()) - return; - m_requests << m_system->m_groupData[gIdx]->data[pIdx]; -} - -void QSGModelParticle::processPending() -{//can't create/delete arbitrary items in the render thread - foreach (QSGItem* item, m_deletables){ - item->setVisible(false); - if (m_fade) - item->setOpacity(0.); - m_model->release(item); - m_activeCount--; - } - m_deletables.clear(); - - foreach (QSGParticleData* datum, m_requests){ - if (datum->delegate){ - if (m_stasis.contains(datum->delegate)) - qWarning() << "Current model particles prefers overwrite:false"; - //remove old item from the particle that is dying to make room for this one - m_deletables << datum->delegate; - m_available << datum->modelIndex; - datum->modelIndex = -1; - datum->delegate = 0; - } - - if (!m_available.isEmpty()){ - datum->delegate = m_model->item(m_available.first()); - datum->modelIndex = m_available.first(); - m_available.pop_front(); - QSGModelParticleAttached* mpa = qobject_cast<QSGModelParticleAttached*>(qmlAttachedPropertiesObject<QSGModelParticle>(datum->delegate)); - if (mpa){ - mpa->m_mp = this; - mpa->attach(); - } - datum->delegate->setParentItem(this); - if (m_fade) - datum->delegate->setOpacity(0.0); - datum->delegate->setVisible(false);//Will be set to true when we prepare the next frame - m_activeCount++; - } - } - m_requests.clear(); -} - -void QSGModelParticle::commit(int gIdx, int pIdx) -{ - //No-op unless we start copying the data. -} - -void QSGModelParticle::reset() -{ - QSGParticlePainter::reset(); - //TODO: Cleanup items? - //m_available.clear();//Should this be reset too? - //m_pendingItems.clear();//TODO: Should this be done? If so, Emit signal? -} - - -QSGNode* QSGModelParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d) -{ - //Dummy update just to get painting tick - if (m_pleaseReset){ - m_pleaseReset = false; - reset(); - } - prepareNextFrame(); - - update();//Get called again - if (n) - n->markDirty(QSGNode::DirtyMaterial); - return QSGItem::updatePaintNode(n,d); -} - -void QSGModelParticle::prepareNextFrame() -{ - if (!m_system) - return; - qint64 timeStamp = m_system->systemSync(this); - qreal curT = timeStamp/1000.0; - qreal dt = curT - m_lastT; - m_lastT = curT; - if (!m_activeCount) - return; - - //TODO: Size, better fade? - foreach (const QString &str, m_particles){ - int gIdx = m_system->m_groupIds[str]; - int count = m_system->m_groupData[gIdx]->size(); - - for (int i=0; i<count; i++){ - QSGParticleData* data = m_system->m_groupData[gIdx]->data[i]; - if (!data || !data->delegate) - continue; - qreal t = ((timeStamp/1000.0) - data->t) / data->lifeSpan; - if (m_stasis.contains(data->delegate)) { - data->t += dt;//Stasis effect - continue; - } - if (t >= 1.0){//Usually happens from load - m_available << data->modelIndex; - m_deletables << data->delegate; - data->modelIndex = -1; - data->delegate = 0; - continue; - }else{//Fade - data->delegate->setVisible(true); - if (m_fade){ - qreal o = 1.; - if (t<0.2) - o = t*5; - if (t>0.8) - o = (1-t)*5; - data->delegate->setOpacity(o); - } - } - data->delegate->setX(data->curX() - data->delegate->width()/2 - m_systemOffset.x()); - data->delegate->setY(data->curY() - data->delegate->height()/2 - m_systemOffset.y()); - } - } -} - -QSGModelParticleAttached *QSGModelParticle::qmlAttachedProperties(QObject *object) -{ - return new QSGModelParticleAttached(object); -} - -QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgmodelparticle_p.h b/src/declarative/particles/qsgmodelparticle_p.h deleted file mode 100644 index c6dd40d51e..0000000000 --- a/src/declarative/particles/qsgmodelparticle_p.h +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the Declarative module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef DATAPARTICLE_H -#define DATAPARTICLE_H -#include "qsgparticlepainter_p.h" -#include <QPointer> -#include <QSet> -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Declarative) -class QSGVisualDataModel; -class QSGModelParticleAttached; - -class QSGModelParticle : public QSGParticlePainter -{ - Q_OBJECT - - Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged) - Q_PROPERTY(QDeclarativeComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged) - Q_PROPERTY(int modelCount READ modelCount NOTIFY modelCountChanged) - Q_PROPERTY(bool fade READ fade WRITE setFade NOTIFY fadeChanged) - Q_CLASSINFO("DefaultProperty", "delegate") -public: - explicit QSGModelParticle(QSGItem *parent = 0); - virtual ~QSGModelParticle(); - QVariant model() const; - void setModel(const QVariant &); - - QDeclarativeComponent *delegate() const; - void setDelegate(QDeclarativeComponent *); - - int modelCount() const; - - bool fade() const { return m_fade; } - - virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); - - static QSGModelParticleAttached *qmlAttachedProperties(QObject *object); -signals: - void modelChanged(); - void delegateChanged(); - void modelCountChanged(); - void fadeChanged(); - -public slots: - void freeze(QSGItem* item); - void unfreeze(QSGItem* item); - - void setFade(bool arg){if (arg == m_fade) return; m_fade = arg; emit fadeChanged();} -protected: - virtual void reset(); - virtual void commit(int gIdx, int pIdx); - virtual void initialize(int gIdx, int pIdx); - void prepareNextFrame(); -private slots: - void updateCount(); - void processPending(); -private: - bool m_ownModel; - QDeclarativeComponent* m_comp; - QSGVisualDataModel *m_model; - QVariant m_dataSource; - QList<QSGItem*> m_deletables; - QList< QSGParticleData* > m_requests; - bool m_fade; - - QList<QSGItem*> m_pendingItems; - QList<int> m_available; - QSet<QSGItem*> m_stasis; - qreal m_lastT; - int m_activeCount; - int m_modelCount; -}; - -class QSGModelParticleAttached : public QObject -{ - Q_OBJECT - Q_PROPERTY(QSGModelParticle* particle READ particle CONSTANT) -public: - QSGModelParticleAttached(QObject* parent) - : QObject(parent), m_mp(0) - {;} - QSGModelParticle* particle() {return m_mp;} - void detach(){emit detached();} - void attach(){emit attached();} -private: - QSGModelParticle* m_mp; - friend class QSGModelParticle; -Q_SIGNALS: - void detached(); - void attached(); -}; - -QT_END_NAMESPACE - -QML_DECLARE_TYPEINFO(QSGModelParticle, QML_HAS_ATTACHED_PROPERTIES) - -QT_END_HEADER -#endif // DATAPARTICLE_H diff --git a/src/declarative/particles/qsgparticleaffector.cpp b/src/declarative/particles/qsgparticleaffector.cpp index 4a3bba6e6d..3554121a2b 100644 --- a/src/declarative/particles/qsgparticleaffector.cpp +++ b/src/declarative/particles/qsgparticleaffector.cpp @@ -73,16 +73,16 @@ QT_BEGIN_NAMESPACE By default, no groups are specified. */ /*! - \qmlproperty bool QtQuick.Particles2::Affector::active - If active is set to false, this affector will not affect any particles. + \qmlproperty bool QtQuick.Particles2::Affector::enabled + If enabled is set to false, this affector will not affect any particles. Usually this is used to conditionally turn an affector on or off. Default value is true. */ /*! - \qmlproperty bool QtQuick.Particles2::Affector::onceOff - If onceOff is set to true, this affector will only affect each particle + \qmlproperty bool QtQuick.Particles2::Affector::once + If once is set to true, this affector will only affect each particle once in their lifetimes. Default value is false. @@ -93,27 +93,24 @@ QT_BEGIN_NAMESPACE non-rectangular area. */ /*! - \qmlproperty bool QtQuick.Particles2::Affector::signal - If this is set to true, then an affected(x,y) signal will be emitted each - time this affector would affect a particle. + \qmlsignal QtQuick.Particles2::Affector::onAffected(x, y) - For Affector only, this will happen irrespective of whether any changes - are made to the particle, for other Affectors the signal will only fire - if the particle is actually affected. + This signal is emitted each time the affector actually affects a particle. - Default value is false. -*/ + x,y are the coordinates of the affected particle, relative to the ParticleSystem. +*/ //TODO: Document particle 'type' /*! \qmlsignal QtQuick.Particles2::Affector::affectParticle(particle, dt) - This handler is called when a particle is selected to be affected. + This handler is called when particles are selected to be affected. dt is the time since the last time it was affected. Use dt to normalize trajectory manipulations to real time. - This handler is usually not available on inherited types. + Note that JS is slower to execute, so it is not recommended to use this in + high-volume particle systems. */ /*! \qmlsignal QtQuick.Particles2::Affector::affected(x, y) @@ -124,32 +121,32 @@ QT_BEGIN_NAMESPACE x,y is the particles current position. */ QSGParticleAffector::QSGParticleAffector(QSGItem *parent) : - QSGItem(parent), m_needsReset(false), m_system(0), m_active(true) - , m_updateIntSet(false), m_shape(new QSGParticleExtruder(this)), m_signal(false) + QSGItem(parent), m_needsReset(false), m_system(0), m_enabled(true) + , m_updateIntSet(false), m_shape(new QSGParticleExtruder(this)) { } -bool QSGParticleAffector::isAffectConnected() +bool QSGParticleAffector::isAffectedConnected() { - static int idx = QObjectPrivate::get(this)->signalIndex("affectParticle(QDeclarativeV8Handle,qreal)"); + static int idx = QObjectPrivate::get(this)->signalIndex("affected(qreal,qreal)"); return QObjectPrivate::get(this)->isSignalConnected(idx); } + void QSGParticleAffector::componentComplete() { if (!m_system && qobject_cast<QSGParticleSystem*>(parentItem())) setSystem(qobject_cast<QSGParticleSystem*>(parentItem())); - if (!m_system) - qWarning() << "Affector created without a particle system specified";//TODO: useful QML warnings, like line number? QSGItem::componentComplete(); } void QSGParticleAffector::affectSystem(qreal dt) { - if (!m_active) + if (!m_enabled) return; //If not reimplemented, calls affect particle per particle //But only on particles in targeted system/area + bool affectedConnected = isAffectedConnected(); if (m_updateIntSet){ m_groups.clear(); foreach (const QString &p, m_particles) @@ -167,16 +164,16 @@ void QSGParticleAffector::affectSystem(qreal dt) continue; //Need to have previous location for affected anyways QPointF curPos; - if (m_signal || (width() && height())) + if (affectedConnected || (width() && height())) curPos = QPointF(d->curX(), d->curY()); if (width() == 0 || height() == 0 || m_shape->contains(QRectF(m_offset.x(), m_offset.y(), width(), height()),curPos)){ - if (m_collisionParticles.isEmpty() || isColliding(d)){ + if (m_whenCollidingWith.isEmpty() || isColliding(d)){ if (affectParticle(d, dt)){ m_system->m_needsReset << d; if (m_onceOff) m_onceOffed << qMakePair(d->group, d->index); - if (m_signal)//###Make signal based on if connected, and then m_signal just affects AffectParticle for base? + if (affectedConnected) emit affected(curPos.x(), curPos.y()); } } @@ -188,12 +185,7 @@ void QSGParticleAffector::affectSystem(qreal dt) bool QSGParticleAffector::affectParticle(QSGParticleData *d, qreal dt) { - if (isAffectConnected()){ - d->update = 0.0; - emit affectParticle(d->v8Value(), dt); - return d->update == 1.0; - } - return m_signal;//If signalling, then we always 'null affect' it. + return true; } void QSGParticleAffector::reset(QSGParticleData* pd) @@ -214,7 +206,7 @@ bool QSGParticleAffector::isColliding(QSGParticleData *d) qreal myCurX = d->curX(); qreal myCurY = d->curY(); qreal myCurSize = d->curSize()/2; - foreach (const QString &group, m_collisionParticles){ + foreach (const QString &group, m_whenCollidingWith){ foreach (QSGParticleData* other, m_system->m_groupData[m_system->m_groupIds[group]]->data){ if (!other->stillAlive()) continue; diff --git a/src/declarative/particles/qsgparticleaffector_p.h b/src/declarative/particles/qsgparticleaffector_p.h index dd279c07b9..c808ef4e76 100644 --- a/src/declarative/particles/qsgparticleaffector_p.h +++ b/src/declarative/particles/qsgparticleaffector_p.h @@ -57,11 +57,10 @@ class QSGParticleAffector : public QSGItem Q_OBJECT Q_PROPERTY(QSGParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged) Q_PROPERTY(QStringList particles READ particles WRITE setParticles NOTIFY particlesChanged) - Q_PROPERTY(QStringList collisionParticles READ collisionParticles WRITE setCollisionParticles NOTIFY collisionParticlesChanged) - Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged) - Q_PROPERTY(bool onceOff READ onceOff WRITE setOnceOff NOTIFY onceOffChanged) + Q_PROPERTY(QStringList whenCollidingWith READ whenCollidingWith WRITE setWhenCollidingWith NOTIFY whenCollidingWithChanged) + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) + Q_PROPERTY(bool once READ onceOff WRITE setOnceOff NOTIFY onceChanged) Q_PROPERTY(QSGParticleExtruder* shape READ shape WRITE setShape NOTIFY shapeChanged) - Q_PROPERTY(bool signal READ signal WRITE setSignal NOTIFY signalChanged)//TODO: Determine by whether it's connected public: explicit QSGParticleAffector(QSGItem *parent = 0); @@ -77,9 +76,9 @@ public: return m_particles; } - bool active() const + bool enabled() const { - return m_active; + return m_enabled; } bool onceOff() const @@ -92,33 +91,26 @@ public: return m_shape; } - bool signal() const + QStringList whenCollidingWith() const { - return m_signal; - } - - QStringList collisionParticles() const - { - return m_collisionParticles; + return m_whenCollidingWith; } signals: - void affectParticle(QDeclarativeV8Handle particle, qreal dt); void systemChanged(QSGParticleSystem* arg); void particlesChanged(QStringList arg); - void activeChanged(bool arg); + void enabledChanged(bool arg); - void onceOffChanged(bool arg); + void onceChanged(bool arg); void shapeChanged(QSGParticleExtruder* arg); void affected(qreal x, qreal y); - void signalChanged(bool arg); - void collisionParticlesChanged(QStringList arg); + void whenCollidingWithChanged(QStringList arg); public slots: void setSystem(QSGParticleSystem* arg) @@ -139,11 +131,11 @@ void setParticles(QStringList arg) } } -void setActive(bool arg) +void setEnabled(bool arg) { - if (m_active != arg) { - m_active = arg; - emit activeChanged(arg); + if (m_enabled != arg) { + m_enabled = arg; + emit enabledChanged(arg); } } @@ -152,7 +144,7 @@ void setOnceOff(bool arg) if (m_onceOff != arg) { m_onceOff = arg; m_needsReset = true; - emit onceOffChanged(arg); + emit onceChanged(arg); } } @@ -164,19 +156,11 @@ void setShape(QSGParticleExtruder* arg) } } -void setSignal(bool arg) -{ - if (m_signal != arg) { - m_signal = arg; - emit signalChanged(arg); - } -} - -void setCollisionParticles(QStringList arg) +void setWhenCollidingWith(QStringList arg) { - if (m_collisionParticles != arg) { - m_collisionParticles = arg; - emit collisionParticlesChanged(arg); + if (m_whenCollidingWith != arg) { + m_whenCollidingWith = arg; + emit whenCollidingWithChanged(arg); } } @@ -187,10 +171,10 @@ protected: QSGParticleSystem* m_system; QStringList m_particles; bool activeGroup(int g) {return m_groups.isEmpty() || m_groups.contains(g);} - bool m_active; + bool m_enabled; virtual void componentComplete(); QPointF m_offset; - bool isAffectConnected(); + bool isAffectedConnected(); private: QSet<int> m_groups; QSet<QPair<int, int> > m_onceOffed; @@ -200,9 +184,7 @@ private: QSGParticleExtruder* m_shape; - bool m_signal; - - QStringList m_collisionParticles; + QStringList m_whenCollidingWith; bool isColliding(QSGParticleData* d); private slots: diff --git a/src/declarative/particles/qsgparticleemitter.cpp b/src/declarative/particles/qsgparticleemitter.cpp index 6519bf5f9e..d44ad689ee 100644 --- a/src/declarative/particles/qsgparticleemitter.cpp +++ b/src/declarative/particles/qsgparticleemitter.cpp @@ -117,21 +117,17 @@ QT_BEGIN_NAMESPACE */ /*! - \qmlproperty int QtQuick.Particles2::Emitter::emitCap + \qmlproperty int QtQuick.Particles2::Emitter::maximumEmitted The maximum number of particles at a time that this emitter will have alive. This can be set as a performance optimization (when using burst and pulse) or - to stagger emissions. The default value is emitRate * lifeSpan in seconds, which - is the number of particles that would be alive at any one time given the default settings. -*/ -/*! - \qmlproperty bool QtQuick.Particles2::Emitter::noCap + to stagger emissions. - If set to true, the emitCap will be ignored and this emitter will never skip emitting - a particle based on how many it has alive. + If this is set to a number below zero, then there is no maximum limit on the number + of particles this emitter can have alive. - Default value is false. + The default value is -1. */ /*! \qmlproperty int QtQuick.Particles2::Emitter::startTime @@ -187,19 +183,38 @@ QT_BEGIN_NAMESPACE */ //TODO: Document particle 'type' /*! - \qmlsignal QtQuick.Particles2::Emitter::emitParticle(particle) + \qmlsignal QtQuick.Particles2::Emitter::onEmitParticle(Particle particle) This handler is called when a particle is emitted. You can modify particle attributes from within the handler. + + Note that JS is slower to execute, so it is not recommended to use this in + high-volume particle systems. +*/ + +/*! \qmlmethod QtQuick.Particles2::Emitter::burst(int count) + + Emits count particles from this emitter immediately. */ +/*! \qmlmethod QtQuick.Particles2::Emitter::burst(int x, int y, int count) + + 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. +*/ + +/*! \qmlmethod QtQuick.Particles2::Emitter::pulse(real duration) + + If the emitter is not enabled, enables it for duration seconds and then switches + it back off. +*/ QSGParticleEmitter::QSGParticleEmitter(QSGItem *parent) : QSGItem(parent) , m_particlesPerSecond(10) , m_particleDuration(1000) , m_particleDurationVariation(0) - , m_emitting(true) + , m_enabled(true) , m_system(0) , m_extruder(0) , m_defaultExtruder(0) @@ -215,11 +230,11 @@ QSGParticleEmitter::QSGParticleEmitter(QSGItem *parent) : , m_last_timestamp(-1) , m_last_emission(0) , m_startTime(0) - , m_overwrite(false) + , m_overwrite(true) { //TODO: Reset speed/acc back to null vector? Or allow null pointer? - connect(this, SIGNAL(maxParticleCountChanged(int)), + connect(this, SIGNAL(maximumEmittedChanged(int)), this, SIGNAL(particleCountChanged())); connect(this, SIGNAL(particlesPerSecondChanged(qreal)), this, SIGNAL(particleCountChanged())); @@ -243,16 +258,14 @@ void QSGParticleEmitter::componentComplete() { if (!m_system && qobject_cast<QSGParticleSystem*>(parentItem())) setSystem(qobject_cast<QSGParticleSystem*>(parentItem())); - if (!m_system) - qWarning() << "Emitter created without a particle system specified";//TODO: useful QML warnings, like line number? QSGItem::componentComplete(); } -void QSGParticleEmitter::setEmitting(bool arg) +void QSGParticleEmitter::setEnabled(bool arg) { - if (m_emitting != arg) { - m_emitting = arg; - emit emittingChanged(arg); + if (m_enabled != arg) { + m_enabled = arg; + emit enabledChanged(arg); } } @@ -270,7 +283,7 @@ void QSGParticleEmitter::pulse(qreal seconds) { if (!particleCount()) qWarning() << "pulse called on an emitter with a particle count of zero"; - if (!m_emitting) + if (!m_enabled) m_burstLeft = seconds*1000.0;//TODO: Change name to match } @@ -302,8 +315,9 @@ void QSGParticleEmitter::setMaxParticleCount(int arg) disconnect(this, SIGNAL(particleDurationChanged(int)), this, SIGNAL(particleCountChanged())); } + m_overwrite = arg < 0; m_maxParticleCount = arg; - emit maxParticleCountChanged(arg); + emit maximumEmittedChanged(arg); } } @@ -331,7 +345,7 @@ void QSGParticleEmitter::emitWindow(int timeStamp) { if (m_system == 0) return; - if ((!m_emitting || !m_particlesPerSecond)&& !m_burstLeft && m_burstQueue.isEmpty()){ + if ((!m_enabled || !m_particlesPerSecond)&& !m_burstLeft && m_burstQueue.isEmpty()){ m_reset_last = true; return; } @@ -339,7 +353,7 @@ void QSGParticleEmitter::emitWindow(int timeStamp) if (m_reset_last) { m_last_emitter = m_last_last_emitter = QPointF(x(), y()); if (m_last_timestamp == -1) - m_last_timestamp = timeStamp/1000. - m_startTime; + m_last_timestamp = (timeStamp - m_startTime)/1000.; else m_last_timestamp = timeStamp/1000.; m_last_emission = m_last_timestamp; @@ -350,12 +364,11 @@ void QSGParticleEmitter::emitWindow(int timeStamp) if (m_burstLeft){ m_burstLeft -= timeStamp - m_last_timestamp * 1000.; if (m_burstLeft < 0){ - if (!m_emitting) + if (!m_enabled) timeStamp += m_burstLeft; m_burstLeft = 0; } } - qreal time = timeStamp / 1000.; qreal particleRatio = 1. / m_particlesPerSecond; qreal pt = m_last_emission; @@ -379,7 +392,7 @@ void QSGParticleEmitter::emitWindow(int timeStamp) qreal sizeAtEnd = m_particleEndSize >= 0 ? m_particleEndSize : m_particleSize; qreal emitter_x_offset = m_last_emitter.x() - x(); qreal emitter_y_offset = m_last_emitter.y() - y(); - if (!m_burstQueue.isEmpty() && !m_burstLeft && !m_emitting)//'outside time' emissions only + if (!m_burstQueue.isEmpty() && !m_burstLeft && !m_enabled)//'outside time' emissions only pt = time; while ((pt < time && m_emitCap) || !m_burstQueue.isEmpty()) { //int pos = m_last_particle % m_particle_count; diff --git a/src/declarative/particles/qsgparticleemitter_p.h b/src/declarative/particles/qsgparticleemitter_p.h index 9e1fc7a9d8..8ed7ee7053 100644 --- a/src/declarative/particles/qsgparticleemitter_p.h +++ b/src/declarative/particles/qsgparticleemitter_p.h @@ -46,7 +46,7 @@ #include <QDebug> #include "qsgparticlesystem_p.h" #include "qsgparticleextruder_p.h" -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" #include <QList> #include <QPair> @@ -63,21 +63,20 @@ class QSGParticleEmitter : public QSGItem Q_PROPERTY(QSGParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged) Q_PROPERTY(QString particle READ particle WRITE setParticle NOTIFY particleChanged) Q_PROPERTY(QSGParticleExtruder* shape READ extruder WRITE setExtruder NOTIFY extruderChanged) - Q_PROPERTY(bool emitting READ emitting WRITE setEmitting NOTIFY emittingChanged) + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged) - Q_PROPERTY(bool noCap READ overwrite WRITE setOverWrite NOTIFY overwriteChanged) Q_PROPERTY(qreal emitRate READ particlesPerSecond WRITE setParticlesPerSecond NOTIFY particlesPerSecondChanged) Q_PROPERTY(int lifeSpan READ particleDuration WRITE setParticleDuration NOTIFY particleDurationChanged) Q_PROPERTY(int lifeSpanVariation READ particleDurationVariation WRITE setParticleDurationVariation NOTIFY particleDurationVariationChanged) - Q_PROPERTY(int emitCap READ maxParticleCount WRITE setMaxParticleCount NOTIFY maxParticleCountChanged) + Q_PROPERTY(int maximumEmitted READ maxParticleCount WRITE setMaxParticleCount NOTIFY maximumEmittedChanged) Q_PROPERTY(qreal size READ particleSize WRITE setParticleSize NOTIFY particleSizeChanged) Q_PROPERTY(qreal endSize READ particleEndSize WRITE setParticleEndSize NOTIFY particleEndSizeChanged) Q_PROPERTY(qreal sizeVariation READ particleSizeVariation WRITE setParticleSizeVariation NOTIFY particleSizeVariationChanged) - Q_PROPERTY(QSGStochasticDirection *speed READ speed WRITE setSpeed NOTIFY speedChanged) - Q_PROPERTY(QSGStochasticDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged) + Q_PROPERTY(QSGDirection *speed READ speed WRITE setSpeed NOTIFY speedChanged) + Q_PROPERTY(QSGDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged) Q_PROPERTY(qreal speedFromMovement READ speedFromMovement WRITE setSpeedFromMovement NOTIFY speedFromMovementChanged) Q_ENUMS(Lifetime) @@ -90,9 +89,9 @@ public: InfiniteLife = QSGParticleSystem::maxLife }; - bool emitting() const + bool enabled() const { - return m_emitting; + return m_enabled; } qreal particlesPerSecond() const @@ -127,7 +126,7 @@ signals: void emitParticle(QDeclarativeV8Handle particle); void particlesPerSecondChanged(qreal); void particleDurationChanged(int); - void emittingChanged(bool); + void enabledChanged(bool); void systemChanged(QSGParticleSystem* arg); @@ -143,25 +142,23 @@ signals: void particleSizeVariationChanged(qreal arg); - void speedChanged(QSGStochasticDirection * arg); + void speedChanged(QSGDirection * arg); - void accelerationChanged(QSGStochasticDirection * arg); + void accelerationChanged(QSGDirection * arg); - void maxParticleCountChanged(int arg); + void maximumEmittedChanged(int arg); void particleCountChanged(); void speedFromMovementChanged(); void startTimeChanged(int arg); - void overwriteChanged(bool arg); - public slots: void pulse(qreal seconds); void burst(int num); void burst(int num, qreal x, qreal y); - void setEmitting(bool arg); + void setEnabled(bool arg); void setParticlesPerSecond(qreal arg) { @@ -179,95 +176,87 @@ public slots: } } - void setSystem(QSGParticleSystem* arg) + void setSystem(QSGParticleSystem* arg) { if (m_system != arg) { m_system = arg; m_system->registerParticleEmitter(this); emit systemChanged(arg); } - } - - void setParticle(QString arg) - { - if (m_particle != arg) { - m_particle = arg; - emit particleChanged(arg); - } - } + } - void setParticleDurationVariation(int arg) - { - if (m_particleDurationVariation != arg) { - m_particleDurationVariation = arg; - emit particleDurationVariationChanged(arg); - } - } - void setExtruder(QSGParticleExtruder* arg) - { - if (m_extruder != arg) { - m_extruder = arg; - emit extruderChanged(arg); - } - } + void setParticle(QString arg) + { + if (m_particle != arg) { + m_particle = arg; + emit particleChanged(arg); + } + } - void setParticleSize(qreal arg) - { - if (m_particleSize != arg) { - m_particleSize = arg; - emit particleSizeChanged(arg); - } - } + void setParticleDurationVariation(int arg) + { + if (m_particleDurationVariation != arg) { + m_particleDurationVariation = arg; + emit particleDurationVariationChanged(arg); + } + } + void setExtruder(QSGParticleExtruder* arg) + { + if (m_extruder != arg) { + m_extruder = arg; + emit extruderChanged(arg); + } + } - void setParticleEndSize(qreal arg) - { - if (m_particleEndSize != arg) { - m_particleEndSize = arg; - emit particleEndSizeChanged(arg); - } - } + void setParticleSize(qreal arg) + { + if (m_particleSize != arg) { + m_particleSize = arg; + emit particleSizeChanged(arg); + } + } - void setParticleSizeVariation(qreal arg) - { - if (m_particleSizeVariation != arg) { - m_particleSizeVariation = arg; - emit particleSizeVariationChanged(arg); - } - } + void setParticleEndSize(qreal arg) + { + if (m_particleEndSize != arg) { + m_particleEndSize = arg; + emit particleEndSizeChanged(arg); + } + } - void setSpeed(QSGStochasticDirection * arg) - { - if (m_speed != arg) { - m_speed = arg; - emit speedChanged(arg); - } - } + void setParticleSizeVariation(qreal arg) + { + if (m_particleSizeVariation != arg) { + m_particleSizeVariation = arg; + emit particleSizeVariationChanged(arg); + } + } - void setAcceleration(QSGStochasticDirection * arg) - { - if (m_acceleration != arg) { - m_acceleration = arg; - emit accelerationChanged(arg); - } - } + void setSpeed(QSGDirection * arg) + { + if (m_speed != arg) { + m_speed = arg; + emit speedChanged(arg); + } + } - void setMaxParticleCount(int arg); + void setAcceleration(QSGDirection * arg) + { + if (m_acceleration != arg) { + m_acceleration = arg; + emit accelerationChanged(arg); + } + } - void setStartTime(int arg) - { - if (m_startTime != arg) { - m_startTime = arg; - emit startTimeChanged(arg); - } - } + void setMaxParticleCount(int arg); - void setOverWrite(bool arg) - { - if (m_overwrite != arg) { - m_overwrite = arg; - emit overwriteChanged(arg); - } - } + void setStartTime(int arg) + { + if (m_startTime != arg) { + m_startTime = arg; + emit startTimeChanged(arg); + } + } virtual void reset(); public: @@ -293,12 +282,12 @@ public: return m_particleSizeVariation; } - QSGStochasticDirection * speed() const + QSGDirection * speed() const { return m_speed; } - QSGStochasticDirection * acceleration() const + QSGDirection * acceleration() const { return m_acceleration; } @@ -313,23 +302,18 @@ public: return m_startTime; } - bool overwrite() const - { - return m_overwrite; - } - protected: qreal m_particlesPerSecond; int m_particleDuration; int m_particleDurationVariation; - bool m_emitting; + bool m_enabled; QSGParticleSystem* m_system; QString m_particle; QSGParticleExtruder* m_extruder; QSGParticleExtruder* m_defaultExtruder; QSGParticleExtruder* effectiveExtruder(); - QSGStochasticDirection * m_speed; - QSGStochasticDirection * m_acceleration; + QSGDirection * m_speed; + QSGDirection * m_acceleration; qreal m_particleSize; qreal m_particleEndSize; qreal m_particleSizeVariation; @@ -356,7 +340,7 @@ protected: bool isEmitConnected(); private: - QSGStochasticDirection m_nullVector; + QSGDirection m_nullVector; }; diff --git a/src/declarative/particles/qsgparticleextruder.cpp b/src/declarative/particles/qsgparticleextruder.cpp index a390bb92ac..73c8ce0a66 100644 --- a/src/declarative/particles/qsgparticleextruder.cpp +++ b/src/declarative/particles/qsgparticleextruder.cpp @@ -52,30 +52,14 @@ QT_BEGIN_NAMESPACE */ QSGParticleExtruder::QSGParticleExtruder(QObject *parent) : - QObject(parent), m_fill(true) + QObject(parent) { } QPointF QSGParticleExtruder::extrude(const QRectF &rect) { - if (m_fill) - return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), - ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); - int side = rand() % 4; - switch (side){//TODO: Doesn't this overlap the corners? - case 0: - return QPointF(rect.x(), - ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); - case 1: - return QPointF(rect.width() + rect.x(), - ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); - case 2: - return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), - rect.y()); - default: - return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), - rect.height() + rect.y()); - } + return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), + ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); } bool QSGParticleExtruder::contains(const QRectF &bounds, const QPointF &point) diff --git a/src/declarative/particles/qsgparticleextruder_p.h b/src/declarative/particles/qsgparticleextruder_p.h index bb2cc24ac2..b31b80231d 100644 --- a/src/declarative/particles/qsgparticleextruder_p.h +++ b/src/declarative/particles/qsgparticleextruder_p.h @@ -55,32 +55,15 @@ QT_MODULE(Declarative) class QSGParticleExtruder : public QObject { Q_OBJECT - Q_PROPERTY(bool fill READ fill WRITE setFill NOTIFY fillChanged)//###Should this be base class, or a BoxExtruder? public: explicit QSGParticleExtruder(QObject *parent = 0); virtual QPointF extrude(const QRectF &); - virtual bool contains(const QRectF &bounds, const QPointF &point);//###Needed for follow emitter, but does it belong? Only marginally conceptually valid, and that's from user's perspective - bool fill() const - { - return m_fill; - } + virtual bool contains(const QRectF &bounds, const QPointF &point); signals: - - void fillChanged(bool arg); - public slots: - - void setFill(bool arg) - { - if (m_fill != arg) { - m_fill = arg; - emit fillChanged(arg); - } - } protected: - bool m_fill; }; QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgparticlepainter.cpp b/src/declarative/particles/qsgparticlepainter.cpp index 97333ff20b..f4639c20a2 100644 --- a/src/declarative/particles/qsgparticlepainter.cpp +++ b/src/declarative/particles/qsgparticlepainter.cpp @@ -103,12 +103,16 @@ void QSGParticlePainter::setSystem(QSGParticleSystem *arg) void QSGParticlePainter::load(QSGParticleData* d) { + if (m_pleaseReset) + return; initialize(d->group, d->index); m_pendingCommits << qMakePair<int, int>(d->group, d->index); } void QSGParticlePainter::reload(QSGParticleData* d) { + if (m_pleaseReset) + return; m_pendingCommits << qMakePair<int, int>(d->group, d->index); } diff --git a/src/declarative/particles/qsgparticlesmodule.cpp b/src/declarative/particles/qsgparticlesmodule.cpp index e6076b925f..9fa0ebad97 100644 --- a/src/declarative/particles/qsgparticlesmodule.cpp +++ b/src/declarative/particles/qsgparticlesmodule.cpp @@ -39,18 +39,17 @@ ** ****************************************************************************/ -#include "qsgangleddirection_p.h" +#include "qsgangledirection_p.h" #include "qsgcustomparticle_p.h" #include "qsgellipseextruder_p.h" -#include "qsgfollowemitter_p.h" +#include "qsgtrailemitter_p.h" #include "qsgfriction_p.h" #include "qsggravity_p.h" #include "qsgimageparticle_p.h" #include "qsgitemparticle_p.h" -#include "qsgkill_p.h" +#include "qsgage_p.h" #include "qsglineextruder_p.h" #include "qsgmaskextruder_p.h" -#include "qsgmodelparticle_p.h" #include "qsgparticleaffector_p.h" #include "qsgparticleemitter_p.h" #include "qsgparticleextruder_p.h" @@ -60,12 +59,14 @@ #include "qsgpointattractor_p.h" #include "qsgpointdirection_p.h" #include "qsgspritegoal_p.h" -#include "qsgstochasticdirection_p.h" -#include "qsgtargeteddirection_p.h" +#include "qsgdirection_p.h" +#include "qsgtargetdirection_p.h" #include "qsgturbulence_p.h" #include "qsgwander_p.h" #include "qsgtargetaffector_p.h" #include "qsgcumulativedirection_p.h" +#include "qsgcustomaffector_p.h" +#include "qsgrectangleextruder_p.h" QT_BEGIN_NAMESPACE @@ -78,34 +79,35 @@ void QSGParticlesModule::defineModule() qmlRegisterType<QSGImageParticle>(uri, 2, 0, "ImageParticle"); qmlRegisterType<QSGCustomParticle>(uri, 2, 0, "CustomParticle"); qmlRegisterType<QSGItemParticle>(uri, 2, 0, "ItemParticle"); - qmlRegisterType<QSGModelParticle>(uri, 2, 0, "ModelParticle"); qmlRegisterType<QSGParticleEmitter>(uri, 2, 0, "Emitter"); - qmlRegisterType<QSGFollowEmitter>(uri, 2, 0, "FollowEmitter"); + qmlRegisterType<QSGTrailEmitter>(uri, 2, 0, "TrailEmitter"); qmlRegisterType<QSGEllipseExtruder>(uri, 2, 0, "EllipseShape"); + qmlRegisterType<QSGRectangleExtruder>(uri, 2, 0, "RectangleShape"); qmlRegisterType<QSGLineExtruder>(uri, 2, 0, "LineShape"); qmlRegisterType<QSGMaskExtruder>(uri, 2, 0, "MaskShape"); qmlRegisterType<QSGPointDirection>(uri, 2, 0, "PointDirection"); - qmlRegisterType<QSGAngledDirection>(uri, 2, 0, "AngledDirection"); - qmlRegisterType<QSGTargetedDirection>(uri, 2, 0, "TargetedDirection"); + qmlRegisterType<QSGAngleDirection>(uri, 2, 0, "AngleDirection"); + qmlRegisterType<QSGTargetDirection>(uri, 2, 0, "TargetDirection"); qmlRegisterType<QSGCumulativeDirection>(uri, 2, 0, "CumulativeDirection"); - qmlRegisterType<QSGParticleAffector>(uri, 2, 0, "Affector");//useful for the triggered signal + qmlRegisterType<QSGCustomAffector>(uri, 2, 0, "Affector"); qmlRegisterType<QSGWanderAffector>(uri, 2, 0, "Wander"); qmlRegisterType<QSGFrictionAffector>(uri, 2, 0, "Friction"); - qmlRegisterType<QSGPointAttractorAffector>(uri, 2, 0, "PointAttractor"); + qmlRegisterType<QSGAttractorAffector>(uri, 2, 0, "Attractor"); qmlRegisterType<QSGGravityAffector>(uri, 2, 0, "Gravity"); - qmlRegisterType<QSGKillAffector>(uri, 2, 0, "Kill"); + qmlRegisterType<QSGAgeAffector>(uri, 2, 0, "Age"); qmlRegisterType<QSGSpriteGoalAffector>(uri, 2, 0, "SpriteGoal"); qmlRegisterType<QSGTurbulenceAffector>(uri, 2, 0 , "Turbulence"); qmlRegisterType<QSGTargetAffector>(uri, 2, 0 , "Target"); //Exposed just for completeness - qmlRegisterType<QSGParticlePainter>(uri, 2, 0, "ParticlePainter"); - qmlRegisterType<QSGParticleExtruder>(uri, 2, 0, "ParticleExtruder"); - qmlRegisterType<QSGStochasticDirection>(uri, 2, 0, "NullVector"); + qmlRegisterUncreatableType<QSGParticleAffector>(uri, 2, 0, "ParticleAffector", "Abstract type. Use one of the inheriting types instead."); + qmlRegisterUncreatableType<QSGParticlePainter>(uri, 2, 0, "ParticlePainter", "Abstract type. Use one of the inheriting types instead."); + qmlRegisterUncreatableType<QSGParticleExtruder>(uri, 2, 0, "ParticleExtruder", "Abstract type. Use one of the inheriting types instead."); + qmlRegisterUncreatableType<QSGDirection>(uri, 2, 0, "NullVector", "Abstract type. Use one of the inheriting types instead."); } QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgparticlesystem.cpp b/src/declarative/particles/qsgparticlesystem.cpp index 534b1ca8a1..425df349e5 100644 --- a/src/declarative/particles/qsgparticlesystem.cpp +++ b/src/declarative/particles/qsgparticlesystem.cpp @@ -48,7 +48,7 @@ #include "qsgsprite_p.h" #include "qsgv8particledata_p.h" -#include "qsgfollowemitter_p.h"//###For auto-follow on states, perhaps should be in emitter? +#include "qsgtrailemitter_p.h"//###For auto-follow on states, perhaps should be in emitter? #include <private/qdeclarativeengine_p.h> #include <cmath> #include <QDebug> @@ -98,13 +98,6 @@ DEFINE_BOOL_CONFIG_OPTION(qmlParticlesDebug, QML_PARTICLES_DEBUG) To kill all the particles in the system, use a Kill affector. */ -/*! - \qmlproperty int QtQuick.Particles2::ParticleSystem::startTime - - If start time is specified, then the system will simulate up to this time - before the system starts playing. This allows you to appear to start with a - fully populated particle system, instead of starting with no particles visible. -*/ /*! \qmlproperty list<Sprite> QtQuick.Particles2::ParticleSystem::particleStates @@ -113,10 +106,55 @@ DEFINE_BOOL_CONFIG_OPTION(qmlParticlesDebug, QML_PARTICLES_DEBUG) Each QtQuick2::Sprite in this list is interpreted as corresponding to the particle group with ths same name. Any transitions defined in these sprites will take effect on the particle - groups as well. Additionally FollowEmitters, Affectors and ParticlePainters definined + groups as well. Additionally TrailEmitters, Affectors and ParticlePainters definined inside one of these sprites are automatically associated with the corresponding particle group. */ +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::pause + + Pauses the simulation if it is running. + + \sa resume, paused +*/ + +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::resume + + Resumes the simulation if it is paused. + + \sa pause, paused +*/ + +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::start + + Starts the simulation if it has not already running. + + \sa stop, restart, running +*/ + +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::stop + + Stops the simulation if it is running. + + \sa start, restart, running +*/ + +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::restart + + Stops the simulation if it is running, and then starts it. + + \sa stop, restart, running +*/ +/*! + \qmlmethod void QtQuick.Particles2::ParticleSystem::reset + + Discards all currently existing particles. + +*/ const qreal EPSILON = 0.001; //Utility functions for when within 1ms is close enough bool timeEqualOrGreater(qreal a, qreal b){ @@ -562,8 +600,8 @@ void QSGParticleData::extendLife(float time) } QSGParticleSystem::QSGParticleSystem(QSGItem *parent) : - QSGItem(parent), m_particle_count(0), m_running(true) - , m_startTime(0), m_nextIndex(0), m_componentComplete(false), m_spriteEngine(0) + QSGItem(parent), m_particle_count(0), m_running(true), m_paused(false) + , m_nextIndex(0), m_componentComplete(false), m_spriteEngine(0) { connect(&m_painterMapper, SIGNAL(mapped(QObject*)), this, SLOT(loadPainter(QObject*))); @@ -663,7 +701,7 @@ void QSGParticleSystem::stateRedirect(QDeclarativeListProperty<QObject> *prop, Q a->setSystem(sys); return; } - QSGFollowEmitter* fe = qobject_cast<QSGFollowEmitter*>(value); + QSGTrailEmitter* fe = qobject_cast<QSGTrailEmitter*>(value); if (fe){ fe->setParentItem(sys); fe->setFollow(sprite->name()); @@ -726,8 +764,9 @@ void QSGParticleSystem::reset() //### Do affectors need reset too? - if (m_animation){//reset restarts animation (if running) - m_animation->stop(); + if (m_running) {//reset restarts animation (if running) + if ((m_animation->state() == QAbstractAnimation::Running)) + m_animation->stop(); m_animation->start(); if (m_paused) m_animation->pause(); @@ -927,7 +966,7 @@ QSGParticleData* QSGParticleSystem::newDatum(int groupId, bool respectLimits, in if (m_spriteEngine) m_spriteEngine->startSprite(ret->systemIndex, ret->group); - m_clear = false; + m_empty = false; return ret; } @@ -962,15 +1001,15 @@ void QSGParticleSystem::updateCurrentTime( int currentTime ) //### Elapsed time never shrinks - may cause problems if left emitting for weeks at a time. qreal dt = m_timeInt / 1000.; - m_timeInt = currentTime + m_startTime; + m_timeInt = currentTime; qreal time = m_timeInt / 1000.; dt = time - dt; m_needsReset.clear(); - bool oldClear = m_clear; - m_clear = true; + bool oldClear = m_empty; + m_empty = true; foreach (QSGParticleGroupData* gd, m_groupData)//Recycle all groups and see if they're out of live particles - m_clear = m_clear && gd->recycle(); + m_empty = m_empty && gd->recycle(); if (m_spriteEngine) m_spriteEngine->updateSprites(m_timeInt); @@ -986,8 +1025,8 @@ void QSGParticleSystem::updateCurrentTime( int currentTime ) if (p && d) p->reload(d); - if (oldClear != m_clear) - clearChanged(m_clear); + if (oldClear != m_empty) + emptyChanged(m_empty); } int QSGParticleSystem::systemSync(QSGParticlePainter* p) diff --git a/src/declarative/particles/qsgparticlesystem_p.h b/src/declarative/particles/qsgparticlesystem_p.h index 17b67d9cce..25a0c87f53 100644 --- a/src/declarative/particles/qsgparticlesystem_p.h +++ b/src/declarative/particles/qsgparticlesystem_p.h @@ -222,8 +222,7 @@ class QSGParticleSystem : public QSGItem Q_OBJECT Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged) Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged) - Q_PROPERTY(bool clear READ isClear NOTIFY clearChanged) - Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged) + Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) Q_PROPERTY(QDeclarativeListProperty<QSGSprite> particleStates READ particleStates) public: @@ -237,11 +236,6 @@ public: return m_running; } - int startTime() const - { - return m_startTime; - } - int count(){ return m_particle_count; } static const int maxLife = 600000; @@ -250,13 +244,8 @@ signals: void systemInitialized(); void runningChanged(bool arg); - - void startTimeChanged(int arg); - - void pausedChanged(bool arg); - - void clearChanged(bool arg); + void emptyChanged(bool arg); public slots: void start(){setRunning(true);} @@ -269,16 +258,6 @@ public slots: void setRunning(bool arg); void setPaused(bool arg); - void setStartTime(int arg) - { - m_startTime = arg; - } - - void fastForward(int ms) - { - m_startTime += ms; - } - virtual int duration() const { return -1; } @@ -323,9 +302,9 @@ public://###but only really for related class usage. Perhaps we should all be fr return m_paused; } - bool isClear() const + bool isEmpty() const { - return m_clear; + return m_empty; } private: @@ -336,7 +315,6 @@ private: QList<QPointer<QSGParticleAffector> > m_affectors; QList<QPointer<QSGParticlePainter> > m_painters; QList<QPointer<QSGParticlePainter> > m_syncList; - qint64 m_startTime; int m_nextGroupId; int m_nextIndex; QSet<int> m_reusableIndexes; @@ -351,7 +329,7 @@ private: bool m_paused; bool m_debugMode; bool m_allDead; - bool m_clear; + bool m_empty; }; // Internally, this animation drives all the timing. Painters sync up in their updatePaintNode diff --git a/src/declarative/particles/qsgpointattractor.cpp b/src/declarative/particles/qsgpointattractor.cpp index c916e4da94..8c2632f2c8 100644 --- a/src/declarative/particles/qsgpointattractor.cpp +++ b/src/declarative/particles/qsgpointattractor.cpp @@ -44,16 +44,16 @@ #include <QDebug> QT_BEGIN_NAMESPACE /*! - \qmlclass PointAttractor QSGPointAttractorAffector + \qmlclass Attractor QSGAttractorAffector \inqmlmodule QtQuick.Particles 2 \inherits Affector - \brief The PointAttractor allows you to attract particles towards a specific point. + \brief The Attractor allows you to attract particles towards a specific point. Note that the size and position of this element affects which particles it affects. The size of the point attracted to is always 0x0, and the location of that point is specified by the pointX and pointY properties. - Note that PointAttractor has the standard Item x,y,width and height properties. + Note that Attractor has the standard Item x,y,width and height properties. Like other affectors, these represent the affected area. They do not represent the 0x0 point which is the target of the attraction. @@ -62,45 +62,57 @@ QT_BEGIN_NAMESPACE /*! \qmlproperty real QtQuick.Particles2::PointAttractor::pointX + + The x coordinate of the attracting point. This is relative + to the x coordinate of the Attractor. */ /*! \qmlproperty real QtQuick.Particles2::PointAttractor::pointY + + The x coordinate of the attracting point. This is relative + to the x coordinate of the Attractor. */ /*! \qmlproperty real QtQuick.Particles2::PointAttractor::strength + + The pull, in units per second, to be exerted on an item one pixel away. + + Depending on how the attraction is proportionalToDistance this may have to + be very high or very low to have a reasonable effect on particles at a + distance. */ /*! - \qmlproperty PhysicsAffects QtQuick.Particles2::PointAttractor::physics + \qmlproperty AffectableParameter QtQuick.Particles2::Attractor::affectedParameter What attribute of particles is directly affected. \list - \o PointAttractor.Position - \o PointAttractor.Velocity - \o PointAttractor.Acceleration + \o Attractor.Position + \o Attractor.Velocity + \o Attractor.Acceleration \endlist */ /*! - \qmlproperty Proportion QtQuick.Particles2::PointAttractor::proportionalToDistance + \qmlproperty Proportion QtQuick.Particles2::Attractor::proportionalToDistance How the distance from the particle to the point affects the strength of the attraction. \list - \o PointAttractor.Constant - \o PointAttractor.Linear - \o PointAttractor.InverseLinear - \o PointAttractor.Quadratic - \o PointAttractor.InverseQuadratic + \o Attractor.Constant + \o Attractor.Linear + \o Attractor.InverseLinear + \o Attractor.Quadratic + \o Attractor.InverseQuadratic \endlist */ -QSGPointAttractorAffector::QSGPointAttractorAffector(QSGItem *parent) : +QSGAttractorAffector::QSGAttractorAffector(QSGItem *parent) : QSGParticleAffector(parent), m_strength(0.0), m_x(0), m_y(0) , m_physics(Velocity), m_proportionalToDistance(Linear) { } -bool QSGPointAttractorAffector::affectParticle(QSGParticleData *d, qreal dt) +bool QSGAttractorAffector::affectParticle(QSGParticleData *d, qreal dt) { if (m_strength == 0.0) return false; diff --git a/src/declarative/particles/qsgpointattractor_p.h b/src/declarative/particles/qsgpointattractor_p.h index e2cdd0fdca..75dd47e331 100644 --- a/src/declarative/particles/qsgpointattractor_p.h +++ b/src/declarative/particles/qsgpointattractor_p.h @@ -49,15 +49,15 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGPointAttractorAffector : public QSGParticleAffector +class QSGAttractorAffector : public QSGParticleAffector { Q_OBJECT Q_PROPERTY(qreal strength READ strength WRITE setStrength NOTIFY strengthChanged) Q_PROPERTY(qreal pointX READ pointX WRITE setPointX NOTIFY pointXChanged) Q_PROPERTY(qreal pointY READ pointY WRITE setPointY NOTIFY pointYChanged) - Q_PROPERTY(PhysicsAffects physics READ physics WRITE setPhysics NOTIFY physicsChanged) + Q_PROPERTY(AffectableParameters affectedParameter READ affectedParameter WRITE setAffectedParameter NOTIFY affectedParameterChanged) Q_PROPERTY(Proportion proportionalToDistance READ proportionalToDistance WRITE setProportionalToDistance NOTIFY proportionalToDistanceChanged) - Q_ENUMS(PhysicsAffects) + Q_ENUMS(AffectableParameters) Q_ENUMS(Proportion) public: @@ -69,13 +69,13 @@ public: InverseQuadratic }; - enum PhysicsAffects { + enum AffectableParameters { Position, Velocity, Acceleration }; - explicit QSGPointAttractorAffector(QSGItem *parent = 0); + explicit QSGAttractorAffector(QSGItem *parent = 0); qreal strength() const { @@ -92,7 +92,7 @@ public: return m_y; } - PhysicsAffects physics() const + AffectableParameters affectedParameter() const { return m_physics; } @@ -110,7 +110,7 @@ signals: void pointYChanged(qreal arg); - void physicsChanged(PhysicsAffects arg); + void affectedParameterChanged(AffectableParameters arg); void proportionalToDistanceChanged(Proportion arg); @@ -138,11 +138,11 @@ void setPointY(qreal arg) emit pointYChanged(arg); } } -void setPhysics(PhysicsAffects arg) +void setAffectedParameter(AffectableParameters arg) { if (m_physics != arg) { m_physics = arg; - emit physicsChanged(arg); + emit affectedParameterChanged(arg); } } @@ -160,7 +160,7 @@ private: qreal m_strength; qreal m_x; qreal m_y; -PhysicsAffects m_physics; +AffectableParameters m_physics; Proportion m_proportionalToDistance; }; diff --git a/src/declarative/particles/qsgpointdirection.cpp b/src/declarative/particles/qsgpointdirection.cpp index 7cc0823eec..dc104c1a81 100644 --- a/src/declarative/particles/qsgpointdirection.cpp +++ b/src/declarative/particles/qsgpointdirection.cpp @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE /*! \qmlclass PointDirection QSGPointDirection \inqmlmodule QtQuick.Particles 2 - \inherits StochasticDirection + \inherits Direction \brief The PointDirection element allows you to specify a direction that varies in x and y components The PointDirection element allows both the specification of a direction by x and y components, @@ -66,7 +66,7 @@ QT_BEGIN_NAMESPACE */ QSGPointDirection::QSGPointDirection(QObject *parent) : - QSGStochasticDirection(parent) + QSGDirection(parent) , m_x(0) , m_y(0) , m_xVariation(0) diff --git a/src/declarative/particles/qsgpointdirection_p.h b/src/declarative/particles/qsgpointdirection_p.h index 6a6beb6623..ca00824a3e 100644 --- a/src/declarative/particles/qsgpointdirection_p.h +++ b/src/declarative/particles/qsgpointdirection_p.h @@ -41,7 +41,7 @@ #ifndef POINTVECTOR_H #define POINTVECTOR_H -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" QT_BEGIN_HEADER @@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGPointDirection : public QSGStochasticDirection +class QSGPointDirection : public QSGDirection { Q_OBJECT Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged) diff --git a/src/declarative/particles/qsgrectangleextruder.cpp b/src/declarative/particles/qsgrectangleextruder.cpp new file mode 100644 index 0000000000..accc88fcdb --- /dev/null +++ b/src/declarative/particles/qsgrectangleextruder.cpp @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Declarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsgrectangleextruder_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmlclass RectangleShape QSGRectangleExtruder + \inqmlmodule QtQuick.Particles 2 + \brief The RectangleShape element allows you to specify an area for affectors and emitter. + + Just a rectangle. +*/ + +QSGRectangleExtruder::QSGRectangleExtruder(QObject *parent) : + QObject(parent), m_fill(true) +{ +} + +QPointF QSGRectangleExtruder::extrude(const QRectF &rect) +{ + if (m_fill) + return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), + ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); + int side = rand() % 4; + switch (side){//TODO: Doesn't this overlap the corners? + case 0: + return QPointF(rect.x(), + ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); + case 1: + return QPointF(rect.width() + rect.x(), + ((qreal)rand() / RAND_MAX) * rect.height() + rect.y()); + case 2: + return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), + rect.y()); + default: + return QPointF(((qreal)rand() / RAND_MAX) * rect.width() + rect.x(), + rect.height() + rect.y()); + } +} + +bool QSGRectangleExtruder::contains(const QRectF &bounds, const QPointF &point) +{ + return bounds.contains(point); +} + +QT_END_NAMESPACE diff --git a/src/declarative/particles/qsgrectangleextruder_p.h b/src/declarative/particles/qsgrectangleextruder_p.h new file mode 100644 index 0000000000..5795375c84 --- /dev/null +++ b/src/declarative/particles/qsgrectangleextruder_p.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Declarative module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RECTANGLEEXTRUDER_H +#define RECTANGLEEXTRUDER_H + +#include "qsgparticleextruder_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +class QSGRectangleExtruder : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool fill READ fill WRITE setFill NOTIFY fillChanged) + +public: + explicit QSGRectangleExtruder(QObject *parent = 0); + virtual QPointF extrude(const QRectF &); + virtual bool contains(const QRectF &bounds, const QPointF &point); + bool fill() const + { + return m_fill; + } + +signals: + + void fillChanged(bool arg); + +public slots: + + void setFill(bool arg) + { + if (m_fill != arg) { + m_fill = arg; + emit fillChanged(arg); + } + } +protected: + bool m_fill; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // RectangleEXTRUDER_H diff --git a/src/declarative/particles/qsgtargeteddirection.cpp b/src/declarative/particles/qsgtargetdirection.cpp similarity index 81% rename from src/declarative/particles/qsgtargeteddirection.cpp rename to src/declarative/particles/qsgtargetdirection.cpp index 696cdfa915..d9a3ce5a74 100644 --- a/src/declarative/particles/qsgtargeteddirection.cpp +++ b/src/declarative/particles/qsgtargetdirection.cpp @@ -39,41 +39,41 @@ ** ****************************************************************************/ -#include "qsgtargeteddirection_p.h" +#include "qsgtargetdirection_p.h" #include "qsgparticleemitter_p.h" #include <cmath> #include <QDebug> QT_BEGIN_NAMESPACE /*! - \qmlclass TargetedDirection QSGTargetedDirection + \qmlclass TargetDirection QSGTargetDirection \inqmlmodule QtQuick.Particles 2 - \inherits StochasticDirection - \brief The TargetedDirection element allows you to specify a direction towards the target point + \inherits Direction + \brief The TargetDirection element allows you to specify a direction towards the target point */ /*! - \qmlproperty real QtQuick.Particles2::TargetedDirection::targetX + \qmlproperty real QtQuick.Particles2::TargetDirection::targetX */ /*! - \qmlproperty real QtQuick.Particles2::TargetedDirection::targetY + \qmlproperty real QtQuick.Particles2::TargetDirection::targetY */ /*! - \qmlproperty Item QtQuick.Particles2::TargetedDirection::targetItem + \qmlproperty Item QtQuick.Particles2::TargetDirection::targetItem If specified, this will take precedence over targetX and targetY. The targeted point will be the center of the specified Item */ /*! - \qmlproperty real QtQuick.Particles2::TargetedDirection::targetVariation + \qmlproperty real QtQuick.Particles2::TargetDirection::targetVariation */ /*! - \qmlproperty real QtQuick.Particles2::TargetedDirection::magnitude + \qmlproperty real QtQuick.Particles2::TargetDirection::magnitude */ /*! - \qmlproperty real QtQuick.Particles2::TargetedDirection::magnitudeVariation + \qmlproperty real QtQuick.Particles2::TargetDirection::magnitudeVariation */ /*! - \qmlproperty bool QtQuick.Particles2::TargetedDirection::proportionalMagnitude + \qmlproperty bool QtQuick.Particles2::TargetDirection::proportionalMagnitude If true, then the value of magnitude and magnitudeVariation shall be interpreted as multiples of the distance between the source point and the target point, per second. @@ -82,8 +82,8 @@ QT_BEGIN_NAMESPACE pixels per second. */ -QSGTargetedDirection::QSGTargetedDirection(QObject *parent) : - QSGStochasticDirection(parent) +QSGTargetDirection::QSGTargetDirection(QObject *parent) : + QSGDirection(parent) , m_targetX(0) , m_targetY(0) , m_targetVariation(0) @@ -94,7 +94,7 @@ QSGTargetedDirection::QSGTargetedDirection(QObject *parent) : { } -const QPointF &QSGTargetedDirection::sample(const QPointF &from) +const QPointF &QSGTargetDirection::sample(const QPointF &from) { //###This approach loses interpolating the last position of the target (like we could with the emitter) is it worthwhile? qreal targetX; diff --git a/src/declarative/particles/qsgtargeteddirection_p.h b/src/declarative/particles/qsgtargetdirection_p.h similarity index 97% rename from src/declarative/particles/qsgtargeteddirection_p.h rename to src/declarative/particles/qsgtargetdirection_p.h index 6fdd3f937d..8f4901a57b 100644 --- a/src/declarative/particles/qsgtargeteddirection_p.h +++ b/src/declarative/particles/qsgtargetdirection_p.h @@ -41,7 +41,7 @@ #ifndef DIRECTEDVECTOR_H #define DIRECTEDVECTOR_H -#include "qsgstochasticdirection_p.h" +#include "qsgdirection_p.h" QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -49,7 +49,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) class QSGItem; -class QSGTargetedDirection : public QSGStochasticDirection +class QSGTargetDirection : public QSGDirection { Q_OBJECT Q_PROPERTY(qreal targetX READ targetX WRITE setTargetX NOTIFY targetXChanged) @@ -65,7 +65,7 @@ class QSGTargetedDirection : public QSGStochasticDirection Q_PROPERTY(qreal magnitudeVariation READ magnitudeVariation WRITE setMagnitudeVariation NOTIFY magnitudeVariationChanged) public: - explicit QSGTargetedDirection(QObject *parent = 0); + explicit QSGTargetDirection(QObject *parent = 0); virtual const QPointF &sample(const QPointF &from); qreal targetX() const diff --git a/src/declarative/particles/qsgfollowemitter.cpp b/src/declarative/particles/qsgtrailemitter.cpp similarity index 85% rename from src/declarative/particles/qsgfollowemitter.cpp rename to src/declarative/particles/qsgtrailemitter.cpp index 68f0f6bf75..6bccf3ba8c 100644 --- a/src/declarative/particles/qsgfollowemitter.cpp +++ b/src/declarative/particles/qsgtrailemitter.cpp @@ -39,21 +39,20 @@ ** ****************************************************************************/ -#include "qsgfollowemitter_p.h" -#include "qsgparticlepainter_p.h"//TODO: What was this for again? +#include "qsgtrailemitter_p.h" #include <cmath> QT_BEGIN_NAMESPACE /*! - \qmlclass FollowEmitter QSGFollowEmitter + \qmlclass TrailEmitter QSGTrailEmitter \inqmlmodule QtQuick.Particles 2 \inherits QSGParticleEmitter - \brief The FollowEmitter element allows you to emit logical particles from other logical particles. + \brief The TrailEmitter element allows you to emit logical particles from other logical particles. This element emits logical particles into the ParticleSystem, with the starting positions based on those of other logical particles. */ -QSGFollowEmitter::QSGFollowEmitter(QSGItem *parent) : +QSGTrailEmitter::QSGTrailEmitter(QSGItem *parent) : QSGParticleEmitter(parent) , m_particlesPerParticlePerSecond(0) , m_lastTimeStamp(0) @@ -73,28 +72,37 @@ QSGFollowEmitter::QSGFollowEmitter(QSGItem *parent) : } /*! - \qmlproperty string QtQuick.Particles2::FollowEmitter::follow + \qmlproperty string QtQuick.Particles2::TrailEmitter::follow The type of logical particle which this is emitting from. */ +/*! + \qmlproperty qreal QtQuick.Particles2::TrailEmitter::speedFromMovement + + If this value is non-zero, then any movement of the emitter will provide additional + starting velocity to the particles based on the movement. The additional vector will be the + same angle as the emitter's movement, with a magnitude that is the magnitude of the emitters + movement multiplied by speedFromMovement. + Default value is 0. +*/ /*! - \qmlproperty Shape QtQuick.Particles2::FollowEmitter::emitShape + \qmlproperty Shape QtQuick.Particles2::TrailEmitter::emitShape - As the area of a FollowEmitter is the area it follows, a separate shape can be provided + As the area of a TrailEmitter is the area it follows, a separate shape can be provided to be the shape it emits out of. */ /*! - \qmlproperty real QtQuick.Particles2::FollowEmitter::emitWidth + \qmlproperty real QtQuick.Particles2::TrailEmitter::emitWidth */ /*! - \qmlproperty real QtQuick.Particles2::FollowEmitter::emitHeight + \qmlproperty real QtQuick.Particles2::TrailEmitter::emitHeight */ /*! - \qmlproperty real QtQuick.Particles2::FollowEmitter::emitRatePerParticle + \qmlproperty real QtQuick.Particles2::TrailEmitter::emitRatePerParticle */ /*! - \qmlsignal QtQuick.Particles2::FollowEmitter::emitFollowParticle(particle, followed) + \qmlsignal QtQuick.Particles2::TrailEmitter::emitFollowParticle(particle, followed) This handler is called when a particle is emitted. You can modify particle attributes from within the handler. followed is the particle that this is being @@ -103,13 +111,13 @@ QSGFollowEmitter::QSGFollowEmitter(QSGItem *parent) : If you use this signal handler, emitParticle will not be emitted. */ -bool QSGFollowEmitter::isEmitFollowConnected() +bool QSGTrailEmitter::isEmitFollowConnected() { static int idx = QObjectPrivate::get(this)->signalIndex("emitFollowParticle(QDeclarativeV8Handle,QDeclarativeV8Handle)"); return QObjectPrivate::get(this)->isSignalConnected(idx); } -void QSGFollowEmitter::recalcParticlesPerSecond(){ +void QSGTrailEmitter::recalcParticlesPerSecond(){ if (!m_system) return; m_followCount = m_system->m_groupData[m_system->m_groupIds[m_follow]]->size(); @@ -122,16 +130,16 @@ void QSGFollowEmitter::recalcParticlesPerSecond(){ } } -void QSGFollowEmitter::reset() +void QSGTrailEmitter::reset() { m_followCount = 0; } -void QSGFollowEmitter::emitWindow(int timeStamp) +void QSGTrailEmitter::emitWindow(int timeStamp) { if (m_system == 0) return; - if (!m_emitting && !m_burstLeft && m_burstQueue.isEmpty()) + if (!m_enabled && !m_burstLeft && m_burstQueue.isEmpty()) return; if (m_followCount != m_system->m_groupData[m_system->m_groupIds[m_follow]]->size()){ qreal oldPPS = m_particlesPerSecond; @@ -224,8 +232,8 @@ void QSGFollowEmitter::emitWindow(int timeStamp) float size = qMax((qreal)0.0, m_particleSize + sizeVariation); float endSize = qMax((qreal)0.0, sizeAtEnd + sizeVariation); - datum->size = size * float(m_emitting); - datum->endSize = endSize * float(m_emitting); + datum->size = size * float(m_enabled); + datum->endSize = endSize * float(m_enabled); if (isEmitFollowConnected()) emitFollowParticle(datum->v8Value(), d->v8Value());//A chance for many arbitrary JS changes diff --git a/src/declarative/particles/qsgfollowemitter_p.h b/src/declarative/particles/qsgtrailemitter_p.h similarity index 93% rename from src/declarative/particles/qsgfollowemitter_p.h rename to src/declarative/particles/qsgtrailemitter_p.h index d26435df6a..5ab6f24270 100644 --- a/src/declarative/particles/qsgfollowemitter_p.h +++ b/src/declarative/particles/qsgtrailemitter_p.h @@ -51,21 +51,20 @@ QT_BEGIN_NAMESPACE QT_MODULE(Declarative) -class QSGFollowEmitter : public QSGParticleEmitter +class QSGTrailEmitter : public QSGParticleEmitter { Q_OBJECT Q_PROPERTY(QString follow READ follow WRITE setFollow NOTIFY followChanged) - //### Remove, and just document that particles per second is per particle? But has count issues Q_PROPERTY(int emitRatePerParticle READ particlesPerParticlePerSecond WRITE setParticlesPerParticlePerSecond NOTIFY particlesPerParticlePerSecondChanged) - //TODO: Document that FollowEmitter's box is where it follows. It emits in a rect centered on the followed particle + //TODO: Document that TrailEmitter's box is where it follows. It emits in a rect centered on the followed particle //TODO: A set of properties that can involve the particle size of the followed Q_PROPERTY(QSGParticleExtruder* emitShape READ emissonShape WRITE setEmissionShape NOTIFY emissionShapeChanged) Q_PROPERTY(qreal emitHeight READ emitterYVariation WRITE setEmitterYVariation NOTIFY emitterYVariationChanged) Q_PROPERTY(qreal emitWidth READ emitterXVariation WRITE setEmitterXVariation NOTIFY emitterXVariationChanged) public: - explicit QSGFollowEmitter(QSGItem *parent = 0); + explicit QSGTrailEmitter(QSGItem *parent = 0); virtual void emitWindow(int timeStamp); virtual void reset(); diff --git a/src/declarative/particles/qsgturbulence.cpp b/src/declarative/particles/qsgturbulence.cpp index 003f3c12b6..2caebc7c1f 100644 --- a/src/declarative/particles/qsgturbulence.cpp +++ b/src/declarative/particles/qsgturbulence.cpp @@ -138,7 +138,7 @@ void QSGTurbulenceAffector::mapUpdate() void QSGTurbulenceAffector::affectSystem(qreal dt) { - if (!m_system || !m_active) + if (!m_system || !m_enabled) return; ensureInit(); qreal period = 1.0/m_frequency; diff --git a/src/declarative/particles/qsgv8particledata.cpp b/src/declarative/particles/qsgv8particledata.cpp index 72c0b7c2de..d45093c57e 100644 --- a/src/declarative/particles/qsgv8particledata.cpp +++ b/src/declarative/particles/qsgv8particledata.cpp @@ -128,7 +128,7 @@ static void particleData_set_ ## VARIABLE (v8::Local<v8::String>, v8::Local<v8:: r->datum-> SETTER ( value->NumberValue() );\ } -#define FLOAT_REGISTER_ACCESSOR(FT, ENGINE, VARIABLE) FT ->PrototypeTemplate()->SetAccessor( v8::String::New( #VARIABLE ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE , v8::External::Wrap(ENGINE)) +#define FLOAT_REGISTER_ACCESSOR(FT, ENGINE, VARIABLE, NAME) FT ->PrototypeTemplate()->SetAccessor( v8::String::New( #NAME ), particleData_get_ ## VARIABLE , particleData_set_ ## VARIABLE , v8::External::Wrap(ENGINE)) FLOAT_GETTER_AND_SETTER(x) FLOAT_GETTER_AND_SETTER(y) @@ -169,34 +169,34 @@ QV8ParticleDataDeletable::QV8ParticleDataDeletable(QV8Engine *engine) ft->InstanceTemplate()->SetHasExternalResource(true); ft->PrototypeTemplate()->Set(v8::String::New("discard"), V8FUNCTION(particleData_discard, engine)); ft->PrototypeTemplate()->Set(v8::String::New("lifeLeft"), V8FUNCTION(particleData_lifeLeft, engine)); - ft->PrototypeTemplate()->Set(v8::String::New("curSize"), V8FUNCTION(particleData_curSize, engine)); - FLOAT_REGISTER_ACCESSOR(ft, engine, x); - FLOAT_REGISTER_ACCESSOR(ft, engine, y); - FLOAT_REGISTER_ACCESSOR(ft, engine, t); - FLOAT_REGISTER_ACCESSOR(ft, engine, lifeSpan); - FLOAT_REGISTER_ACCESSOR(ft, engine, size); - FLOAT_REGISTER_ACCESSOR(ft, engine, endSize); - FLOAT_REGISTER_ACCESSOR(ft, engine, vx); - FLOAT_REGISTER_ACCESSOR(ft, engine, vy); - FLOAT_REGISTER_ACCESSOR(ft, engine, ax); - FLOAT_REGISTER_ACCESSOR(ft, engine, ay); - FLOAT_REGISTER_ACCESSOR(ft, engine, xx); - FLOAT_REGISTER_ACCESSOR(ft, engine, xy); - FLOAT_REGISTER_ACCESSOR(ft, engine, rotation); - FLOAT_REGISTER_ACCESSOR(ft, engine, rotationSpeed); - FLOAT_REGISTER_ACCESSOR(ft, engine, autoRotate); - FLOAT_REGISTER_ACCESSOR(ft, engine, animIdx); - FLOAT_REGISTER_ACCESSOR(ft, engine, frameDuration); - FLOAT_REGISTER_ACCESSOR(ft, engine, frameCount); - FLOAT_REGISTER_ACCESSOR(ft, engine, animT); - FLOAT_REGISTER_ACCESSOR(ft, engine, r); - FLOAT_REGISTER_ACCESSOR(ft, engine, update); - FLOAT_REGISTER_ACCESSOR(ft, engine, curX); - FLOAT_REGISTER_ACCESSOR(ft, engine, curVX); - FLOAT_REGISTER_ACCESSOR(ft, engine, curAX); - FLOAT_REGISTER_ACCESSOR(ft, engine, curY); - FLOAT_REGISTER_ACCESSOR(ft, engine, curVY); - FLOAT_REGISTER_ACCESSOR(ft, engine, curAY); + ft->PrototypeTemplate()->Set(v8::String::New("currentSize"), V8FUNCTION(particleData_curSize, engine)); + FLOAT_REGISTER_ACCESSOR(ft, engine, x, initialX); + FLOAT_REGISTER_ACCESSOR(ft, engine, y, initialY); + FLOAT_REGISTER_ACCESSOR(ft, engine, t, t); + FLOAT_REGISTER_ACCESSOR(ft, engine, lifeSpan, lifeSpan); + FLOAT_REGISTER_ACCESSOR(ft, engine, size, startSize); + FLOAT_REGISTER_ACCESSOR(ft, engine, endSize, endSize); + FLOAT_REGISTER_ACCESSOR(ft, engine, vx, initialVX); + FLOAT_REGISTER_ACCESSOR(ft, engine, vy, initialVY); + FLOAT_REGISTER_ACCESSOR(ft, engine, ax, initialAX); + FLOAT_REGISTER_ACCESSOR(ft, engine, ay, initialAY); + FLOAT_REGISTER_ACCESSOR(ft, engine, xx, xDeformationVector); + FLOAT_REGISTER_ACCESSOR(ft, engine, xy, yDeformationVector); + FLOAT_REGISTER_ACCESSOR(ft, engine, rotation, rotation); + FLOAT_REGISTER_ACCESSOR(ft, engine, rotationSpeed, rotationSpeed); + FLOAT_REGISTER_ACCESSOR(ft, engine, autoRotate, autoRotate); + FLOAT_REGISTER_ACCESSOR(ft, engine, animIdx, animationIndex); + FLOAT_REGISTER_ACCESSOR(ft, engine, frameDuration, frameDuration); + FLOAT_REGISTER_ACCESSOR(ft, engine, frameCount, frameCount); + FLOAT_REGISTER_ACCESSOR(ft, engine, animT, animationT); + FLOAT_REGISTER_ACCESSOR(ft, engine, r, r); + FLOAT_REGISTER_ACCESSOR(ft, engine, update, update); + FLOAT_REGISTER_ACCESSOR(ft, engine, curX, x); + FLOAT_REGISTER_ACCESSOR(ft, engine, curVX, vx); + FLOAT_REGISTER_ACCESSOR(ft, engine, curAX, ax); + FLOAT_REGISTER_ACCESSOR(ft, engine, curY, y); + FLOAT_REGISTER_ACCESSOR(ft, engine, curVY, vy); + FLOAT_REGISTER_ACCESSOR(ft, engine, curAY, ay); constructor = qPersistentNew(ft->GetFunction()); } diff --git a/src/declarative/particles/qsgwander.cpp b/src/declarative/particles/qsgwander.cpp index a4a4d2c9c5..d3e87fb241 100644 --- a/src/declarative/particles/qsgwander.cpp +++ b/src/declarative/particles/qsgwander.cpp @@ -49,10 +49,39 @@ QT_BEGIN_NAMESPACE \brief The Wander affector allows particles to randomly vary their trajectory. */ +/*! + \qmlproperty real QtQuick.Particles2::Wander::pace + + Maximum attribute change per second. +*/ +/*! + \qmlproperty real QtQuick.Particles2::Wander::xVariance + + Maximum attribute x value (as a result of Wander). + + If unset, Wander will not affect x values. +*/ +/*! + \qmlproperty real QtQuick.Particles2::Wander::yVariance + + Maximum attribute y value (as a result of Wander). + + If unset, Wander will not affect y values. +*/ +/*! + \qmlproperty AffectableParameter QtQuick.Particles2::Wander::affectedParameter + + What attribute of particles is directly affected. + \list + \o PointAttractor.Position + \o PointAttractor.Velocity + \o PointAttractor.Acceleration + \endlist +*/ QSGWanderAffector::QSGWanderAffector(QSGItem *parent) : QSGParticleAffector(parent), m_xVariance(0), m_yVariance(0), m_pace(0) - , m_physics(Velocity) + , m_affectedParameter(Velocity) { m_needsReset = true; } @@ -119,7 +148,7 @@ bool QSGWanderAffector::affectParticle(QSGParticleData* data, qreal dt) qreal dx = dt * m_pace * (2 * qreal(qrand())/RAND_MAX - 1); qreal dy = dt * m_pace * (2 * qreal(qrand())/RAND_MAX - 1); qreal newX, newY; - switch (m_physics){ + switch (m_affectedParameter){ case Position: newX = data->curX() + dx; if (m_xVariance > qAbs(newX) ) diff --git a/src/declarative/particles/qsgwander_p.h b/src/declarative/particles/qsgwander_p.h index ae98cf3681..46ad6ea3a2 100644 --- a/src/declarative/particles/qsgwander_p.h +++ b/src/declarative/particles/qsgwander_p.h @@ -66,11 +66,11 @@ class QSGWanderAffector : public QSGParticleAffector Q_PROPERTY(qreal pace READ pace WRITE setPace NOTIFY paceChanged) Q_PROPERTY(qreal xVariance READ xVariance WRITE setXVariance NOTIFY xVarianceChanged) Q_PROPERTY(qreal yVariance READ yVariance WRITE setYVariance NOTIFY yVarianceChanged) - Q_PROPERTY(PhysicsAffects physics READ physics WRITE setPhysics NOTIFY physicsChanged) - Q_ENUMS(PhysicsAffects) + Q_PROPERTY(AffectableParameters affectedParameter READ affectedParameter WRITE setAffectedParameter NOTIFY affectedParameterChanged) + Q_ENUMS(AffectableParameters) public: - enum PhysicsAffects { + enum AffectableParameters { Position, Velocity, Acceleration @@ -95,9 +95,9 @@ public: return m_pace; } - PhysicsAffects physics() const + AffectableParameters affectedParameter() const { - return m_physics; + return m_affectedParameter; } protected: @@ -111,7 +111,7 @@ signals: void paceChanged(qreal arg); - void physicsChanged(PhysicsAffects arg); + void affectedParameterChanged(AffectableParameters arg); public slots: void setXVariance(qreal arg) @@ -139,11 +139,11 @@ void setPace(qreal arg) } -void setPhysics(PhysicsAffects arg) +void setAffectedParameter(AffectableParameters arg) { - if (m_physics != arg) { - m_physics = arg; - emit physicsChanged(arg); + if (m_affectedParameter != arg) { + m_affectedParameter = arg; + emit affectedParameterChanged(arg); } } @@ -153,7 +153,7 @@ private: qreal m_xVariance; qreal m_yVariance; qreal m_pace; - PhysicsAffects m_physics; + AffectableParameters m_affectedParameter; }; QT_END_NAMESPACE -- GitLab