Bläddra i källkod

Add animated background from qml presentation system

Change-Id: I31af0fac9b3e258b6a71e1db00cf51a54f460514
Donald Carr 8 år sedan
förälder
incheckning
55e9d3d599

+ 8 - 0
qml/main.qml

@@ -2,6 +2,7 @@ import QtQuick 2.5
 import QtQuick.Window 2.2
 import Qt.labs.settings 1.0
 import PictureModel 1.0
+import "qrc:/3rdparty/animatedBackground"
 
 Window {
     id: appWindow
@@ -131,6 +132,8 @@ Window {
         property bool randomTapestryColour: false
         property bool fadeInImages: true
 
+        property bool animatedBackground: false
+
         property bool useGoldenRatio: false
         //property real lessGoldenRatio: 1.25
         property real lessGoldenRatio: 1.35
@@ -149,6 +152,11 @@ Window {
         anchors.fill: parent
         Keys.forwardTo: [loader.item, toplevelhandler]
 
+        BackgroundSwirls {
+            visible: globalSettings.animatedBackground
+            anchors.fill: parent
+        }
+
         Loader {
             id: loader
             anchors.fill: parent

+ 118 - 0
resources/3rdparty/animatedBackground/BackgroundSwirls.qml

@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** 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 The Qt Company Ltd 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.5
+import QtQuick.Particles 2.0
+
+Item {
+    anchors.fill: parent
+
+    Rectangle {
+        anchors.fill: parent
+        gradient: Gradient {
+            GradientStop { position: 0; color: "lightsteelblue" }
+            GradientStop { position: 1; color: "black" }
+        }
+    }
+
+    Rectangle {
+        id: colorTableItem
+        width: 16
+        height: 16
+        anchors.fill: parent
+
+        property color color1: Qt.rgba(0.8, 0.8, 1, 0.3)
+        property color color2: Qt.rgba(0.8, 0.8, 1, 0.3)
+
+        gradient: Gradient {
+            GradientStop { position: 0.0; color: "transparent"}
+            GradientStop { position: 0.05; color: colorTableItem.color1 }
+            GradientStop { position: 0.3; color: "transparent" }
+            GradientStop { position: 0.7; color: "transparent" }
+            GradientStop { position: 0.95; color: colorTableItem.color2 }
+            GradientStop { position: 1.0; color: "transparent" }
+        }
+
+        visible: false
+    }
+
+    ShaderEffectSource {
+        id: colorTableSource
+        sourceItem: colorTableItem
+        smooth: true
+    }
+
+    Repeater {
+        model: 4
+        Swirl {
+
+            width: parent.width
+            anchors.bottom: parent.bottom
+            height: parent.height / (2 + index)
+            opacity: 0.3
+            speed: (index + 1) / 5
+            colorTable: colorTableSource
+        }
+    }
+
+    ParticleSystem{
+        id: particles
+    }
+    ImageParticle{
+        anchors.fill: parent
+        system: particles
+        source: "qrc:/3rdparty/animatedBackground/particle.png"
+        alpha: 0
+        colorVariation: 0.3
+    }
+
+    Emitter{
+        anchors.fill: parent
+        system: particles
+        emitRate: Math.sqrt(parent.width * parent.height) / 30
+        lifeSpan: 2000
+        size: 4
+        sizeVariation: 2
+
+        acceleration: AngleDirection { angle: 90; angleVariation: 360; magnitude: 20; }
+        velocity: AngleDirection { angle: -90; angleVariation: 360; magnitude: 10; }
+    }
+
+}

+ 106 - 0
resources/3rdparty/animatedBackground/Swirl.qml

@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** 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 The Qt Company Ltd 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.5
+
+ShaderEffect {
+    id: shader
+
+    width: 400
+    height: 300
+
+    property real speed: 1
+
+    property color d: Qt.rgba(Math.random() * 0.7,
+                              Math.random() * 0.5,
+                              Math.random() * 0.7,
+                              Math.random() * 0.5)
+    property real tx
+    NumberAnimation on tx { from: 0; to: Math.PI * 2; duration: (Math.random() * 30 + 30) * 1000 / speed; loops: Animation.Infinite }
+    property real ty
+    NumberAnimation on ty { from: 0; to: Math.PI * 2; duration: (Math.random() * 30 + 30) * 1000 / speed; loops: Animation.Infinite }
+    property real tz
+    NumberAnimation on tz { from: 0; to: Math.PI * 2; duration: (Math.random() * 30 + 30) * 1000 / speed; loops: Animation.Infinite }
+    property real tw
+    NumberAnimation on tw { from: 0; to: Math.PI * 2; duration: (Math.random() * 30 + 30) * 1000 / speed; loops: Animation.Infinite }
+
+    property real amplitude: height / 2
+
+    property variant colorTable: ShaderEffectSource { sourceItem: Rectangle { width: 4; height: 4; color: "steelblue" } }
+
+    fragmentShader: "
+    uniform lowp float qt_Opacity;
+    uniform lowp sampler2D colorTable;
+    varying highp vec2 qt_TexCoord0;
+
+    void main() {
+        gl_FragColor = texture2D(colorTable, qt_TexCoord0);
+        gl_FragColor.w *= qt_Opacity;
+    }
+    "
+
+    vertexShader: "
+    uniform lowp vec4 d;
+    uniform highp float tx;
+    uniform highp float ty;
+    uniform highp float tz;
+    uniform highp float tw;
+    uniform highp float amplitude;
+    uniform highp mat4 qt_Matrix;
+    attribute highp vec4 qt_Vertex;
+    attribute highp vec2 qt_MultiTexCoord0;
+    varying highp vec2 qt_TexCoord0;
+
+    void main() {
+        highp vec4 pos = qt_Vertex;
+
+        highp float y1 = sin(tx + d.x * qt_MultiTexCoord0.x * 17. + 2. * d.y) + sin(ty + d.z * qt_MultiTexCoord0.x * 11. + 5. * d.w);
+        highp float y2 = sin(tz + d.w * qt_MultiTexCoord0.x * 7. + 3. * d.z) + sin(tw + d.y * qt_MultiTexCoord0.x * 19. + 3. * d.x);
+
+        pos.y += mix(y1, y2, qt_MultiTexCoord0.y) * amplitude * 0.5;
+
+        gl_Position = qt_Matrix * pos;
+        qt_TexCoord0 = qt_MultiTexCoord0;
+    }
+    "
+
+    mesh: GridMesh { resolution: Qt.size(width / 10, 4) }
+
+}

BIN
resources/3rdparty/animatedBackground/particle.png


+ 3 - 0
resources/resources.qrc

@@ -7,5 +7,8 @@
         <file>shaders/emboss.fsh</file>
         <file>shaders/gaussianblur_h.fsh</file>
         <file>shaders/gaussianblur_v.fsh</file>
+        <file>3rdparty/animatedBackground/Swirl.qml</file>
+        <file>3rdparty/animatedBackground/particle.png</file>
+        <file>3rdparty/animatedBackground/BackgroundSwirls.qml</file>
     </qresource>
 </RCC>