summaryrefslogtreecommitdiffstats
path: root/basicsuite/qt5-everywhere/demos/particledemo
diff options
context:
space:
mode:
Diffstat (limited to 'basicsuite/qt5-everywhere/demos/particledemo')
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/BootScreenDemo.qml181
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/ParticleSysComponent.qml108
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/images/particle.pngbin0 -> 1257 bytes
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/images/particle_star.pngbin0 -> 1696 bytes
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-green-mask.pngbin0 -> 10597 bytes
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-white-mask.pngbin0 -> 17247 bytes
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/particle.pngbin0 -> 861 bytes
-rw-r--r--basicsuite/qt5-everywhere/demos/particledemo/particledemo.qml213
8 files changed, 502 insertions, 0 deletions
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/BootScreenDemo.qml b/basicsuite/qt5-everywhere/demos/particledemo/BootScreenDemo.qml
new file mode 100644
index 0000000..eb4e29e
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/BootScreenDemo.qml
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia Plc 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
+
+Item {
+ id: root
+ property real size: Math.min(root.width, root.height);
+ signal finished()
+
+ SequentialAnimation {
+ id: entryAnimation
+ running: true
+ PropertyAction { target: sphereEmitter; property: "emitRate"; value: 150 }
+ PropertyAction { target: starEmitter; property: "emitRate"; value: 100 }
+ PropertyAction { target: starEmitter; property: "enabled"; value: true }
+ PropertyAction { target: sphereEmitter; property: "enabled"; value: true }
+ PropertyAction { target: sphereSystem; property: "running"; value: true }
+ PropertyAction { target: starSystem; property: "running"; value: true }
+ PauseAnimation { duration: 5000 }
+
+ onRunningChanged: if (!running) explodeAnimation.restart()
+ }
+
+ SequentialAnimation{
+ id: explodeAnimation
+ ScriptAction { script: {
+ starAccel.x = 5
+ starAccel.xVariation = 20;
+ starAccel.yVariation = 20;
+ sphereAccel.x = -5
+ sphereAccel.xVariation = 20
+ sphereAccel.yVariation = 20
+ sphereParticle.alpha = 0;
+ }
+ }
+ PropertyAction { target: sphereEmitter; property: "emitRate"; value: 200 }
+ PropertyAction { target: starEmitter; property: "emitRate"; value: 200 }
+ PauseAnimation { duration: 2000 }
+ PropertyAction { target: starEmitter; property: "enabled"; value: false }
+ PropertyAction { target: sphereEmitter; property: "enabled"; value: false }
+ PauseAnimation { duration: 5000 }
+
+ onRunningChanged: {
+ if (!running) {
+ root.finished()
+ root.destroy()
+ }
+ }
+ }
+
+ Item {
+ id: logo;
+ width: root.size / 2;
+ height: root.size / 2;
+ anchors.centerIn: parent
+ }
+
+ ParticleSystem {
+ id: sphereSystem;
+ anchors.fill: logo
+ running: false
+
+ ImageParticle {
+ id: sphereParticle
+ source: "images/particle.png"
+ color: "#80c342"
+ alpha: 1
+ colorVariation: 0.0
+ }
+
+ Emitter {
+ id: sphereEmitter
+ anchors.fill: parent
+ emitRate: 100
+ lifeSpan: 4000
+ size: root.width*.15
+ sizeVariation: size *.2
+ velocity: PointDirection { xVariation: 2; yVariation: 2; }
+
+ acceleration: PointDirection {
+ id: sphereAccel
+ xVariation: 1;
+ yVariation: 1;
+ }
+
+ shape: MaskShape {
+ source: "images/qt-logo-green-mask.png"
+ }
+ }
+ }
+
+ ParticleSystem {
+ id: starSystem;
+ anchors.fill: logo
+ running: false
+
+ ImageParticle {
+ id: starParticle
+ source: "images/particle_star.png"
+ color: "#ffffff"
+ alpha: 0
+ colorVariation: 0
+ }
+
+ Emitter {
+ id: starEmitter
+ anchors.fill: parent
+ emitRate: 50
+ lifeSpan: 5000
+ size: root.width*.1
+ sizeVariation: size *.2
+ velocity: PointDirection { xVariation: 1; yVariation: 1; }
+
+ acceleration: PointDirection {
+ id: starAccel
+ xVariation: 0;
+ yVariation: 0;
+ }
+
+ shape: MaskShape {
+ source: "images/qt-logo-white-mask.png"
+ }
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+
+ if (entryAnimation.running) {
+ entryAnimation.complete()
+ return;
+ }
+
+ if (explodeAnimation.running) {
+ root.finished()
+ root.destroy()
+ }
+
+ }
+ }
+}
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/ParticleSysComponent.qml b/basicsuite/qt5-everywhere/demos/particledemo/ParticleSysComponent.qml
new file mode 100644
index 0000000..fc74037
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/ParticleSysComponent.qml
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia Plc 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
+
+/**
+ * ParticleSystem component draw particles with the given color.
+ */
+
+ParticleSystem {
+ id: root
+ anchors.fill: parent
+ running: true
+
+ property color particleColor: "#ff0000"
+ property real angle: particleRoot.angle;
+ property int pointCount: particleRoot.pointCount;
+ property real radius: particleRoot.distance;
+ property real movement: particleRoot.movement;
+ property bool emitting: particleRoot.running;
+ property int touchX: 0
+ property int touchY: 0
+ property int startAngle: 0
+ property bool pressed: false
+ property real targetX: pressed ? touchX : width/2+radius * Math.cos(targetAngle*(Math.PI/180))
+ property real targetY: pressed ? touchY : height/2+radius * Math.sin(targetAngle*(Math.PI/180))
+ property real targetAngle: angle+startAngle
+
+ Emitter {
+ id: emitter
+ lifeSpan: 1000
+ emitRate: 80
+ x: targetX
+ y: targetY
+ enabled: root.emitting
+ size: root.height*.05
+ endSize: root.height*.1
+ sizeVariation: .5
+ velocity: AngleDirection{angle:0; angleVariation: 360; magnitude: 10}
+ acceleration: AngleDirection{angle:0; angleVariation: 360; magnitude: 10}
+ velocityFromMovement: root.movement
+ }
+
+ ImageParticle {
+ id: imageParticle
+ source: "images/particle.png"
+ color: root.pointCount >0 && root.pressed ? root.particleColor: "#444444"
+ alpha: .0
+ colorVariation: root.pointCount >0 && root.pressed ? 0.3: .0
+
+ Behavior on color{
+ enabled: root.pointCount != 0
+ ColorAnimation { duration: 500 }
+ }
+
+ SequentialAnimation on color {
+ id: colorAnimation
+ loops: Animation.Infinite
+ running: root.pointCount === 0
+ ColorAnimation {from: root.particleColor; to: "magenta"; duration: 2000}
+ ColorAnimation {from: "magenta"; to: "blue"; duration: 1000}
+ ColorAnimation {from: "blue"; to: "violet"; duration: 1000}
+ ColorAnimation {from: "violet"; to: "red"; duration: 1000}
+ ColorAnimation {from: "red"; to: "orange"; duration: 1000}
+ ColorAnimation {from: "orange"; to: "yellow"; duration: 1000}
+ ColorAnimation {from: "yellow"; to: "green"; duration: 1000}
+ ColorAnimation {from: "green"; to: root.particleColor; duration: 2000}
+ }
+ }
+}
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/images/particle.png b/basicsuite/qt5-everywhere/demos/particledemo/images/particle.png
new file mode 100644
index 0000000..7520c9b
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/images/particle.png
Binary files differ
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/images/particle_star.png b/basicsuite/qt5-everywhere/demos/particledemo/images/particle_star.png
new file mode 100644
index 0000000..5660d27
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/images/particle_star.png
Binary files differ
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-green-mask.png b/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-green-mask.png
new file mode 100644
index 0000000..84be10d
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-green-mask.png
Binary files differ
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-white-mask.png b/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-white-mask.png
new file mode 100644
index 0000000..920eeee
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/images/qt-logo-white-mask.png
Binary files differ
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/particle.png b/basicsuite/qt5-everywhere/demos/particledemo/particle.png
new file mode 100644
index 0000000..5c83896
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/particle.png
Binary files differ
diff --git a/basicsuite/qt5-everywhere/demos/particledemo/particledemo.qml b/basicsuite/qt5-everywhere/demos/particledemo/particledemo.qml
new file mode 100644
index 0000000..c3f8253
--- /dev/null
+++ b/basicsuite/qt5-everywhere/demos/particledemo/particledemo.qml
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** 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 Digia Plc 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
+
+Rectangle {
+ id: particleRoot
+ color: "#000000"
+ anchors.fill: parent
+
+ property real distance: parent.height*.4
+ property real angle: 0
+ property real movement: 0
+ property alias running: angleAnimation.running
+ property int pointCount: mouseArea.pointCount + multiPointTouchArea.pointCount
+
+ BootScreenDemo {
+ width: Math.min(parent.width,parent.height)
+ height: width
+ anchors.centerIn: parent
+ z: 1
+ onFinished: {
+ distanceAnimation.restart()
+ angleAnimation.restart()
+ }
+ }
+
+ RotationAnimation on angle {
+ id: angleAnimation
+ from: 0
+ to: 360
+ running: false
+ duration: distanceAnimation.delay
+ direction: RotationAnimation.Shortest
+ loops: Animation.Infinite
+ }
+
+ SequentialAnimation on distance {
+ id: distanceAnimation
+ property int easingType:0
+ property int delay: 1000
+ running: false
+
+ NumberAnimation {
+ from: 0
+ to: parent.height*.4
+ duration: distanceAnimation.delay/2
+ easing.type: distanceAnimation.easingType
+ }
+
+ NumberAnimation {
+ from: parent.height*.4
+ to: 0
+ duration: distanceAnimation.delay/2
+ easing.type: distanceAnimation.easingType
+ }
+
+ onRunningChanged: {
+ if (!running){
+ var type = Math.floor(Math.random()*10)
+ switch (type){
+ case 0:
+ distanceAnimation.easingType=Easing.InOutBack
+ break;
+ case 1:
+ distanceAnimation.easingType=Easing.InOutBounce
+ break;
+ case 2:
+ distanceAnimation.easingType=Easing.InOutCirc
+ break;
+ case 3:
+ distanceAnimation.easingType=Easing.InOutElastic
+ break;
+ case 4:
+ distanceAnimation.easingType=Easing.InOutSine
+ break;
+ case 5:
+ distanceAnimation.easingType=Easing.OutInQuad
+ break;
+ case 6:
+ distanceAnimation.easingType=Easing.OutInCubic
+ break;
+ case 7:
+ distanceAnimation.easingType=Easing.OutExpo
+ break;
+ case 8:
+ distanceAnimation.easingType=Easing.OutCurve
+ break;
+ default:
+ distanceAnimation.easingType=Easing.Linear
+ break;
+ }
+
+ distanceAnimation.delay = 500 + Math.floor(Math.random()*1500)
+ angleAnimation.from = 180 + Math.random()*90 - 45
+ particleRoot.movement = Math.random()*2
+ angleAnimation.restart()
+ distanceAnimation.restart()
+ }
+ }
+ }
+
+ /**
+ * Create five ParticleSysComponents for drawing particles
+ * in the place of multitouch points with the given color.
+ */
+ ParticleSysComponent{ id: p1; particleColor: "#ff0000"; startAngle: 1*360/(5-particleRoot.pointCount); }
+ ParticleSysComponent{ id: p2; particleColor: "#00ff00"; startAngle: 2*360/(5-particleRoot.pointCount); }
+ ParticleSysComponent{ id: p3; particleColor: "#0000ff"; startAngle: 3*360/(5-particleRoot.pointCount); }
+ ParticleSysComponent{ id: p4; particleColor: "#ffff00"; startAngle: 4*360/(5-particleRoot.pointCount); }
+ ParticleSysComponent{ id: p5; particleColor: "#ff00ff"; startAngle: 5*360/(5-particleRoot.pointCount); }
+
+ /**
+ * In this demo we only support five touch point at the same time.
+ * One from mouseArea (because of Desktop-support) and four from MultiPointTouchArea.
+ */
+ MultiPointTouchArea {
+ id: multiPointTouchArea
+ anchors.fill: parent
+ minimumTouchPoints: 1
+ maximumTouchPoints: 6
+
+ property int pointCount:0
+
+ touchPoints: [
+ TouchPoint { id: point1 },
+ TouchPoint { id: point2 },
+ TouchPoint { id: point3 },
+ TouchPoint { id: point4 }
+ ]
+
+ onPressed: updatePointCount()
+ onReleased: updatePointCount()
+ onTouchUpdated: {
+ p2.touchX = point1.x; p2.touchY = point1.y; p2.pressed = point1.pressed;
+ p3.touchX = point2.x; p3.touchY = point2.y; p3.pressed = point2.pressed;
+ p4.touchX = point3.x; p4.touchY = point3.y; p4.pressed = point3.pressed;
+ p5.touchX = point4.x; p5.touchY = point4.y; p5.pressed = point4.pressed;
+ }
+
+ function updatePointCount(){
+ var tmp = 0
+ for (var i=0; i<4; i++) {
+ if (touchPoints[i].pressed)
+ tmp++
+ }
+ pointCount = tmp
+ }
+ }
+
+ /**
+ * For desktop.
+ */
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+
+ property int pointCount:0
+
+ onPressed: {
+ pointCount = 1;
+ p1.touchX = mouse.x;
+ p1.touchY = mouse.y;
+ p1.pressed = true;
+ }
+ onReleased: {
+ pointCount = 0;
+ p1.pressed = false;
+ }
+ onPositionChanged: {
+ p1.touchX = mouse.x;
+ p1.touchY = mouse.y;
+ }
+ }
+}