cool-retro-term/app/qml/frames/utils/TerminalFrame.qml
2014-12-23 00:16:03 +01:00

212 lines
7.2 KiB
QML

import QtQuick 2.2
import QtGraphicalEffects 1.0
import "../../utils.js" as Utils
Item{
id: framecontainer
property int textureWidth: terminalContainer.width / appSettings.window_scaling
property int textureHeight: terminalContainer.height / appSettings.window_scaling
property int addedWidth
property int addedHeight
property int borderLeft
property int borderRight
property int borderTop
property int borderBottom
property string imageSource
property string normalsSource
property string shaderString
//Values used to displace the texture in the screen. Used to make reflections correct.
property real displacementLeft
property real displacementTop
property real displacementRight
property real displacementBottom
// Material coefficients
property real staticDiffuseComponent: 0.7
property real dinamycDiffuseComponent: 1.0
BorderImage{
id: frameimage
anchors.centerIn: parent
width: textureWidth + addedWidth
height: textureHeight + addedHeight
border.bottom: borderBottom
border.top: borderTop
border.left: borderLeft
border.right: borderRight
source: imageSource
horizontalTileMode: BorderImage.Stretch
verticalTileMode: BorderImage.Stretch
}
BorderImage{
id: framenormals
anchors.fill: frameimage
border.bottom: borderBottom
border.top: borderTop
border.left: borderLeft
border.right: borderRight
source: normalsSource
horizontalTileMode: BorderImage.Stretch
verticalTileMode: BorderImage.Stretch
}
ShaderEffectSource{
id: framesource
sourceItem: frameimage
hideSource: true
textureSize: Qt.size(parent.width, parent.height)
sourceRect: Qt.rect(-1, -1, frameimage.width + 2, frameimage.height + 2)
visible: false
}
ShaderEffectSource{
id: framesourcenormals
sourceItem: framenormals
hideSource: true
textureSize: Qt.size(parent.width, parent.height)
sourceRect: Qt.rect(-1, -1, framenormals.width + 2, framenormals.height + 2)
visible: false
}
// REFLECTIONS ////////////////////////////////////////////////////////////
Loader{
id: reflectionEffectLoader
width: parent.width * 0.33
height: parent.height * 0.33
active: appSettings.frameReflections
sourceComponent: FastBlur{
id: frameReflectionEffect
radius: 128
source: terminal.kterminal
smooth: false
}
}
Loader{
id: reflectionEffectSourceLoader
active: appSettings.frameReflections
sourceComponent: ShaderEffectSource{
id: frameReflectionSource
sourceItem: reflectionEffectLoader.item
hideSource: true
smooth: true
visible: false
}
}
// This texture represent the static light component.
ShaderEffect {
id: staticLight
property alias source: framesource
property alias normals: framesourcenormals
property real screen_distorsion: appSettings.screen_distortion
property size curvature_coefficients: Qt.size(width / mainShader.width, height / mainShader.height)
property real ambient_light: appSettings.ambient_light
property color font_color: appSettings.font_color
property color background_color: appSettings.background_color
property color reflectionColor: Utils.mix(font_color, background_color, 0.2)
property real diffuseComponent: staticDiffuseComponent
anchors.centerIn: parent
width: parent.width + (addedWidth / textureWidth) * parent.width
height: parent.height + (addedHeight / textureHeight) * parent.height
blending: true
fragmentShader: "
uniform highp sampler2D normals;
uniform highp sampler2D source;
uniform lowp float screen_distorsion;
uniform highp vec2 curvature_coefficients;
uniform lowp float ambient_light;
uniform highp float qt_Opacity;
uniform lowp vec4 reflectionColor;
uniform lowp float diffuseComponent;
varying highp vec2 qt_TexCoord0;
vec2 distortCoordinates(vec2 coords){
vec2 cc = (coords - vec2(0.5)) * curvature_coefficients;
float dist = dot(cc, cc) * screen_distorsion;
return (coords + cc * (1.0 + dist) * dist);
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}
void main(){
vec2 coords = distortCoordinates(qt_TexCoord0);
vec4 txtColor = texture2D(source, coords);
vec4 txtNormal = texture2D(normals, coords);
vec3 normal = normalize(txtNormal.rgb * 2.0 - 1.0);
vec2 lightDirection = normalize(vec2(0.5, 0.5) - coords);
float dotProd = dot(normal, vec3(lightDirection, 0.0)) * diffuseComponent * txtNormal.a;
vec3 darkColor = dotProd * reflectionColor.rgb;
gl_FragColor = vec4(mix(darkColor, txtColor.rgb, ambient_light), dotProd);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}
ShaderEffectSource {
id: staticLightSource
sourceItem: staticLight
hideSource: true
anchors.fill: staticLight
live: true
}
Loader{
id: dynamicLightLoader
anchors.fill: staticLight
active: appSettings.frameReflections
sourceComponent: ShaderEffect {
property ShaderEffectSource lightMask: staticLightSource
property ShaderEffectSource reflectionSource: reflectionEffectSourceLoader.item
property real diffuseComponent: dinamycDiffuseComponent
property real chroma_color: appSettings.chroma_color
property color font_color: appSettings.font_color
visible: true
blending: true
fragmentShader: "
uniform sampler2D lightMask;
uniform sampler2D reflectionSource;
uniform lowp float diffuseComponent;
uniform lowp float chroma_color;
uniform highp vec4 font_color;
uniform highp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}
void main() {
float alpha = texture2D(lightMask, qt_TexCoord0).a * diffuseComponent;
vec3 reflectionColor = texture2D(reflectionSource, qt_TexCoord0).rgb;
vec3 color = font_color.rgb * rgb2grey(reflectionColor);" +
(chroma_color !== 0 ?
"color = mix(color, font_color.rgb * reflectionColor, chroma_color);"
: "") +
"gl_FragColor = vec4(color, 1.0) * alpha;
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}
}
}