diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index ece0768..b5fcdbe 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -23,6 +23,8 @@ import QtQuick.Controls 1.1 import QMLTermWidget 1.0 +import "utils.js" as Utils + Item{ id: terminalContainer @@ -43,10 +45,10 @@ Item{ anchors.bottomMargin: frame.displacementBottom * appSettings.windowScaling //The blur effect has to take into account the framerate - property real mBlur: appSettings.burnIn - property real motionBlurCoefficient: (_maxBlurCoefficient * Math.sqrt(mBlur) + _minBlurCoefficient * (1 - Math.sqrt(mBlur))) - property real _minBlurCoefficient: 0.50 - property real _maxBlurCoefficient: 0.90 + property real mBlur: Math.sqrt(appSettings.burnIn) + property real motionBlurCoefficient: Utils.lint(_minBlurCoefficient, _maxBlurCoefficient, mBlur) + property real _minBlurCoefficient: 0.2 + property real _maxBlurCoefficient: 0.02 property size terminalSize: kterminal.terminalSize property size fontMetrics: kterminal.fontMetrics @@ -244,6 +246,12 @@ Item{ Timer{ id: livetimer + + // The interval assumes 60 fps. This is the time needed burnout a white pixel. + // We multiply 1.1 to have a little bit of margin over the theoretical value. + // This solution is not extremely clean, but it's probably the best to avoid measuring fps. + + interval: (1 / motionBlurCoefficient) * 60 * 1.1 running: true onTriggered: _blurredSourceEffect.live = false; } @@ -287,7 +295,7 @@ Item{ sourceComponent: ShaderEffect { property variant txt_source: kterminalSource property variant blurredSource: blurredSourceLoader.item - property real blurCoefficient: (1.0 - motionBlurCoefficient) + property real blurCoefficient: motionBlurCoefficient blending: false @@ -307,10 +315,10 @@ Item{ "void main() {" + "vec2 coords = qt_TexCoord0;" + "vec3 origColor = texture2D(txt_source, coords).rgb;" + - "vec3 blur_color = texture2D(blurredSource, coords).rgb * (1.0 - blurCoefficient);" + + "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(blurCoefficient);" + "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" + - "gl_FragColor = vec4(color, step(0.02, rgb2grey(color - origColor)));" + + "gl_FragColor = vec4(color, rgb2grey(color - origColor));" + "}" onStatusChanged: if (log) console.log(log) //Print warning messages diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index aa024b0..e9b91c3 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -26,6 +26,8 @@ ShaderEffect { property ShaderEffectSource blurredSource property ShaderEffectSource bloomSource + property real liveBlur: blurredSource && blurredSource.live ? 1.0 : 0.0 + property color fontColor: appSettings.fontColor property color backgroundColor: appSettings.backgroundColor property real bloom: appSettings.bloom * 2.5 @@ -160,7 +162,8 @@ ShaderEffect { uniform highp sampler2D bloomSource; uniform lowp float bloom;" : "") + (burnIn !== 0 ? " - uniform sampler2D blurredSource;" : "") + + uniform sampler2D blurredSource; + uniform lowp float liveBlur;" : "") + (staticNoise !== 0 ? " uniform highp float staticNoise;" : "") + (((staticNoise !== 0 || jitter !== 0 || rbgShift) @@ -266,7 +269,7 @@ ShaderEffect { "vec3 txt_color = texture2D(source, txt_coords).rgb;" + (burnIn !== 0 ? " - vec4 txt_blur = texture2D(blurredSource, txt_coords); + vec4 txt_blur = liveBlur * texture2D(blurredSource, txt_coords); txt_color = txt_color + txt_blur.rgb * txt_blur.a;" : "") +