From 0af2b20b3a3203d92157256d53ae5002800e79f2 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Wed, 9 Jan 2019 19:01:11 +0100 Subject: [PATCH] Settings optin for old burinin version. It seems to be working better on osx. --- app/qml/ApplicationSettings.qml | 10 ++- app/qml/BurnInEffect.qml | 19 ++--- app/qml/PreprocessedTerminal.qml | 24 +++++- app/qml/SettingsAdvancedTab.qml | 6 ++ app/qml/ShaderTerminal.qml | 17 ++++- app/qml/SlowBurnIn.qml | 122 +++++++++++++++++++++++++++++++ app/qml/TerminalContainer.qml | 1 + app/qml/resources.qrc | 1 + 8 files changed, 182 insertions(+), 18 deletions(-) create mode 100644 app/qml/SlowBurnIn.qml diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 3d73a3f..7ab3088 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -33,6 +33,9 @@ QtObject{ readonly property real minimumFontScaling: 0.25 readonly property real maximumFontScaling: 2.50 + readonly property real minBurnInFadeTime: 160 + readonly property real maxBurnInFadeTime: 1600 + // GENERAL SETTINGS /////////////////////////////////////////////////////// property int x: 100 @@ -52,7 +55,9 @@ QtObject{ property bool verbose: false property real bloomQuality: 0.5 + property real burnInQuality: 0.5 + property bool useFastBurnIn: Qt.platform.os === "osx" ? false : true onWindowScalingChanged: handleFontChanged(); @@ -202,7 +207,8 @@ QtObject{ bloomQuality: bloomQuality, burnInQuality: burnInQuality, useCustomCommand: useCustomCommand, - customCommand: customCommand + customCommand: customCommand, + useFastBurnIn: useFastBurnIn } return stringify(settings); } @@ -288,6 +294,8 @@ QtObject{ useCustomCommand = settings.useCustomCommand !== undefined ? settings.useCustomCommand : useCustomCommand customCommand = settings.customCommand !== undefined ? settings.customCommand : customCommand + + useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn; } function loadProfileString(profileString){ diff --git a/app/qml/BurnInEffect.qml b/app/qml/BurnInEffect.qml index 437e00a..2d4f223 100644 --- a/app/qml/BurnInEffect.qml +++ b/app/qml/BurnInEffect.qml @@ -13,10 +13,12 @@ Loader { 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 + property real _minBurnInFadeTime: appSettings.minBurnInFadeTime + property real _maxBurnInFadeTime: appSettings.maxBurnInFadeTime - active: appSettings.burnIn !== 0 + active: appSettings.useFastBurnIn && appSettings.burnIn !== 0 + + anchors.fill: parent function completelyUpdate() { prevLastUpdate = lastUpdate; @@ -33,16 +35,6 @@ Loader { sourceComponent: Item { property alias source: burnInEffectSource - property int burnInScaling: scaleTexture * appSettings.burnInQuality - - width: appSettings.lowResolutionFont - ? kterminal.totalWidth * Math.max(1, burnInScaling) - : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality - - height: appSettings.lowResolutionFont - ? kterminal.totalHeight * Math.max(1, burnInScaling) - : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality - ShaderEffectSource { id: burnInEffectSource @@ -88,7 +80,6 @@ Loader { property real prevLastUpdate: burnInEffect.prevLastUpdate anchors.fill: parent - blending: false fragmentShader: diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index e9bfc45..b8d61e4 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -33,6 +33,7 @@ Item{ property ShaderEffectSource mainSource: kterminalSource property BurnInEffect burnInEffect: burnInEffect + property SlowBurnIn slowBurnInEffect: slowBurnInEffect property real fontWidth: 1.0 property real screenScaling: 1.0 property real scaleTexture: 1.0 @@ -227,7 +228,26 @@ Item{ sourceRect: Qt.rect(-kterminal.margin, -kterminal.margin, kterminal.totalWidth, kterminal.totalHeight) } - BurnInEffect { - id: burnInEffect + Item { + id: burnInContainer + + property int burnInScaling: scaleTexture * appSettings.burnInQuality + + width: Math.round(appSettings.lowResolutionFont + ? kterminal.totalWidth * Math.max(1, burnInScaling) + : kterminal.totalWidth * scaleTexture * appSettings.burnInQuality) + + height: Math.round(appSettings.lowResolutionFont + ? kterminal.totalHeight * Math.max(1, burnInScaling) + : kterminal.totalHeight * scaleTexture * appSettings.burnInQuality) + + + BurnInEffect { + id: burnInEffect + } + + SlowBurnIn { + id: slowBurnInEffect + } } } diff --git a/app/qml/SettingsAdvancedTab.qml b/app/qml/SettingsAdvancedTab.qml index 06d20f5..c0d486a 100644 --- a/app/qml/SettingsAdvancedTab.qml +++ b/app/qml/SettingsAdvancedTab.qml @@ -133,6 +133,12 @@ Tab{ } } SizedLabel{text: Math.round(burnInSlider.value * 100) + "%"} + CheckBox{ + Layout.columnSpan: 2 + text: qsTr("Burnin optimization (Might display timing artifacts)") + checked: appSettings.useFastBurnIn + onCheckedChanged: appSettings.useFastBurnIn = checked + } } } } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index d480961..ed367af 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -24,6 +24,7 @@ import QtGraphicalEffects 1.0 import "utils.js" as Utils Item { + property SlowBurnIn slowBurnInEffect property ShaderEffectSource source property BurnInEffect burnInEffect property ShaderEffectSource bloomSource @@ -56,9 +57,16 @@ Item { property real horizontalSync: appSettings.horizontalSync property real horizontalSyncStrength: Utils.lint(0.05, 0.35, horizontalSync) property real glowingLine: appSettings.glowingLine * 0.2 - property real burnIn: appSettings.burnIn + + // Fast burnin properties + property real burnIn: appSettings.useFastBurnIn ? appSettings.burnIn : 0 property real burnInLastUpdate: burnInEffect.lastUpdate property real burnInTime: burnInEffect.burnInFadeTime + + // Slow burnin properties + property real slowBurnIn: appSettings.useFastBurnIn ? 0 : appSettings.burnIn + property ShaderEffectSource slowBurnInSource: slowBurnInEffect.source + property real jitter: appSettings.jitter property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) @@ -162,6 +170,8 @@ Item { uniform sampler2D burnInSource; uniform highp float burnInLastUpdate; uniform highp float burnInTime;" : "") + + (slowBurnIn !== 0 ? " + uniform sampler2D slowBurnInSource;" : "") + (staticNoise !== 0 ? " uniform highp float staticNoise;" : "") + (((staticNoise !== 0 || jitter !== 0) @@ -292,6 +302,11 @@ Item { txt_color = max(txt_color, convertWithChroma(burnInColor));" : "") + + (slowBurnIn !== 0 ? " + vec4 txt_blur = texture2D(slowBurnInSource, staticCoords); + txt_color = max(txt_color, convertWithChroma(txt_blur.rgb * txt_blur.a)); + " : "") + + "txt_color += fontColor.rgb * vec3(color);" + "vec3 finalColor = txt_color;" + diff --git a/app/qml/SlowBurnIn.qml b/app/qml/SlowBurnIn.qml new file mode 100644 index 0000000..44f53e9 --- /dev/null +++ b/app/qml/SlowBurnIn.qml @@ -0,0 +1,122 @@ +import QtQuick 2.0 + +import "utils.js" as Utils + +Loader { + property ShaderEffectSource source: item ? item.source : null + + active: !appSettings.useFastBurnIn && appSettings.burnIn !== 0 + + anchors.fill: parent + + sourceComponent: Item { + property alias source: burnInSourceEffect + + property int burnInScaling: scaleTexture * appSettings.burnInQuality + + ShaderEffectSource { + property bool updateBurnIn: false + property real burnIn: appSettings.burnIn + property real fps: appSettings.fps !== 0 ? appSettings.fps : 60 + property real burnInFadeTime: Utils.lint(minBurnInFadeTime, maxBurnInFadeTime, burnIn) + property real burnInCoefficient: 1000 / (fps * burnInFadeTime) + property real minBurnInFadeTime: appSettings.minBurnInFadeTime + property real maxBurnInFadeTime: appSettings.maxBurnInFadeTime + + id: burnInSourceEffect + + anchors.fill: parent + + sourceItem: burnInEffect + recursive: true + live: false + hideSource: true + wrapMode: kterminalSource.wrapMode + + visible: false + + function restartBlurSource(){ + livetimer.restart(); + } + + // This updates the burnin synched with the timer. + Connections { + target: burnInSourceEffect.updateBurnIn ? timeManager : null + ignoreUnknownSignals: false + onTimeChanged: { + burnInSourceEffect.scheduleUpdate(); + } + } + + 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: burnInSourceEffect.burnInFadeTime * 1.1 + running: true + onTriggered: burnInSourceEffect.updateBurnIn = false; + } + Connections{ + target: kterminal + onImagePainted:{ + burnInSourceEffect.scheduleUpdate(); + burnInSourceEffect.updateBurnIn = true; + livetimer.restart(); + } + } + // Restart blurred source settings change. + Connections{ + target: appSettings + onBurnInChanged: burnInSourceEffect.restartBlurSource(); + onTerminalFontChanged: burnInSourceEffect.restartBlurSource(); + onRasterizationChanged: burnInSourceEffect.restartBlurSource(); + onBurnInQualityChanged: burnInSourceEffect.restartBlurSource(); + } + Connections { + target: kterminalScrollbar + onOpacityChanged: burnInSourceEffect.restartBlurSource(); + } + + ShaderEffect { + id: burnInEffect + + property variant txt_source: kterminalSource + property variant blurredSource: burnInSourceEffect + property real burnInCoefficient: burnInSourceEffect.burnInCoefficient + + anchors.fill: parent + blending: false + + fragmentShader: + "#ifdef GL_ES + precision mediump float; + #endif\n" + + + "uniform lowp float qt_Opacity;" + + "uniform lowp sampler2D txt_source;" + + + "varying highp vec2 qt_TexCoord0; + uniform lowp sampler2D blurredSource; + uniform highp float burnInCoefficient;" + + + "float max3(vec3 v) { + return max (max (v.x, v.y), v.z); + }" + + + "void main() {" + + "vec2 coords = qt_TexCoord0;" + + "vec3 origColor = texture2D(txt_source, coords).rgb;" + + "vec3 blur_color = texture2D(blurredSource, coords).rgb - vec3(burnInCoefficient);" + + "vec3 color = min(origColor + blur_color, max(origColor, blur_color));" + + + "gl_FragColor = vec4(color, max3(color - origColor));" + + "}" + + onStatusChanged: if (log) console.log(log) //Print warning messages + } + } + } +} diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml index ea390ab..48d6ec1 100644 --- a/app/qml/TerminalContainer.qml +++ b/app/qml/TerminalContainer.qml @@ -12,6 +12,7 @@ ShaderTerminal { source: terminal.mainSource burnInEffect: terminal.burnInEffect + slowBurnInEffect: terminal.slowBurnInEffect virtual_resolution: terminal.virtualResolution TimeManager{ diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index 65ca840..8df465f 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -43,5 +43,6 @@ BurnInEffect.qml fonts/modern-terminus/TerminusTTF-4.46.0.ttf NewTerminalFrame.qml + SlowBurnIn.qml