diff --git a/app/qml/ShaderTerminal.qml b/app/qml/ShaderTerminal.qml index 5ae04b3..ada73ef 100644 --- a/app/qml/ShaderTerminal.qml +++ b/app/qml/ShaderTerminal.qml @@ -23,320 +23,310 @@ import QtGraphicalEffects 1.0 import "utils.js" as Utils -ShaderEffect { +Item { property ShaderEffectSource source property BurnInEffect burnInEffect property ShaderEffectSource bloomSource - property ShaderEffectSource screenBuffer: frameBuffer - property color fontColor: appSettings.fontColor property color backgroundColor: appSettings.backgroundColor - property real bloom: appSettings.bloom * 2.5 - - property ShaderEffectSource burnInSource: burnInEffect.source - property real burnIn: appSettings.burnIn - property real burnInLastUpdate: burnInEffect.lastUpdate - property real burnInTime: burnInEffect.burnInFadeTime - - property real jitter: appSettings.jitter - property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter) - - 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 real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize - property real glowingLine: appSettings.glowingLine * 0.2 - property real chromaColor: appSettings.chromaColor; - - property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling - - property real flickering: appSettings.flickering - property real horizontalSync: appSettings.horizontalSync * 0.5 - - property int rasterization: appSettings.rasterization - - property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) + property real chromaColor: appSettings.chromaColor property real ambientLight: appSettings.ambientLight * 0.2 - property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight) - property size virtual_resolution - property real time: timeManager.time - property ShaderEffectSource noiseSource: noiseShaderSource + ShaderEffect { + id: dynamicShader - // If something goes wrong activate the fallback version of the shader. - property bool fallBack: false + property ShaderEffectSource screenBuffer: frameBuffer + property ShaderEffectSource burnInSource: burnInEffect.source - blending: false + property color fontColor: parent.fontColor + property color backgroundColor: parent.backgroundColor + property real screenCurvature: parent.screenCurvature + property real chromaColor: parent.chromaColor + property real ambientLight: parent.ambientLight - //Smooth random texture used for flickering effect. - Image{ - id: noiseTexture - source: "images/allNoise512.png" - width: 512 - height: 512 - fillMode: Image.Tile - visible: false - } - ShaderEffectSource{ - id: noiseShaderSource - sourceItem: noiseTexture - wrapMode: ShaderEffectSource.Repeat - visible: false - smooth: true - } + property real flickering: appSettings.flickering + property real horizontalSync: appSettings.horizontalSync * 0.5 + property real glowingLine: appSettings.glowingLine * 0.2 + property real burnIn: appSettings.burnIn + property real burnInLastUpdate: burnInEffect.lastUpdate + property real burnInTime: burnInEffect.burnInFadeTime + 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) + property real staticNoise: appSettings.staticNoise + property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling), + (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling)) - //Print the number with a reasonable precision for the shader. - function str(num){ - return num.toFixed(8); - } + property size virtual_resolution: parent.virtual_resolution - vertexShader: " - uniform highp mat4 qt_Matrix; - uniform highp float time; + property real time: timeManager.time + property ShaderEffectSource noiseSource: noiseShaderSource - attribute highp vec4 qt_Vertex; - attribute highp vec2 qt_MultiTexCoord0; + // If something goes wrong activate the fallback version of the shader. + property bool fallBack: false - varying highp vec2 qt_TexCoord0;" + + anchors.fill: parent + blending: false - (!fallBack ? " - uniform sampler2D noiseSource;" : "") + - - (!fallBack && rbgShift !== 0.0 ?" - varying lowp vec4 constantNoise;" : "") + - - (!fallBack && flickering !== 0.0 ?" - varying lowp float brightness; - uniform lowp float flickering;" : "") + - - (!fallBack && horizontalSync !== 0.0 ?" - uniform lowp float horizontalSync; - varying lowp float distortionScale; - varying lowp float distortionFreq;" : "") + - - " - void main() { - qt_TexCoord0 = qt_MultiTexCoord0; - vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + - - (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? - "vec4 initialNoiseTexel = texture2D(noiseSource, coords);" - : "") + - - (!fallBack && rbgShift !== 0.0 ?" - constantNoise = initialNoiseTexel;" : "") + - - (!fallBack && flickering !== 0.0 ? " - brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" - : "") + - - (!fallBack && horizontalSync !== 0.0 ? " - float randval = horizontalSync - initialNoiseTexel.r; - distortionScale = step(0.0, randval) * randval * horizontalSync; - distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" - : "") + - - "gl_Position = qt_Matrix * qt_Vertex; - }" - - fragmentShader: " - #ifdef GL_ES - precision mediump float; - #endif - - uniform sampler2D screenBuffer; - uniform highp float qt_Opacity; - uniform highp float time; - varying highp vec2 qt_TexCoord0; - - uniform highp vec4 fontColor; - uniform highp vec4 backgroundColor; - uniform lowp float screen_brightness; - uniform lowp float shadowLength; - - uniform highp vec2 virtual_resolution;" + - - (burnIn !== 0 ? " - uniform sampler2D burnInSource; - uniform highp float burnInLastUpdate; - uniform highp float burnInTime;" : "") + - (staticNoise !== 0 ? " - uniform highp float staticNoise;" : "") + - (((staticNoise !== 0 || jitter !== 0 || rbgShift) - ||(fallBack && (flickering || horizontalSync))) ? " - uniform lowp sampler2D noiseSource; - uniform highp vec2 scaleNoiseSize;" : "") + - (screenCurvature !== 0 ? " - uniform highp float screenCurvature;" : "") + - (glowingLine !== 0 ? " - uniform highp float glowingLine;" : "") + - (chromaColor !== 0 ? " - uniform lowp float chromaColor;" : "") + - (jitter !== 0 ? " - uniform lowp vec2 jitterDisplacement;" : "") + - (ambientLight !== 0 ? " - uniform lowp float ambientLight;" : "") + - - (fallBack && horizontalSync !== 0 ? " - uniform lowp float horizontalSync;" : "") + - (fallBack && flickering !== 0.0 ?" - uniform lowp float flickering;" : "") + - (!fallBack && flickering !== 0 ? " - varying lowp float brightness;" - : "") + - (!fallBack && horizontalSync !== 0 ? " - varying lowp float distortionScale; - varying lowp float distortionFreq;" : "") + - - (!fallBack && rbgShift !== 0.0 ?" - varying lowp vec4 constantNoise;" : "") + - - (glowingLine !== 0 ? " - float randomPass(vec2 coords){ - return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); - }" : "") + - - "float min2(vec2 v) { - return min(v.x, v.y); - } - - float rgb2grey(vec3 v){ - return dot(v, vec3(0.21, 0.72, 0.04)); - } - - float isInScreen(vec2 v) { - return min2(step(0.0, v) - step(1.0, v)); - } - - vec2 barrel(vec2 v, vec2 cc) {" + - - (screenCurvature !== 0 ? " - float distortion = dot(cc, cc) * screenCurvature; - return (v - cc * (1.0 + distortion) * distortion);" - : - "return v;") + - "}" + - - "vec3 convertWithChroma(vec3 inColor) { - vec3 outColor = inColor;" + - - (chromaColor !== 0 ? - "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);" - : - "outColor = fontColor.rgb * rgb2grey(inColor);") + - - " return outColor; - }" + - - "void main() {" + - "vec2 cc = vec2(0.5) - qt_TexCoord0;" + - "float distance = length(cc);" + - - //FallBack if there are problems - (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? - "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); - vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" - : "") + - (fallBack && flickering !== 0.0 ? " - float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" - : "") + - (fallBack && horizontalSync !== 0.0 ? " - float randval = horizontalSync - initialNoiseTexel.r; - float distortionScale = step(0.0, randval) * randval * horizontalSync; - float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" - : "") + - (fallBack && rbgShift !== 0.0 ?" - lowp vec4 constantNoise = initialNoiseTexel;" : "") + - - (staticNoise ? " - float noise = staticNoise;" : "") + - - (screenCurvature !== 0 ? " - vec2 curvatureCoords = barrel(qt_TexCoord0, cc); - float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords)); - vec2 staticCoords = curvatureCoords;" - :" - vec2 staticCoords = qt_TexCoord0; - float staticInScreen = 1.0;") + - - "vec2 coords = qt_TexCoord0;" + - - (horizontalSync !== 0 ? " - float dst = sin((coords.y + time * 0.001) * distortionFreq); - coords.x += dst * distortionScale;" + - - (staticNoise ? " - noise += distortionScale * 7.0;" : "") - - : "") + - - (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? - "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" - : "") + - - (jitter !== 0 ? " - vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); - vec2 txt_coords = coords + offset * jitterDisplacement;" - : "vec2 txt_coords = coords;") + - - "float color = 0.0001;" + - - (staticNoise !== 0 ? " - float noiseVal = noiseTexel.a; - color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + - - (glowingLine !== 0 ? " - color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + - - "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); - float inScreen2 = isInScreen(barrel(txt_coords, cc)); - vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; - vec3 txt_color = origTxtColor * inScreen2 + backgroundColor.rgb * (1.0 - inScreen2);" + - - (burnIn !== 0 ? " - vec4 txt_blur = texture2D(burnInSource, staticCoords); - float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); - vec3 burnInColor = 0.5 * (txt_blur.rgb - vec3(blurDecay)); - txt_color = max(txt_color, convertWithChroma(burnInColor));" - : "") + - - "txt_color += fontColor.rgb * vec3(color);" + - - "vec3 finalColor = txt_color;" + - - (flickering !== 0 ? " - finalColor *= brightness;" : "") + - - (ambientLight !== 0 ? " - finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + - - - "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); - finalColor = mix(finalColor, vec3(0.0), 0.35 * inShadow); - - finalColor = mix(origTxtColor, finalColor, staticInScreen); - gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + - "}" - - onStatusChanged: { - // Print warning messages - if (log) - console.log(log); - - // Activate fallback mode - if (status == ShaderEffect.Error) { - fallBack = true; + //Smooth random texture used for flickering effect. + Image{ + id: noiseTexture + source: "images/allNoise512.png" + width: 512 + height: 512 + fillMode: Image.Tile + visible: false } + ShaderEffectSource{ + id: noiseShaderSource + sourceItem: noiseTexture + wrapMode: ShaderEffectSource.Repeat + visible: false + smooth: true + } + + //Print the number with a reasonable precision for the shader. + function str(num){ + return num.toFixed(8); + } + + vertexShader: " + uniform highp mat4 qt_Matrix; + uniform highp float time; + + attribute highp vec4 qt_Vertex; + attribute highp vec2 qt_MultiTexCoord0; + + varying highp vec2 qt_TexCoord0;" + + + (!fallBack ? " + uniform sampler2D noiseSource;" : "") + + + (!fallBack && flickering !== 0.0 ?" + varying lowp float brightness; + uniform lowp float flickering;" : "") + + + (!fallBack && horizontalSync !== 0.0 ?" + uniform lowp float horizontalSync; + varying lowp float distortionScale; + varying lowp float distortionFreq;" : "") + + + " + void main() { + qt_TexCoord0 = qt_MultiTexCoord0; + vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + + + (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? + "vec4 initialNoiseTexel = texture2D(noiseSource, coords);" + : "") + + + (!fallBack && flickering !== 0.0 ? " + brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" + : "") + + + (!fallBack && horizontalSync !== 0.0 ? " + float randval = horizontalSync - initialNoiseTexel.r; + distortionScale = step(0.0, randval) * randval * horizontalSync; + distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" + : "") + + + "gl_Position = qt_Matrix * qt_Vertex; + }" + + fragmentShader: " + #ifdef GL_ES + precision mediump float; + #endif + + uniform sampler2D screenBuffer; + uniform highp float qt_Opacity; + uniform highp float time; + varying highp vec2 qt_TexCoord0; + + uniform highp vec4 fontColor; + uniform highp vec4 backgroundColor; + uniform lowp float shadowLength; + + uniform highp vec2 virtual_resolution;" + + + (burnIn !== 0 ? " + uniform sampler2D burnInSource; + uniform highp float burnInLastUpdate; + uniform highp float burnInTime;" : "") + + (staticNoise !== 0 ? " + uniform highp float staticNoise;" : "") + + (((staticNoise !== 0 || jitter !== 0 || rbgShift) + ||(fallBack && (flickering || horizontalSync))) ? " + uniform lowp sampler2D noiseSource; + uniform highp vec2 scaleNoiseSize;" : "") + + (screenCurvature !== 0 ? " + uniform highp float screenCurvature;" : "") + + (glowingLine !== 0 ? " + uniform highp float glowingLine;" : "") + + (chromaColor !== 0 ? " + uniform lowp float chromaColor;" : "") + + (jitter !== 0 ? " + uniform lowp vec2 jitterDisplacement;" : "") + + (ambientLight !== 0 ? " + uniform lowp float ambientLight;" : "") + + + (fallBack && horizontalSync !== 0 ? " + uniform lowp float horizontalSync;" : "") + + (fallBack && flickering !== 0.0 ?" + uniform lowp float flickering;" : "") + + (!fallBack && flickering !== 0 ? " + varying lowp float brightness;" + : "") + + (!fallBack && horizontalSync !== 0 ? " + varying lowp float distortionScale; + varying lowp float distortionFreq;" : "") + + + (glowingLine !== 0 ? " + float randomPass(vec2 coords){ + return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); + }" : "") + + + "float min2(vec2 v) { + return min(v.x, v.y); + } + + float rgb2grey(vec3 v){ + return dot(v, vec3(0.21, 0.72, 0.04)); + } + + float isInScreen(vec2 v) { + return min2(step(0.0, v) - step(1.0, v)); + } + + vec2 barrel(vec2 v, vec2 cc) {" + + + (screenCurvature !== 0 ? " + float distortion = dot(cc, cc) * screenCurvature; + return (v - cc * (1.0 + distortion) * distortion);" + : + "return v;") + + "}" + + + "vec3 convertWithChroma(vec3 inColor) { + vec3 outColor = inColor;" + + + (chromaColor !== 0 ? + "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);" + : + "outColor = fontColor.rgb * rgb2grey(inColor);") + + + " return outColor; + }" + + + "void main() {" + + "vec2 cc = vec2(0.5) - qt_TexCoord0;" + + "float distance = length(cc);" + + + //FallBack if there are problems + (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? + "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); + vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" + : "") + + (fallBack && flickering !== 0.0 ? " + float brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" + : "") + + (fallBack && horizontalSync !== 0.0 ? " + float randval = horizontalSync - initialNoiseTexel.r; + float distortionScale = step(0.0, randval) * randval * horizontalSync; + float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" + : "") + + + (staticNoise ? " + float noise = staticNoise;" : "") + + + (screenCurvature !== 0 ? " + vec2 curvatureCoords = barrel(qt_TexCoord0, cc); + float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords)); + vec2 staticCoords = curvatureCoords;" + :" + vec2 staticCoords = qt_TexCoord0; + float staticInScreen = 1.0;") + + + "vec2 coords = qt_TexCoord0;" + + + (horizontalSync !== 0 ? " + float dst = sin((coords.y + time * 0.001) * distortionFreq); + coords.x += dst * distortionScale;" + + + (staticNoise ? " + noise += distortionScale * 7.0;" : "") + + : "") + + + (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? + "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" + : "") + + + (jitter !== 0 ? " + vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); + vec2 txt_coords = coords + offset * jitterDisplacement;" + : "vec2 txt_coords = coords;") + + + "float color = 0.0001;" + + + (staticNoise !== 0 ? " + float noiseVal = noiseTexel.a; + color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + + + (glowingLine !== 0 ? " + color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + + + "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); + float inScreen2 = isInScreen(barrel(txt_coords, cc)); + vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; + vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" + + + (burnIn !== 0 ? " + vec4 txt_blur = texture2D(burnInSource, staticCoords); + float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); + vec3 burnInColor = 0.5 * (txt_blur.rgb - vec3(blurDecay)); + txt_color = max(txt_color, convertWithChroma(burnInColor));" + : "") + + + "txt_color += fontColor.rgb * vec3(color);" + + + "vec3 finalColor = txt_color;" + + + (flickering !== 0 ? " + finalColor *= brightness;" : "") + + + (ambientLight !== 0 ? " + finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + + + + "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords)); + finalColor = mix(finalColor, vec3(0.0), 0.45 * inShadow * inShadow); + + finalColor = mix(origTxtColor, finalColor, staticInScreen); + gl_FragColor = vec4(finalColor, qt_Opacity);" + + "}" + + onStatusChanged: { + // Print warning messages + if (log) + console.log(log); + + // Activate fallback mode + if (status == ShaderEffect.Error) { + fallBack = true; + } + } } ShaderEffect { - id: frame + id: staticShader width: parent.width * appSettings.windowScaling height: parent.height * appSettings.windowScaling @@ -346,23 +336,24 @@ ShaderEffect { property color fontColor: parent.fontColor property color backgroundColor: parent.backgroundColor - property real bloom: parent.bloom + property real bloom: appSettings.bloom * 2.5 - property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize + property real screenCurvature: parent.screenCurvature property real chromaColor: appSettings.chromaColor; - property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling + property real rbgShift: (appSettings.rbgShift / width) * appSettings.totalFontScaling // TODO FILIPPO width here is wrong. property int rasterization: appSettings.rasterization property real screen_brightness: Utils.lint(0.5, 1.5, appSettings.brightness) - property real ambientLight: appSettings.ambientLight * 0.2 + property real ambientLight: parent.ambientLight property size virtual_resolution: parent.virtual_resolution blending: false + visible: false //Print the number with a reasonable precision for the shader. function str(num){ @@ -479,24 +470,31 @@ ShaderEffect { finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);" : "") + + "finalColor *= screen_brightness;" + + (screenCurvature !== 0 ? " vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" :"") + - "gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + + "gl_FragColor = vec4(finalColor, qt_Opacity);" + "}" NewTerminalFrame { anchors.fill: parent blending: true } + + onStatusChanged: { + // Print warning messages + if (log) console.log(log); + } } ShaderEffectSource { id: frameBuffer visible: false - sourceItem: frame + sourceItem: staticShader hideSource: true } } diff --git a/app/qml/TerminalContainer.qml b/app/qml/TerminalContainer.qml index 00696d2..ea390ab 100644 --- a/app/qml/TerminalContainer.qml +++ b/app/qml/TerminalContainer.qml @@ -10,8 +10,6 @@ ShaderTerminal { id: mainShader opacity: appSettings.windowOpacity * 0.3 + 0.7 - blending: false - source: terminal.mainSource burnInEffect: terminal.burnInEffect virtual_resolution: terminal.virtualResolution