try an actual wobblywindows effect

it still has some serious problems:
-animation not smooth
-the deformation is linear, the applet appears broken
-unfortunately the ShaderEffect must be a lot bigger thanthe thing it deforms because it looks clipped now
This commit is contained in:
Marco Martin 2013-03-13 17:47:55 +01:00
parent 46b83aaced
commit 086d3e1e8f

View File

@ -84,6 +84,13 @@ Item {
} }
} }
MouseArea { MouseArea {
id: mouseArea
property real dx: 0
property real dy: 0
property real startX
property real startY
anchors.fill: parent anchors.fill: parent
drag.target: frameParent drag.target: frameParent
onClicked: { onClicked: {
@ -91,6 +98,39 @@ Item {
frameParent.height = s frameParent.height = s
frameParent.width = s frameParent.width = s
} }
onPressed: {
speedSampleTimer.running = true
mouseArea.startX = mouse.x
mouseArea.startY = mouse.y
speedSampleTimer.lastFrameParentX = frameParent.x
speedSampleTimer.lastFrameParentY = frameParent.y
}
onPositionChanged: {
//mouseArea.dx = mouse.x - mouseArea.startX
//mouseArea.dy = mouse.y - mouseArea.startY
dxAnim.running = false
dyAnim.running = false
}
onReleased: {
speedSampleTimer.running = false
dxAnim.running = true
dyAnim.running = true
}
Timer {
id: speedSampleTimer
interval: 40
repeat: true
property real lastFrameParentX
property real lastFrameParentY
onTriggered: {
mouseArea.dx = frameParent.x - lastFrameParentX
mouseArea.dy = frameParent.y - lastFrameParentY
lastFrameParentX = frameParent.x
lastFrameParentY = frameParent.y
dxAnim.running = true
dyAnim.running = true
}
}
} }
Item { Item {
@ -130,23 +170,33 @@ Item {
sourceItem: frame sourceItem: frame
} }
property int fadeDuration: 250 property int fadeDuration: 150
property real amplitude: busyIndicator.visible ? 0.04 * 0.2 : 0
property real frequency: 20
property real time: 0 property real time: 0
NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 } property real dx: mouseArea.dx
Behavior on amplitude { NumberAnimation { duration: wobbleShader.fadeDuration } } property real dy: mouseArea.dy
property real startX: mouseArea.startX/mouseArea.width
property real startY: mouseArea.startY/mouseArea.height
NumberAnimation on dx { id: dxAnim; to: 0; duration: 350; easing.type: Easing.OutElastic }
NumberAnimation on dy { id: dyAnim; to: 0; duration: 350; easing.type: Easing.OutElastic }
//! [fragment] //! [fragment]
fragmentShader: { fragmentShader: {
"uniform lowp float qt_Opacity;" + "uniform lowp float qt_Opacity;" +
"uniform highp float amplitude;" + "uniform highp float dx;" +
"uniform highp float frequency;" + "uniform highp float dy;" +
"uniform highp float time;" + "uniform highp float startX;" +
"uniform highp float startY;" +
"uniform sampler2D source;" + "uniform sampler2D source;" +
"varying highp vec2 qt_TexCoord0;" + "varying highp vec2 qt_TexCoord0;" +
"void main() {" + "void main() {" +
" highp vec2 p = sin(time + frequency * qt_TexCoord0);" +
" gl_FragColor = texture2D(source, qt_TexCoord0 + amplitude * vec2(p.y, -p.x)) * qt_Opacity;" + "highp float wave_x = qt_TexCoord0.x - dx*0.0025" +
" * (1/(1+abs(qt_TexCoord0.x-(startX))))" +
" * (1/(1+abs(qt_TexCoord0.y-(startY))));" +
"highp float wave_y = qt_TexCoord0.y - dy*0.0025" +
" * 1/(1+abs(qt_TexCoord0.x-(startX)))" +
" * 1/(1+abs(qt_TexCoord0.y-(startY)));" +
"gl_FragColor = texture2D(source, vec2(wave_x, wave_y));" +
"}" "}"
} }
//! [fragment] //! [fragment]