cool-retro-term/app/qml/BurnInEffect.qml

140 lines
4.5 KiB
QML
Raw Normal View History

import QtQuick 2.0
import "utils.js" as Utils
2018-11-08 18:21:33 +01:00
Loader {
id: burnInEffect
2018-11-08 18:21:33 +01:00
property ShaderEffectSource source: item ? item.source : null
property real lastUpdate: 0
property real prevLastUpdate: 0
property real delay: (1.0 / appSettings.fps) * 1000
property real burnIn: appSettings.burnIn
property real burnInFadeTime: 1 / Utils.lint(_minBurnInFadeTime, _maxBurnInFadeTime, burnIn)
property real _minBurnInFadeTime: 160
property real _maxBurnInFadeTime: 1600
2018-11-08 18:21:33 +01:00
active: appSettings.burnIn !== 0
function completelyUpdate() {
prevLastUpdate = lastUpdate;
lastUpdate = timeManager.time;
2018-11-08 18:21:33 +01:00
item.source.scheduleUpdate();
}
function restartBlurSource(){
2018-11-21 18:18:18 +01:00
prevLastUpdate = timeManager.time;
lastUpdate = prevLastUpdate;
completelyUpdate();
}
2018-11-08 18:21:33 +01:00
sourceComponent: Item {
property alias source: burnInEffectSource
property int burnInScaling: scaleTexture * appSettings.burnInQuality
width: appSettings.lowResolutionFont
2018-12-16 22:30:03 +01:00
? kterminal.totalWidth * Math.max(1, burnInScaling)
: kterminal.totalWidth * scaleTexture * appSettings.burnInQuality
height: appSettings.lowResolutionFont
2018-12-16 22:30:03 +01:00
? kterminal.totalHeight * Math.max(1, burnInScaling)
: kterminal.totalHeight * scaleTexture * appSettings.burnInQuality
2018-11-08 18:21:33 +01:00
ShaderEffectSource {
id: burnInEffectSource
anchors.fill: parent
sourceItem: burnInShaderEffect
live: false
recursive: true
hideSource: true
2018-12-16 22:30:03 +01:00
wrapMode: ShaderEffectSource.ClampToEdge
2018-11-08 18:21:33 +01:00
format: ShaderEffectSource.RGBA
2018-11-21 18:18:18 +01:00
// Enabling smooth with a low burnInQuality causes bad artifacts because the FBO
// has different values when it's read back. This lowers the quality, but makes it more consistent.
smooth: true //appSettings.burnInQuality === 1.0
2018-11-21 18:18:18 +01:00
2018-11-08 18:21:33 +01:00
visible: false
2018-11-08 18:21:33 +01:00
Connections {
target: kterminal
onImagePainted: completelyUpdate()
}
// Restart blurred source settings change.
Connections{
target: appSettings
onBurnInChanged: burnInEffect.restartBlurSource();
onTerminalFontChanged: burnInEffect.restartBlurSource();
onRasterizationChanged: burnInEffect.restartBlurSource();
onBurnInQualityChanged: burnInEffect.restartBlurSource();
}
2018-11-08 18:21:33 +01:00
Connections {
target: kterminalScrollbar
2018-11-09 21:06:13 +01:00
onOpacityChanged: completelyUpdate()
2018-11-08 18:21:33 +01:00
}
}
2018-11-08 18:21:33 +01:00
ShaderEffect {
id: burnInShaderEffect
2018-11-08 18:21:33 +01:00
property variant txt_source: kterminalSource
property variant burnInSource: burnInEffectSource
property real burnInTime: burnInFadeTime
property real lastUpdate: burnInEffect.lastUpdate
property real prevLastUpdate: burnInEffect.prevLastUpdate
2018-11-08 18:21:33 +01:00
anchors.fill: parent
2018-11-08 18:21:33 +01:00
blending: false
2018-11-08 18:21:33 +01:00
fragmentShader:
"#ifdef GL_ES
precision mediump float;
#endif\n" +
2018-11-08 18:21:33 +01:00
"uniform lowp float qt_Opacity;" +
"uniform lowp sampler2D txt_source;" +
2018-11-08 18:21:33 +01:00
"varying highp vec2 qt_TexCoord0;
2018-11-08 18:21:33 +01:00
uniform lowp sampler2D burnInSource;
uniform highp float burnInTime;
2018-11-08 18:21:33 +01:00
uniform highp float lastUpdate;
2018-11-08 18:21:33 +01:00
uniform highp float prevLastUpdate;" +
"float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
2018-11-08 18:21:33 +01:00
}" +
"void main() {
vec2 coords = qt_TexCoord0;
2018-11-08 18:26:27 +01:00
vec3 txtColor = texture2D(txt_source, coords).rgb;
2018-11-08 18:21:33 +01:00
vec4 accColor = texture2D(burnInSource, coords);
float prevMask = accColor.a;
float currMask = rgb2grey(txtColor);
2018-11-08 18:21:33 +01:00
2018-11-09 21:06:13 +01:00
highp float blurDecay = clamp((lastUpdate - prevLastUpdate) * burnInTime, 0.0, 1.0);
blurDecay = max(0.0, blurDecay - prevMask);
2018-11-08 18:21:33 +01:00
vec3 blurColor = accColor.rgb - vec3(blurDecay);
2018-11-09 21:06:13 +01:00
vec3 color = max(blurColor, txtColor);
2018-11-08 18:21:33 +01:00
gl_FragColor = vec4(color, currMask);
}
"
onStatusChanged: if (log) console.log(log) //Print warning messages
}
}
}