mirror of
https://github.com/Swordfish90/cool-retro-term.git
synced 2025-01-31 18:21:16 +00:00
167 lines
5.6 KiB
QML
167 lines
5.6 KiB
QML
import QtQuick 2.2
|
|
import QtGraphicalEffects 1.0
|
|
|
|
ShaderTerminal{
|
|
property alias title: terminal.title
|
|
property alias terminalSize: terminal.terminalSize
|
|
|
|
id: mainShader
|
|
opacity: appSettings.windowOpacity * 0.3 + 0.7
|
|
|
|
blending: false
|
|
|
|
Loader{
|
|
id: frame
|
|
anchors.fill: parent
|
|
z: 2.1
|
|
source: appSettings.frame_source
|
|
}
|
|
|
|
PreprocessedTerminal{
|
|
id: terminal
|
|
anchors.fill: parent
|
|
}
|
|
|
|
source: terminal.mainSource
|
|
|
|
// EFFECTS ////////////////////////////////////////////////////////////////
|
|
|
|
Loader{
|
|
property real scaling: appSettings.bloom_quality * appSettings.window_scaling
|
|
id: bloomEffectLoader
|
|
active: appSettings.bloom_strength
|
|
asynchronous: true
|
|
width: parent.width * scaling
|
|
height: parent.height * scaling
|
|
sourceComponent: FastBlur{
|
|
radius: 48 * scaling
|
|
source: terminal.mainTerminal
|
|
transparentBorder: true
|
|
}
|
|
}
|
|
Loader{
|
|
id: bloomSourceLoader
|
|
active: appSettings.bloom_strength !== 0
|
|
asynchronous: true
|
|
sourceComponent: ShaderEffectSource{
|
|
id: _bloomEffectSource
|
|
sourceItem: bloomEffectLoader.item
|
|
hideSource: true
|
|
smooth: true
|
|
visible: false
|
|
}
|
|
}
|
|
|
|
bloomSource: bloomSourceLoader.item
|
|
|
|
ShaderEffect {
|
|
id: staticNoiseEffect
|
|
anchors.fill: parent
|
|
property real element_size: appSettings.rasterization == appSettings.no_rasterization ? 2 : 1
|
|
property alias __terminalHeight: terminal.virtualResolution.height
|
|
property alias __terminalWidth: terminal.virtualResolution.width
|
|
property size virtual_resolution: Qt.size(__terminalWidth / element_size, __terminalHeight / element_size)
|
|
|
|
blending: false
|
|
|
|
fragmentShader:
|
|
"uniform lowp float qt_Opacity;
|
|
varying highp vec2 qt_TexCoord0;
|
|
uniform highp vec2 virtual_resolution;" +
|
|
|
|
"highp float noise(vec2 co)
|
|
{
|
|
highp float a = 12.9898;
|
|
highp float b = 78.233;
|
|
highp float c = 43758.5453;
|
|
highp float dt= dot(co.xy ,vec2(a,b));
|
|
highp float sn= mod(dt,3.14);
|
|
return fract(sin(sn) * c);
|
|
}
|
|
|
|
vec2 sw(vec2 p) {return vec2( floor(p.x) , floor(p.y) );}
|
|
vec2 se(vec2 p) {return vec2( ceil(p.x) , floor(p.y) );}
|
|
vec2 nw(vec2 p) {return vec2( floor(p.x) , ceil(p.y) );}
|
|
vec2 ne(vec2 p) {return vec2( ceil(p.x) , ceil(p.y) );}
|
|
|
|
float smoothNoise(vec2 p) {
|
|
vec2 inter = smoothstep(0., 1., fract(p));
|
|
float s = mix(noise(sw(p)), noise(se(p)), inter.x);
|
|
float n = mix(noise(nw(p)), noise(ne(p)), inter.x);
|
|
return mix(s, n, inter.y);
|
|
}" +
|
|
|
|
"void main() {" +
|
|
"gl_FragColor.a = smoothNoise(qt_TexCoord0 * virtual_resolution);" +
|
|
"}"
|
|
|
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
}
|
|
noiseSource: ShaderEffectSource{
|
|
id: staticNoiseSource
|
|
sourceItem: staticNoiseEffect
|
|
textureSize: Qt.size(mainShader.width, mainShader.height)
|
|
wrapMode: ShaderEffectSource.Repeat
|
|
smooth: true
|
|
hideSource: true
|
|
visible: false
|
|
}
|
|
|
|
ShaderEffect {
|
|
id: rasterizationEffect
|
|
width: parent.width
|
|
height: parent.height
|
|
property real outColor: 0.0
|
|
property real dispX: (5 / width) * appSettings.window_scaling
|
|
property real dispY: 5 / height * appSettings.window_scaling
|
|
property size virtual_resolution: terminal.virtualResolution
|
|
|
|
blending: false
|
|
|
|
fragmentShader:
|
|
"uniform lowp float qt_Opacity;" +
|
|
|
|
"varying highp vec2 qt_TexCoord0;
|
|
uniform highp vec2 virtual_resolution;
|
|
uniform highp float dispX;
|
|
uniform highp float dispY;
|
|
uniform mediump float outColor;
|
|
|
|
highp float getScanlineIntensity(vec2 coords) {
|
|
highp float result = 1.0;" +
|
|
|
|
(appSettings.rasterization != appSettings.no_rasterization ?
|
|
"result *= abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" : "") +
|
|
(appSettings.rasterization == appSettings.pixel_rasterization ?
|
|
"result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + "
|
|
|
|
return result;
|
|
}" +
|
|
|
|
"void main() {" +
|
|
"highp float color = getScanlineIntensity(qt_TexCoord0);" +
|
|
|
|
"float distance = length(vec2(0.5) - qt_TexCoord0);" +
|
|
"color = mix(color, 0.0, 1.2 * distance * distance);" +
|
|
|
|
"color *= outColor + smoothstep(0.00, dispX, qt_TexCoord0.x) * (1.0 - outColor);" +
|
|
"color *= outColor + smoothstep(0.00, dispY, qt_TexCoord0.y) * (1.0 - outColor);" +
|
|
"color *= outColor + (1.0 - smoothstep(1.00 - dispX, 1.00, qt_TexCoord0.x)) * (1.0 - outColor);" +
|
|
"color *= outColor + (1.0 - smoothstep(1.00 - dispY, 1.00, qt_TexCoord0.y)) * (1.0 - outColor);" +
|
|
|
|
"gl_FragColor.a = color;" +
|
|
"}"
|
|
|
|
onStatusChanged: if (log) console.log(log) //Print warning messages
|
|
}
|
|
|
|
rasterizationSource: ShaderEffectSource{
|
|
id: rasterizationEffectSource
|
|
sourceItem: rasterizationEffect
|
|
hideSource: true
|
|
smooth: true
|
|
wrapMode: ShaderEffectSource.ClampToEdge
|
|
visible: false
|
|
}
|
|
}
|