diff --git a/app/qml/ApplicationSettings.qml b/app/qml/ApplicationSettings.qml index 056a93f..d8a1d70 100644 --- a/app/qml/ApplicationSettings.qml +++ b/app/qml/ApplicationSettings.qml @@ -99,7 +99,12 @@ QtObject { property real rbgShift: 0.0 property real _margin: 0.5 + property real _frameMargin: 0.5 + property real margin: Utils.lint(1.0, 20.0, _margin) + property real frameMargin: Utils.lint(1.0, 50.0, _frameMargin) + + property real totalMargin: frameMargin + margin readonly property int no_rasterization: 0 readonly property int scanline_rasterization: 1 @@ -238,8 +243,7 @@ QtObject { "burnInQuality": burnInQuality, "useCustomCommand": useCustomCommand, "customCommand": customCommand, - "useFastBurnIn": useFastBurnIn, - "blinkingCursor": blinkingCursor + "useFastBurnIn": useFastBurnIn } return stringify(settings) } @@ -266,7 +270,9 @@ QtObject { "windowOpacity": windowOpacity, "fontName": fontNames[rasterization], "fontWidth": fontWidth, - "margin": _margin + "margin": _margin, + "blinkingCursor": blinkingCursor, + "frameMargin": _frameMargin, } return settings } @@ -335,9 +341,6 @@ QtObject { useFastBurnIn = settings.useFastBurnIn !== undefined ? settings.useFastBurnIn : useFastBurnIn - - blinkingCursor = settings.blinkingCursor - !== undefined ? settings.blinkingCursor : blinkingCursor } function loadProfileString(profileString) { @@ -379,6 +382,9 @@ QtObject { fontWidth = settings.fontWidth !== undefined ? settings.fontWidth : fontWidth _margin = settings.margin !== undefined ? settings.margin : _margin + _frameMargin = settings.frameMargin !== undefined ? settings.frameMargin : _frameMargin + + blinkingCursor = settings.blinkingCursor !== undefined ? settings.blinkingCursor : blinkingCursor handleFontChanged() } @@ -459,7 +465,9 @@ QtObject { "screenCurvature": 0.3, "staticNoise": 0.1198, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.1 }' builtin: true } @@ -486,7 +494,9 @@ QtObject { "screenCurvature": 0.3, "staticNoise": 0.1198, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.1 }' builtin: true } @@ -513,7 +523,9 @@ QtObject { "screenCurvature": 0.3, "staticNoise": 0.15, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.1 }' builtin: true } @@ -540,7 +552,9 @@ QtObject { "screenCurvature": 0, "staticNoise": 0.15, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.1 }' builtin: true } @@ -567,7 +581,9 @@ QtObject { "screenCurvature": 0.5, "staticNoise": 0.099, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.2 }' builtin: true } @@ -594,7 +610,9 @@ QtObject { "screenCurvature": 0.5, "staticNoise": 0.2969, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.5 }' builtin: true } @@ -621,7 +639,9 @@ QtObject { "screenCurvature": 0.4, "staticNoise": 0.0503, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.2 }' builtin: true } @@ -648,7 +668,9 @@ QtObject { "screenCurvature": 0.2, "staticNoise": 0, "windowOpacity": 1, - "margin": 0.5 + "margin": 0.5, + "blinkingCursor": false, + "frameMargin": 0.1 }' builtin: true } @@ -675,7 +697,9 @@ QtObject { "screenCurvature": 0, "staticNoise": 0.0955, "windowOpacity": 0.7, - "margin": 0.1 + "margin": 0.1, + "blinkingCursor": false, + "frameMargin": 0 }' builtin: true } diff --git a/app/qml/PreprocessedTerminal.qml b/app/qml/PreprocessedTerminal.qml index 5cbd22a..9edf981 100644 --- a/app/qml/PreprocessedTerminal.qml +++ b/app/qml/PreprocessedTerminal.qml @@ -73,7 +73,7 @@ Item{ id: kterminal property int textureResolutionScale: appSettings.lowResolutionFont ? devicePixelRatio : 1 - property int margin: appSettings.margin / screenScaling + property int margin: appSettings.totalMargin / screenScaling property int totalWidth: Math.floor(parent.width / (screenScaling * fontWidth)) property int totalHeight: Math.floor(parent.height / screenScaling) @@ -177,8 +177,8 @@ Item{ } property alias contextmenu: menuLoader.item - MouseArea{ - property real margin: appSettings.margin + MouseArea { + property real margin: appSettings.totalMargin acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: parent @@ -219,8 +219,8 @@ Item{ var cc = Qt.size(0.5 - x, 0.5 - y); var distortion = (cc.height * cc.height + cc.width * cc.width) * appSettings.screenCurvature * appSettings.screenCurvatureSize; - return Qt.point((x - cc.width * (1+distortion) * distortion) * kterminal.totalWidth, - (y - cc.height * (1+distortion) * distortion) * kterminal.totalHeight) + return Qt.point((x - cc.width * (1+distortion) * distortion) * (kterminal.totalWidth), + (y - cc.height * (1+distortion) * distortion) * (kterminal.totalHeight)) } } ShaderEffectSource{ diff --git a/app/qml/SettingsGeneralTab.qml b/app/qml/SettingsGeneralTab.qml index 8ad311b..ed3359e 100644 --- a/app/qml/SettingsGeneralTab.qml +++ b/app/qml/SettingsGeneralTab.qml @@ -206,6 +206,13 @@ ColumnLayout { onValueChanged: appSettings._margin = value value: appSettings._margin } + Label { + text: qsTr("Frame size") + } + SimpleSlider { + onValueChanged: appSettings._frameMargin = value + value: appSettings._frameMargin + } Label { text: qsTr("Opacity") } diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index 8e17fe6..4164320 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -79,8 +79,8 @@ Item { property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) property real staticNoise: appSettings.staticNoise - property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), - (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) + property size scaleNoiseSize: Qt.size((width * 0.75) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), + (height * 0.75) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) property size virtualResolution: parent.virtualResolution @@ -88,6 +88,8 @@ Item { // We progressively disable rasterization from 4x up to 2x resolution. property real rasterizationIntensity: Utils.smoothstep(2.0, 4.0, _screenDensity) + property real displayTerminalFrame: appSettings._frameMargin > 0 || appSettings.screenCurvature > 0 + property real time: timeManager.time property ShaderEffectSource noiseSource: noiseShaderSource @@ -190,9 +192,10 @@ Item { (((staticNoise !== 0 || jitter !== 0) ||(fallBack && (flickering || horizontalSync))) ? " uniform lowp sampler2D noiseSource; uniform highp vec2 scaleNoiseSize;" : "") + - (screenCurvature !== 0 ? " - uniform highp float screenCurvature; + (displayTerminalFrame ? " uniform lowp sampler2D frameSource;" : "") + + (screenCurvature !== 0 ? " + uniform highp float screenCurvature;" : "") + (glowingLine !== 0 ? " uniform highp float glowingLine;" : "") + (chromaColor !== 0 ? " @@ -328,7 +331,7 @@ Item { (ambientLight !== 0 ? " finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + - (screenCurvature !== 0 ? + (displayTerminalFrame ? "vec4 frameColor = texture2D(frameSource, qt_TexCoord0); finalColor = mix(finalColor, frameColor.rgb, frameColor.a);" : "") + @@ -351,7 +354,7 @@ Item { Loader { id: terminalFrameLoader - active: screenCurvature !== 0 + active: dynamicShader.displayTerminalFrame width: staticShader.width height: staticShader.height @@ -363,7 +366,7 @@ Item { visible: false format: ShaderEffectSource.RGBA - NewTerminalFrame { + TerminalFrame { id: terminalFrame blending: false anchors.fill: parent @@ -441,18 +444,9 @@ Item { (ambientLight !== 0 ? " uniform lowp float ambientLight;" : "") + - " - float min2(vec2 v) { - return min(v.x, v.y); - } - - float sum2(vec2 v) { - return v.x + v.y; - } - - float rgb2grey(vec3 v){ - return dot(v, vec3(0.21, 0.72, 0.04)); - }" + + shaderLibrary.min2 + + shaderLibrary.sum2 + + shaderLibrary.rgb2grey + "vec3 convertWithChroma(vec3 inColor) { vec3 outColor = inColor;" + diff --git a/app/qml/NewTerminalFrame.qml b/app/qml/TerminalFrame.qml similarity index 58% rename from app/qml/NewTerminalFrame.qml rename to app/qml/TerminalFrame.qml index 8fb2817..3e1baef 100644 --- a/app/qml/NewTerminalFrame.qml +++ b/app/qml/TerminalFrame.qml @@ -22,7 +22,7 @@ import QtQuick 2.0 import "utils.js" as Utils ShaderEffect { - property color _staticFrameColor: "#ffffff" + property color _staticFrameColor: "#fff" property color _backgroundColor: appSettings.backgroundColor property color _fontColor: appSettings.fontColor property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) @@ -30,9 +30,15 @@ ShaderEffect { property color frameColor: Utils.mix(_staticFrameColor, _lightColor, _ambientLight) property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize - property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) - property size aadelta: Qt.size(1.0 / width, 1.0 / height) + // Coefficient of the log curve used to approximate shadowing + property real screenShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) + property real frameShadowCoeff: Utils.lint(20.0, 10.0, _ambientLight) + + property size margin: Qt.size( + appSettings.frameMargin / width * appSettings.windowScaling, + appSettings.frameMargin / height * appSettings.windowScaling + ) ShaderLibrary { id: shaderLibrary @@ -44,10 +50,11 @@ ShaderEffect { #endif uniform lowp float screenCurvature; - uniform lowp float shadowLength; + uniform lowp float screenShadowCoeff; + uniform lowp float frameShadowCoeff; uniform highp float qt_Opacity; uniform lowp vec4 frameColor; - uniform mediump vec2 aadelta; + uniform mediump vec2 margin; varying highp vec2 qt_TexCoord0; @@ -65,25 +72,29 @@ ShaderEffect { " - void main(){ - vec2 staticCoords = qt_TexCoord0; - vec2 coords = distortCoordinates(staticCoords); + vec2 positiveLog(vec2 x) { + return clamp(log(x), vec2(0.0), vec2(100.0)); + } - vec3 color = vec3(0.0); + void main() { + vec2 staticCoords = qt_TexCoord0; + vec2 coords = distortCoordinates(staticCoords) * (vec2(1.0) + margin * 2.0) - margin; + + vec2 vignetteCoords = staticCoords * (1.0 - staticCoords.yx); + float vignette = pow(prod2(vignetteCoords) * 15.0, 0.25); + + vec3 color = frameColor.rgb * vec3(1.0 - vignette); float alpha = 0.0; - float outShadowLength = shadowLength; - float inShadowLength = shadowLength * 0.5; + float frameShadow = max2(positiveLog(-coords * frameShadowCoeff + vec2(1.0)) + positiveLog(coords * frameShadowCoeff - (vec2(frameShadowCoeff) - vec2(1.0)))); + frameShadow = max(sqrt(frameShadow), 0.0); + color *= frameShadow; + alpha = sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords)); + alpha = clamp(alpha, 0.0, 1.0); + alpha *= mix(1.0, 0.9, frameShadow); - float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); - outShadow = clamp(sqrt(outShadow), 0.0, 1.0); - color += frameColor.rgb * outShadow; - alpha = sum2(1.0 - smoothstep(vec2(0.0), aadelta, coords) + smoothstep(vec2(1.0) - aadelta, vec2(1.0), coords)); - alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, outShadow); - - float inShadow = 1.0 - prod2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords)); - inShadow = 0.5 * inShadow * inShadow; - alpha = max(alpha, inShadow); + float screenShadow = 1.0 - prod2(positiveLog(coords * screenShadowCoeff + vec2(1.0)) * positiveLog(-coords * screenShadowCoeff + vec2(screenShadowCoeff + 1.0))); + alpha = max(0.8 * screenShadow, alpha); gl_FragColor = vec4(color * alpha, alpha); } diff --git a/app/qml/resources.qrc b/app/qml/resources.qrc index 04b2701..ca16a75 100644 --- a/app/qml/resources.qrc +++ b/app/qml/resources.qrc @@ -40,7 +40,7 @@ fonts/1977-commodore-pet/PetMe.ttf BurnInEffect.qml fonts/modern-terminus/TerminusTTF-4.46.0.ttf - NewTerminalFrame.qml + TerminalFrame.qml SlowBurnIn.qml menus/WindowMenu.qml menus/FullContextMenu.qml