New frame! Drawn using a shader, it is now possible to distort the frame

according to screen distortion (also added the setting)...
This commit is contained in:
Filippo Scognamiglio 2013-12-23 03:14:12 +01:00
parent d5222b1302
commit 8bba1d6957
3 changed files with 119 additions and 76 deletions

View File

@ -67,6 +67,11 @@ ApplicationWindow {
onValueChanged: shadersettings.ambient_light = value;
Component.onCompleted: _value = shadersettings.ambient_light
}
SettingComponent{
name: "Screen distortion"
onValueChanged: shadersettings.screen_distortion = value;
Component.onCompleted: _value = shadersettings.screen_distortion;
}
}
}
}

View File

@ -37,6 +37,7 @@ ApplicationWindow{
title: qsTr("Terminal")
menuBar: MenuBar {
id: menubar
Menu {
title: qsTr("File")
MenuItem { text: "Close"; onTriggered: mainwindow.close()}
@ -57,52 +58,59 @@ ApplicationWindow{
visible: true
ShaderSettings{
id: shadersettings
}
ShaderEffectSource{
id: theSource
sourceItem: terminal
//sourceRect: Qt.rect(-20, -20, terminal.width + 40, terminal.height + 40)
}
ShaderEffect {
id: shadercontainer
anchors.fill: terminal
blending: true
z: 2
property color font_color: shadersettings.font_color
property color background_color: shadersettings.background_color
property variant source: theSource
property size txt_Size: Qt.size(terminal.width, terminal.height)
property real time: 0
property real noise_strength: shadersettings.noise_strength
property real screen_distorsion: shadersettings.screen_distortion
property real glowing_line_strength: shadersettings.glowing_line_strength
property real brightness: 1.0
NumberAnimation on brightness{
to: 1.0
duration: 300
onStopped: {to = 1 - Math.random() * shadersettings.brightness_flickering; start();}
running: true
Item{
anchors.fill: parent
anchors.topMargin: 30 //Fix the constant
ShaderSettings{
id: shadersettings
}
property real deltay: 1.0 / terminal.height
property real deltax: 1.0 / terminal.width
//property real faulty_screen_prob: shadersettings.faulty_screen_prob
NumberAnimation on time{
from: -1
to: 100
duration: 5000
loops: Animation.Infinite
ShaderEffectSource{
property double offset_top: 0.03
property double offset_bottom: 0.04
id: theSource
sourceItem: terminal
sourceRect: Qt.rect(-offset_top * terminal.width, -offset_top * terminal.height, terminal.width + offset_bottom * terminal.width, terminal.height + offset_bottom * terminal.height)
}
fragmentShader: "
ShaderEffect {
id: shadercontainer
width: parent.width
height: parent.height
anchors.centerIn: parent
blending: true
z: 2
property color font_color: shadersettings.font_color
property color background_color: shadersettings.background_color
property variant source: theSource
property size txt_Size: Qt.size(terminal.width, terminal.height)
property real time: 0
property real noise_strength: shadersettings.noise_strength
property real screen_distorsion: shadersettings.screen_distortion
property real glowing_line_strength: shadersettings.glowing_line_strength
property real brightness: 1.0
NumberAnimation on brightness{
to: 1.0
duration: 300
onStopped: {to = 1 - Math.random() * shadersettings.brightness_flickering; start();}
running: true
}
property real deltay: 1.0 / terminal.height
property real deltax: 1.0 / terminal.width
//property real faulty_screen_prob: shadersettings.faulty_screen_prob
NumberAnimation on time{
from: -1
to: 100
duration: 5000
loops: Animation.Infinite
}
fragmentShader: "
uniform sampler2D source;
uniform highp float qt_Opacity;
uniform highp float time;
@ -172,46 +180,76 @@ ApplicationWindow{
vec4 added_color = (noise + randomPass) * font_color;
vec4 finalColor = color + added_color;
finalColor = mix(finalColor, background_color, 1.0 - scanline_alpha);
gl_FragColor = vec4(finalColor.rgb * inside, inside);
gl_FragColor = vec4(finalColor.rgb, 1.0);
}"
}
}
Rectangle{
z: 1
anchors.fill: parent
color: "black"
}
ShaderEffect{
z: 2.1
width: parent.width * 1.05
height: parent.height * 1.05
anchors.centerIn: parent
Image{
id: frame
source: "../images/frame.png"
anchors.centerIn: parent
width: parent.width * 1.05
height: parent.height * 1.05
z: 10
visible: true
opacity: shadersettings.ambient_light
}
property variant source: framesource
property real screen_distorsion: shadersettings.screen_distortion - 0.22
property real ambient_light: shadersettings.ambient_light
TerminalScreen {
id: terminal
anchors.centerIn: parent
width: mainwindow.width * 0.95
height: mainwindow.height * 0.93
visible: false
fragmentShader: "
uniform sampler2D source;
uniform highp float screen_distorsion;
uniform highp float ambient_light;
//FIXME: Ugly forced clear terminal at the beginning
Component.onCompleted: terminal.screen.sendKey("l", 76, 67108864);
}
varying highp vec2 qt_TexCoord0;
RadialGradient{
z: 4
anchors.fill: parent
cached: true
opacity: 0.25
gradient: Gradient{
GradientStop{position: 0.0; color: shadersettings.font_color}
GradientStop{position: 1.0; color: shadersettings.background_color}
vec2 distortCoordinates(vec2 coords){
vec2 cc = coords - vec2(0.5);
float dist = dot(cc, cc) * screen_distorsion;
return (coords + cc * (1.0 + dist) * dist);
}
void main(){
vec2 coords = distortCoordinates(qt_TexCoord0);
vec4 txt_color = texture2D(source, coords);
vec4 final_color = mix(txt_color, vec4(vec3(0.0), 1.0), 1.0 - ambient_light);
gl_FragColor = vec4(final_color.rgb, txt_color.a);
}"
}
ShaderEffectSource{
id: framesource
sourceItem: frame
hideSource: true
live: false
}
Image{
id: frame
source: "../images/squared_frame.png"
anchors.centerIn: parent
visible: true
opacity: shadersettings.ambient_light
}
TerminalScreen {
id: terminal
anchors.centerIn: parent
width: mainwindow.width
height: mainwindow.height
visible: false
//FIXME: Ugly forced clear terminal at the beginning
Component.onCompleted: terminal.screen.sendKey("l", 76, 67108864);
}
RadialGradient{
z: 4
anchors.fill: parent
cached: true
opacity: 0.2
gradient: Gradient{
GradientStop{position: 0.0; color: shadersettings.font_color}
GradientStop{position: 1.0; color: shadersettings.background_color}
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 KiB