From 93e40ade4aace08a5d1036f5d4f882683bca36b5 Mon Sep 17 00:00:00 2001 From: Filippo Scognamiglio Date: Sun, 6 Jul 2014 23:57:47 +0200 Subject: [PATCH] Much improved frame reflections. This is a little bit heavier but much better looking. The code should be ok, but maybe the parameters might use some fine tuning. --- app/ApplicationSettings.qml | 10 ++-- app/SettingsGeneralTab.qml | 9 +++- app/SettingsTerminalTab.qml | 6 --- app/ShaderTerminal.qml | 6 +-- app/TimeManager.qml | 2 +- app/frames/utils/FrameShader.qml | 86 +++++++++++++++++++------------- 6 files changed, 69 insertions(+), 50 deletions(-) diff --git a/app/ApplicationSettings.qml b/app/ApplicationSettings.qml index 3b21cf2..25805d4 100644 --- a/app/ApplicationSettings.qml +++ b/app/ApplicationSettings.qml @@ -128,8 +128,9 @@ Item{ // FRAMES ///////////////////////////////////////////////////////////////// - property bool frame_reflections: true - property real frame_reflection_strength: ((frame_reflections && framelist.get(frames_index).reflections) ? 1.0 : 0.0) * 0.15 + property bool _frameReflections: true + property bool reflectionsAllowed: framelist.get(frames_index).reflections + property bool frameReflections: _frameReflections && reflectionsAllowed property alias profiles_list: profileslist property int profiles_index: 0 @@ -147,7 +148,8 @@ Item{ contrast: contrast, ambient_light: ambient_light, fontScalingIndexes: fontScalingIndexes, - fontIndexes: fontIndexes + fontIndexes: fontIndexes, + frameReflections: _frameReflections } return JSON.stringify(settings); } @@ -210,6 +212,8 @@ Item{ fontIndexes = settings.fontIndexes !== undefined ? settings.fontIndexes : fontIndexes fontScalingIndexes = settings.fontScalingIndexes !== undefined ? settings.fontScalingIndexes : fontScalingIndexes + + _frameReflections = settings.frameReflections !== undefined ? settings.frameReflections : _frameReflections; } function loadProfileString(profileString){ diff --git a/app/SettingsGeneralTab.qml b/app/SettingsGeneralTab.qml index e98e33f..c88b9e5 100644 --- a/app/SettingsGeneralTab.qml +++ b/app/SettingsGeneralTab.qml @@ -99,8 +99,15 @@ Tab{ anchors.right: parent.right GridLayout{ anchors.fill: parent - rows: 2 + rows: 3 columns: 3 + CheckBox{ + Layout.columnSpan: 3 + checked: shadersettings._frameReflections + text: qsTr("Frame reflections") + onCheckedChanged: shadersettings._frameReflections = checked + enabled: shadersettings.reflectionsAllowed + } CheckBox{ property int fps: checked ? slider.value : 0 onFpsChanged: shadersettings.fps = fps diff --git a/app/SettingsTerminalTab.qml b/app/SettingsTerminalTab.qml index 73aeeb5..b25f68a 100644 --- a/app/SettingsTerminalTab.qml +++ b/app/SettingsTerminalTab.qml @@ -122,12 +122,6 @@ Tab{ currentIndex: shadersettings.frames_index onCurrentIndexChanged: shadersettings.frames_index = currentIndex } - CheckBox{ - checked: shadersettings.frame_reflections - text: qsTr("Reflections") - onCheckedChanged: shadersettings.frame_reflections = checked - enabled: framescombobox.model.get(framescombobox.currentIndex).reflections - } } } } diff --git a/app/ShaderTerminal.qml b/app/ShaderTerminal.qml index a423669..a37de55 100644 --- a/app/ShaderTerminal.qml +++ b/app/ShaderTerminal.qml @@ -42,7 +42,7 @@ ShaderEffect { property real brightness_flickering: shadersettings.brightness_flickering property real horizontal_sincronization: shadersettings.horizontal_sincronization - property bool frame_reflection_strength: shadersettings.frame_reflection_strength + property bool frameReflections: shadersettings.frameReflections property real disp_top: frame.item.displacementTop * shadersettings.window_scaling property real disp_bottom: frame.item.displacementBottom * shadersettings.window_scaling @@ -51,7 +51,7 @@ ShaderEffect { property real brightness: shadersettings.brightness * 1.5 + 0.5 - property real time: timeManager.time !== 0 ? timeManager.time : 1 + property real time: timeManager.time property variant randomFunctionSource: randfuncsource blending: false @@ -138,7 +138,7 @@ ShaderEffect { :" vec2 coords = qt_TexCoord0;") + - (frame_reflection_strength ? " + (frameReflections ? " vec2 inside = step(0.0, coords) - step(1.0, coords); coords = abs(mod(floor(coords), 2.0) - fract(coords)) * clamp(inside.x + inside.y, 0.0, 1.0);" : "") + diff --git a/app/TimeManager.qml b/app/TimeManager.qml index 2b2346f..19b6062 100644 --- a/app/TimeManager.qml +++ b/app/TimeManager.qml @@ -21,7 +21,7 @@ import QtQuick 2.2 Timer{ - property int time + property real time NumberAnimation on time { from: 0 diff --git a/app/frames/utils/FrameShader.qml b/app/frames/utils/FrameShader.qml index 9d04efe..fee9045 100644 --- a/app/frames/utils/FrameShader.qml +++ b/app/frames/utils/FrameShader.qml @@ -1,4 +1,5 @@ import QtQuick 2.2 +import QtGraphicalEffects 1.0 ShaderEffect{ property variant source: framesource @@ -7,49 +8,50 @@ ShaderEffect{ property real ambient_light: shadersettings.ambient_light property color font_color: shadersettings.font_color property color background_color: shadersettings.background_color - property real time: timeManager.time - property variant randomFunctionSource: randfuncsource - property real brightness_flickering: shadersettings.brightness_flickering property real brightness: shadersettings.brightness * 1.5 + 0.5 - property real frame_reflection_strength: shadersettings.frame_reflection_strength + property bool frameReflections: shadersettings.frameReflections + property variant lightSource: reflectionEffectSourceLoader.item - property color reflection_color: Qt.rgba((font_color.r*0.3 + background_color.r*0.7), - (font_color.g*0.3 + background_color.g*0.7), - (font_color.b*0.3 + background_color.b*0.7), - 1.0) + Loader{ + id: reflectionEffectLoader + width: parent.width * 0.33 + height: parent.height * 0.33 + active: frameReflections + + sourceComponent: FastBlur{ + id: frameReflectionEffect + radius: 128 + source: terminal.kterminal + smooth: false + } + } + + Loader{ + id: reflectionEffectSourceLoader + active: frameReflections + sourceComponent: ShaderEffectSource{ + id: frameReflectionSource + sourceItem: reflectionEffectLoader.item + hideSource: true + smooth: true + } + } blending: true - vertexShader: " - uniform highp mat4 qt_Matrix; - uniform highp float time; - uniform sampler2D randomFunctionSource; - - attribute highp vec4 qt_Vertex; - attribute highp vec2 qt_MultiTexCoord0; - - varying highp vec2 qt_TexCoord0; - varying lowp float brightness; - - void main() { - qt_TexCoord0 = qt_MultiTexCoord0; - brightness = "+brightness.toFixed(1)+";" + - (brightness_flickering !== 0 ? - "brightness -= texture2D(randomFunctionSource, vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0*2.0)))).r * "+brightness_flickering.toFixed(1)+";" - : "") + " - - gl_Position = qt_Matrix * qt_Vertex; - }" - fragmentShader: " uniform sampler2D source; uniform sampler2D normals; uniform highp float screen_distorsion; uniform highp float ambient_light; - uniform highp float qt_Opacity; + uniform highp float qt_Opacity;" + - uniform vec4 reflection_color; + (frameReflections ? + "uniform sampler2D lightSource;" : "") + " + + uniform vec4 font_color; + uniform vec4 background_color; varying lowp float brightness; varying highp vec2 qt_TexCoord0; @@ -65,11 +67,23 @@ ShaderEffect{ vec4 txt_color = texture2D(source, coords); vec4 txt_normal = texture2D(normals, coords); vec3 normal = normalize(txt_normal.rgb * 2.0 - 1.0); - vec3 light_dir = normalize(vec3(0.5,0.5, 0.0) - vec3(qt_TexCoord0, 0.0)); - float diffuse = dot(normal, light_dir); - float reflection = (diffuse * 0.6 + 0.4) * txt_normal.a; - float reflection_alpha = (1.0 - diffuse*"+frame_reflection_strength.toFixed(1)+"); - vec4 dark_color = vec4(reflection_color.rgb * reflection * 0.4, txt_normal.a * reflection_alpha); + vec3 light_direction = normalize(vec3(0.5, 0.5, 0.0) - vec3(qt_TexCoord0, 0.0)); + + float dotProd = dot(normal, light_direction);" + + + (frameReflections ? " + float screenLight = texture2D(lightSource, coords).r; + float clampedDotProd = clamp(dotProd, 0.05, 1.0); + float diffuseReflection = clamp(screenLight * 1.5 * clampedDotProd, 0.0, 0.35); + float reflectionAlpha = mix(1.0, 0.90, dotProd);" + : " + float diffuseReflection = 0.0; + float reflectionAlpha = 1.0;") + " + + vec3 back_color = background_color.rgb * (0.2 + 0.5 * dotProd); + vec3 front_color = font_color.rgb * (0.05 + diffuseReflection); + + vec4 dark_color = vec4((back_color + front_color) * txt_normal.a, txt_normal.a * reflectionAlpha); gl_FragColor = mix(dark_color, txt_color, ambient_light); }"