From 3f513080578c8125a3f91269f63a4b3c3a2b462c Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Wed, 10 Dec 2025 23:14:15 +0100 Subject: [PATCH] Improve noise scale and frameskip for effects. --- app/qml/ApplicationSettings.qml | 10 ++--- app/qml/PreprocessedTerminal.qml | 2 +- app/qml/SettingsAdvancedTab.qml | 57 +++++++++----------------- app/qml/TimeManager.qml | 35 +++++++++------- app/shaders/terminal_dynamic.frag | 6 +-- app/shaders/terminal_dynamic.frag.qsb | Bin 9450 -> 9197 bytes app/shaders/terminal_dynamic.vert | 2 +- app/shaders/terminal_dynamic.vert.qsb | Bin 3618 -> 3528 bytes 8 files changed, 50 insertions(+), 62 deletions(-) diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 424f0bd..83df78f 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -31,8 +31,8 @@ QtObject { readonly property real minimumFontScaling: 0.25 readonly property real maximumFontScaling: 2.50 - readonly property real minBurnInFadeTime: 160 - readonly property real maxBurnInFadeTime: 1600 + readonly property real minBurnInFadeTime: 0.16 + readonly property real maxBurnInFadeTime: 1.6 property bool isMacOS: Qt.platform.os === "osx" @@ -50,7 +50,7 @@ QtObject { property bool showTerminalSize: true property real windowScaling: 1.0 - property real fps: 20 + property int effectsFrameSkip: 2 property bool verbose: false property real bloomQuality: 0.5 @@ -229,7 +229,7 @@ QtObject { function composeSettingsString() { var settings = { - "fps": fps, + "effectsFrameSkip": effectsFrameSkip, "x": x, "y": y, "width": width, @@ -315,7 +315,7 @@ QtObject { showTerminalSize = settings.showTerminalSize !== undefined ? settings.showTerminalSize : showTerminalSize - fps = settings.fps !== undefined ? settings.fps : fps + effectsFrameSkip = settings.effectsFrameSkip !== undefined ? settings.effectsFrameSkip : effectsFrameSkip windowScaling = settings.windowScaling !== undefined ? settings.windowScaling : windowScaling diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 5c23e48..916ae5b 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -251,7 +251,7 @@ Item{ ShaderEffectSource{ id: kterminalSource sourceItem: kterminal - hideSource: false + hideSource: true wrapMode: ShaderEffectSource.Repeat visible: false textureSize: Qt.size(kterminal.totalWidth * scaleTexture, kterminal.totalHeight * scaleTexture) diff --git a/app/qml/SettingsAdvancedTab.qml b/app/qml/SettingsAdvancedTab.qml index 0adf851..3fe97ce 100644 --- a/app/qml/SettingsAdvancedTab.qml +++ b/app/qml/SettingsAdvancedTab.qml @@ -73,24 +73,17 @@ ColumnLayout { Slider { Layout.fillWidth: true Layout.columnSpan: 2 - id: fpsSlider - onValueChanged: { - if (enabled) { - appSettings.fps = value !== 60 ? value + 1 : 0 - } - } + id: effectsFpsSlider + onValueChanged: appSettings.effectsFrameSkip = Math.round(value) stepSize: 1 - enabled: false - Component.onCompleted: { - from = 0 - to = 60 - value = appSettings.fps !== 0 ? appSettings.fps - 1 : 60 - enabled = true - } + enabled: true + from: 5 + to: 1 + value: appSettings.effectsFrameSkip } SizedLabel { - text: appSettings.fps !== 0 ? appSettings.fps : qsTr("Max") + text: Math.round(100 / Math.max(1, Math.round(effectsFpsSlider.value))) + "%" } Label { text: qsTr("Texture Quality") @@ -99,15 +92,11 @@ ColumnLayout { id: txtslider Layout.fillWidth: true Layout.columnSpan: 2 - onValueChanged: if (enabled) - appSettings.windowScaling = value + onValueChanged: appSettings.windowScaling = value stepSize: 0.05 - enabled: false - Component.onCompleted: { - from = 0.25 //Without this value gets set to 0.5 - value = appSettings.windowScaling - enabled = true - } + enabled: true + from: 0.25 + value: appSettings.windowScaling } SizedLabel { text: Math.round(txtslider.value * 100) + "%" @@ -120,15 +109,11 @@ ColumnLayout { Layout.fillWidth: true Layout.columnSpan: 2 id: bloomSlider - onValueChanged: if (enabled) - appSettings.bloomQuality = value + onValueChanged: appSettings.bloomQuality = value stepSize: 0.05 - enabled: false - Component.onCompleted: { - from = 0.25 - value = appSettings.bloomQuality - enabled = true - } + enabled: true + from: 0.25 + value: appSettings.bloomQuality } SizedLabel { text: Math.round(bloomSlider.value * 100) + "%" @@ -141,15 +126,11 @@ ColumnLayout { Layout.fillWidth: true id: burnInSlider Layout.columnSpan: 2 - onValueChanged: if (enabled) - appSettings.burnInQuality = value + onValueChanged: appSettings.burnInQuality = value stepSize: 0.05 - enabled: false - Component.onCompleted: { - from = 0.25 - value = appSettings.burnInQuality - enabled = true - } + enabled: true + from: 0.25 + value: appSettings.burnInQuality } SizedLabel { text: Math.round(burnInSlider.value * 100) + "%" diff --git a/app/qml/TimeManager.qml b/app/qml/TimeManager.qml index 6424af2..7f0a428 100644 --- a/app/qml/TimeManager.qml +++ b/app/qml/TimeManager.qml @@ -17,22 +17,29 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -import QtQuick 2.2 +import QtQuick -Timer { - default property bool enableTimer: false - property real time +QtObject { + id: timeManager - NumberAnimation on time { - from: 0 - to: 100000 - running: appSettings.fps === 0 && enableTimer - duration: 100000 - loops: Animation.Infinite + property bool enableTimer: false + property real time: 0 + + property int framesPerUpdate: Math.max(1, appSettings.effectsFrameSkip) + property int _frameCounter: 0 + + property var frameDriver: FrameAnimation { + running: enableTimer + onTriggered: { + timeManager._frameCounter += 1 + + if (timeManager._frameCounter >= timeManager.framesPerUpdate) { + time = elapsedTime + timeManager._frameCounter = 0 + } + } } - onTriggered: time += interval - running: appSettings.fps !== 0 && enableTimer - interval: Math.round(1000 / appSettings.fps) - repeat: true + onEnableTimerChanged: if (!enableTimer) _frameCounter = 0 + onFramesPerUpdateChanged: _frameCounter = 0 } diff --git a/app/shaders/terminal_dynamic.frag b/app/shaders/terminal_dynamic.frag index 9aeff59..0eb9453 100644 --- a/app/shaders/terminal_dynamic.frag +++ b/app/shaders/terminal_dynamic.frag @@ -102,7 +102,7 @@ vec3 applyRasterization(vec2 screenCoords, vec3 texel, vec2 virtualRes, float in } float randomPass(vec2 coords){ - return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.00015))); + return fract(smoothstep(-120.0, 0.0, coords.y - (virtualResolution.y + 120.0) * fract(time * 0.15))); } vec2 barrel(vec2 v, vec2 cc) { @@ -125,10 +125,10 @@ void main() { vec2 staticCoords = barrel(qt_TexCoord0, cc); vec2 coords = qt_TexCoord0; - float dst = sin((coords.y + time * 0.001) * vDistortionFreq); + float dst = sin((coords.y + time) * vDistortionFreq); coords.x += dst * vDistortionScale; - vec4 noiseTexel = texture(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0))); + vec4 noiseTexel = texture(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 0.051), fract(time / 0.237))); vec2 txt_coords = coords + (noiseTexel.ba - vec2(0.5)) * jitterDisplacement * jitter; diff --git a/app/shaders/terminal_dynamic.frag.qsb b/app/shaders/terminal_dynamic.frag.qsb index a75b41f2692ab4bd96ca59550f4e5921dbce8d6f..553d5ad46e2efd770680317583818b9be702ebc1 100644 GIT binary patch literal 9197 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 diff --git a/app/shaders/terminal_dynamic.vert b/app/shaders/terminal_dynamic.vert index 8b11375..ff301a0 100644 --- a/app/shaders/terminal_dynamic.vert +++ b/app/shaders/terminal_dynamic.vert @@ -48,7 +48,7 @@ layout(location = 3) out float vDistortionFreq; void main() { qt_TexCoord0 = qt_MultiTexCoord0; - vec2 coords = vec2(fract(time / 2048.0), fract(time / 1048576.0)); + vec2 coords = vec2(fract(time / 2.048), fract(time / 1048.576)); vec4 initialNoiseTexel = texture(noiseSource, coords); vBrightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering; diff --git a/app/shaders/terminal_dynamic.vert.qsb b/app/shaders/terminal_dynamic.vert.qsb index 2ef25082b0c3e82027ad4cd14c0f94375df4f6c3..1221ad148fcd460be390d8931cdc8b05bc596ee5 100644 GIT binary patch literal 3528 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