diff --git a/app/ShaderManager.qml b/app/ShaderManager.qml index 351affa..2c3a413 100644 --- a/app/ShaderManager.qml +++ b/app/ShaderManager.qml @@ -24,19 +24,13 @@ import QtGraphicalEffects 1.0 ShaderEffect { property color font_color: shadersettings.font_color property color background_color: shadersettings.background_color - property variant source: theSource - property variant bloomSource: bloomSource + property variant source: terminal.theSource + property variant bloomSource: terminal.bloomSource + property variant scanlineSource: terminal.scanlineSource property size txt_Size: Qt.size(frame.sourceRect.width, frame.sourceRect.height) property real bloom: shadersettings.bloom_strength property int rasterization: shadersettings.rasterization - property real _verticalResDensity: shadersettings.font.virtualResolution.height + shadersettings.font.lineSpacing - property real _horizontalResDensity: shadersettings.font.virtualResolution.width - property real _lines: frame.sourceRect.height / terminal.paintedFontSize.height - property real _columns: frame.sourceRect.width / terminal.paintedFontSize.width - property size virtual_resolution: Qt.size(_columns * _horizontalResDensity, _lines * _verticalResDensity) - property real scanlineHeight: frame.sourceRect.height / virtual_resolution.height - property real scanlineWidth: frame.sourceRect.width / virtual_resolution.width property real noise_strength: shadersettings.noise_strength property real screen_distorsion: shadersettings.screen_distortion @@ -54,9 +48,6 @@ ShaderEffect { property real brightness: shadersettings.brightness * 1.5 + 0.5 - property real deltay: scanlineHeight / (frame.sourceRect.height) - property real deltax: scanlineWidth / (frame.sourceRect.width) - property real time: timetimer.time property variant randomFunctionSource: randfuncsource @@ -64,23 +55,6 @@ ShaderEffect { return num.toFixed(8); } - //Blurred texture used for bloom - Loader{ - anchors.fill: parent - active: bloom !== 0 - FastBlur{ - radius: 32 - anchors.fill: parent - source: theSource - transparentBorder: true - ShaderEffectSource{ - id: bloomSource - sourceItem: parent - hideSource: true - } - } - } - vertexShader: " uniform highp mat4 qt_Matrix; uniform highp float time; @@ -122,9 +96,10 @@ ShaderEffect { varying highp vec2 qt_TexCoord0; uniform highp vec4 font_color; - uniform highp vec4 background_color; + uniform highp vec4 background_color;" + - uniform highp vec2 virtual_resolution;" + + (rasterization != shadersettings.no_rasterization ? " + uniform highp sampler2D scanlineSource;" : "") + (bloom !== 0 ? " uniform highp sampler2D bloomSource;" : "") + @@ -139,14 +114,6 @@ ShaderEffect { (horizontal_sincronization !== 0 ? " varying lowp float horizontal_distortion;" : "") + - (rasterization !== shadersettings.no_rasterization ? " - float getScanlineIntensity(vec2 coord){ - float result = abs(sin(coord.y * virtual_resolution.y * "+str(Math.PI)+" ));" + - (rasterization === shadersettings.pixel_rasterization ? " - result *= abs(sin(coord.x * virtual_resolution.x * "+str(Math.PI)+"));" : "") + - "return result; - }" : "") + - " highp float rand(vec2 co) { @@ -159,7 +126,7 @@ ShaderEffect { } float stepNoise(vec2 p){ - vec2 newP = p * virtual_resolution; + vec2 newP = p * txt_Size * 0.5; return rand(floor(newP) + fract(time / 100.0)); }" + @@ -194,23 +161,13 @@ ShaderEffect { noise += horizontal_distortion;" : "") : "") + - (rasterization !== shadersettings.no_rasterization ? " - vec2 txt_coords = coords; - txt_coords.y = floor(coords.y * virtual_resolution.y) / virtual_resolution.y;" + - (rasterization === shadersettings.pixel_rasterization ? - "txt_coords.x = floor(coords.x * virtual_resolution.x) / virtual_resolution.x;" : "") - : " vec2 txt_coords = coords;") + - - "float color = texture2D(source, txt_coords + vec2("+str(deltax * 0.5)+", "+str(deltay * 0.5)+")).r;" + + "float color = texture2D(source, coords).r;" + (noise_strength !== 0 ? " color += stepNoise(coords) * noise * (1.0 - distance * distance * 2.0);" : "") + - (rasterization !== shadersettings.no_rasterization ? " - color = color * getScanlineIntensity(coords);" : "") + - (glowing_line_strength !== 0 ? " - color += randomPass(txt_coords) * glowing_line_strength;" : "") + + color += randomPass(coords) * glowing_line_strength;" : "") + (bloom !== 0 ? " color += texture2D(bloomSource, coords).r *" + str(2.5 * bloom) + ";" : "") + @@ -218,6 +175,9 @@ ShaderEffect { "vec3 finalColor = mix(background_color, font_color, color).rgb;" + "finalColor = mix(finalColor * 1.1, vec3(0.0), 1.2 * distance * distance);" + + (rasterization != shadersettings.no_rasterization ? " + finalColor *= texture2D(scanlineSource, coords).r;" : "") + + (brightness_flickering !== 0 ? " finalColor *= brightness;" : "") + diff --git a/app/ShaderSettings.qml b/app/ShaderSettings.qml index 8944231..258799a 100644 --- a/app/ShaderSettings.qml +++ b/app/ShaderSettings.qml @@ -94,7 +94,7 @@ Item{ var f = fontlist.get(font_index); var metrics = f.metrics.get(font_scaling_index); currentfont.source = f.source; - currentfont.pixelSize = metrics.px; + currentfont.pixelSize = metrics.pixelSize; currentfont.lineSpacing = f.lineSpacing; currentfont.virtualResolution = Qt.size(metrics.virtualWidth, metrics.virtualHeight); @@ -121,94 +121,94 @@ Item{ id: fontlist ListElement{ text: "Terminus (Modern)" - source: "fonts/modern-terminus/TerminusTTF-4.38.2.ttf" - lineSpacing: 1 + source: "fonts/modern-terminus/TerminusTTF-Bold-4.38.2.ttf" + lineSpacing: 2 metrics: [ - ListElement{px: 18; virtualWidth: 3; virtualHeight: 6}, - ListElement{px: 27; virtualWidth: 5; virtualHeight: 8}, - ListElement{px: 36; virtualWidth: 6; virtualHeight: 11}, - ListElement{px: 44; virtualWidth: 7; virtualHeight: 11}, - ListElement{px: 54; virtualWidth: 7; virtualHeight: 11}, - ListElement{px: 62; virtualWidth: 8; virtualHeight: 13}, - ListElement{px: 71; virtualWidth: 7; virtualHeight: 13}] + ListElement{pixelSize: 18; virtualWidth: 0; virtualHeight: 6}, + ListElement{pixelSize: 24; virtualWidth: 0; virtualHeight: 8}, + ListElement{pixelSize: 35; virtualWidth: 5; virtualHeight: 12}, + ListElement{pixelSize: 47; virtualWidth: 6; virtualHeight: 11}, + ListElement{pixelSize: 54; virtualWidth: 7; virtualHeight: 11}, + ListElement{pixelSize: 64; virtualWidth: 8; virtualHeight: 11}, + ListElement{pixelSize: 75; virtualWidth: 8; virtualHeight: 11}] } ListElement{ text: "Commodore PET (1977)" source: "fonts/1977-commodore-pet/COMMODORE_PET.ttf" lineSpacing: 2 metrics: [ - ListElement{px: 16; virtualWidth: 8; virtualHeight: 6}, - ListElement{px: 20; virtualWidth: 7; virtualHeight: 6}, - ListElement{px: 27; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 34; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 40; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 44; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 50; virtualWidth: 8; virtualHeight: 8}] + ListElement{pixelSize: 11; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 17; virtualWidth: 0; virtualHeight: 6}, + ListElement{pixelSize: 24; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 32; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 40; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 48; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 56; virtualWidth: 8; virtualHeight: 8}] } ListElement{ text: "Apple ][ (1977)" source: "fonts/1977-apple2/PrintChar21.ttf" lineSpacing: 2 metrics: [ - ListElement{px: 15; virtualWidth: 6; virtualHeight: 5}, - ListElement{px: 21; virtualWidth: 6; virtualHeight: 7}, - ListElement{px: 27; virtualWidth: 7; virtualHeight: 8}, - ListElement{px: 34; virtualWidth: 7; virtualHeight: 8}, - ListElement{px: 40; virtualWidth: 7; virtualHeight: 8}, - ListElement{px: 47; virtualWidth: 7; virtualHeight: 8}, - ListElement{px: 54; virtualWidth: 7; virtualHeight: 8}] + ListElement{pixelSize: 11; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 17; virtualWidth: 0; virtualHeight: 6}, + ListElement{pixelSize: 24; virtualWidth: 7; virtualHeight: 8}, + ListElement{pixelSize: 32; virtualWidth: 7; virtualHeight: 8}, + ListElement{pixelSize: 40; virtualWidth: 7; virtualHeight: 8}, + ListElement{pixelSize: 48; virtualWidth: 7; virtualHeight: 8}, + ListElement{pixelSize: 56; virtualWidth: 7; virtualHeight: 8}] } ListElement{ text: "Atari 400-800 (1979)" source: "fonts/1979-atari-400-800/ATARI400800_original.TTF" lineSpacing: 3 metrics: [ - ListElement{px: 16; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 20; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 25; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 31; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 38; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 47; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 54; virtualWidth: 8; virtualHeight: 8}] + ListElement{pixelSize: 11; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 17; virtualWidth: 0; virtualHeight: 6}, + ListElement{pixelSize: 24; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 32; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 40; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 48; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 56; virtualWidth: 8; virtualHeight: 8}] } ListElement{ text: "Commodore 64 (1982)" source: "fonts/1982-commodore64/C64_User_Mono_v1.0-STYLE.ttf" lineSpacing: 3 metrics: [ - ListElement{px: 16; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 20; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 25; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 31; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 38; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 47; virtualWidth: 8; virtualHeight: 8}, - ListElement{px: 54; virtualWidth: 8; virtualHeight: 8}] + ListElement{pixelSize: 11; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 17; virtualWidth: 0; virtualHeight: 6}, + ListElement{pixelSize: 24; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 32; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 40; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 48; virtualWidth: 8; virtualHeight: 8}, + ListElement{pixelSize: 56; virtualWidth: 8; virtualHeight: 8}] } ListElement{ text: "Atari ST (1985)" source: "fonts/1985-atari-st/AtariST8x16SystemFont.ttf" - lineSpacing: 4 + lineSpacing: 2 metrics: [ - ListElement{px: 16; virtualWidth: 3; virtualHeight: 5}, - ListElement{px: 23; virtualWidth: 4; virtualHeight: 7}, - ListElement{px: 30; virtualWidth: 4; virtualHeight: 10}, - ListElement{px: 38; virtualWidth: 6; virtualHeight: 10}, - ListElement{px: 44; virtualWidth: 7; virtualHeight: 14}, - ListElement{px: 53; virtualWidth: 7; virtualHeight: 14}, - ListElement{px: 58; virtualWidth: 7; virtualHeight: 14}] + ListElement{pixelSize: 16; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 23; virtualWidth: 0; virtualHeight: 7}, + ListElement{pixelSize: 32; virtualWidth: 4; virtualHeight: 8}, + ListElement{pixelSize: 40; virtualWidth: 4; virtualHeight: 8}, + ListElement{pixelSize: 48; virtualWidth: 4; virtualHeight: 8}, + ListElement{pixelSize: 56; virtualWidth: 4; virtualHeight: 8}, + ListElement{pixelSize: 64; virtualWidth: 8; virtualHeight: 16}] } ListElement{ text: "IBM DOS (1985)" source: "fonts/1985-ibm-pc-vga/Perfect DOS VGA 437.ttf" lineSpacing: 2 metrics: [ - ListElement{px: 18; virtualWidth: 5; virtualHeight: 7}, - ListElement{px: 25; virtualWidth: 5; virtualHeight: 9}, - ListElement{px: 36; virtualWidth: 6; virtualHeight: 12}, - ListElement{px: 45; virtualWidth: 7; virtualHeight: 15}, - ListElement{px: 54; virtualWidth: 8; virtualHeight: 15}, - ListElement{px: 62; virtualWidth: 8; virtualHeight: 15}, - ListElement{px: 74; virtualWidth: 9; virtualHeight: 16}] + ListElement{pixelSize: 18; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 25; virtualWidth: 0; virtualHeight: 0}, + ListElement{pixelSize: 32; virtualWidth: 6; virtualHeight: 8}, + ListElement{pixelSize: 36; virtualWidth: 6; virtualHeight: 12}, + ListElement{pixelSize: 48; virtualWidth: 9; virtualHeight: 16}, + ListElement{pixelSize: 56; virtualWidth: 9; virtualHeight: 16}, + ListElement{pixelSize: 64; virtualWidth: 9; virtualHeight: 16}] } } diff --git a/app/Terminal.qml b/app/Terminal.qml index 750504b..9f844ff 100644 --- a/app/Terminal.qml +++ b/app/Terminal.qml @@ -26,6 +26,10 @@ import org.kde.konsole 0.1 Item{ id: terminalContainer + property variant theSource: finalSource + property variant bloomSource: bloomSourceLoader.item + property variant scanlineSource: scanlineSourceLoader.item + //The blur effect has to take into account the framerate property real fpsAttenuation: 60 / shadersettings.fps property real mBlur: shadersettings.motion_blur @@ -33,14 +37,23 @@ Item{ property real _minBlurCoefficient: 0.75 property real _maxBlurCoefficient: 0.95 + property real scanlineWidth: 1 + property real scanlineHeight: 1 + property size virtual_resolution: Qt.size(width / scanlineWidth, height / scanlineHeight) + property real deltay: 0.5 / virtual_resolution.height + property real deltax: 0.5 / virtual_resolution.width + property real mBloom: shadersettings.bloom_strength + property int mScanlines: shadersettings.rasterization + onMScanlinesChanged: restartBlurredSource() property size terminalSize - property size _paintedFontSize - property size paintedFontSize: _paintedFontSize ? _paintedFontSize : 0 + property size paintedTextSize + + onPaintedTextSizeChanged: console.log(paintedTextSize) //Force reload of the blursource when settings change - onMBloomChanged: restartBlurredSource() + onMBlurChanged: restartBlurredSource() function restartBlurredSource(){ if(!blurredSource) return; @@ -73,7 +86,6 @@ Item{ colorScheme: "MyWhiteOnBlack" onTerminalSizeChanged: terminalContainer.terminalSize = ktermitem.terminalSize - onPaintedFontSizeChanged: terminalContainer._paintedFontSize = ktermitem.paintedFontSize session: KSession { id: ksession @@ -94,11 +106,25 @@ Item{ fontMetrics.font = font; - var scanline_spacing = shadersettings.font.lineSpacing; - var scanline_height = fontMetrics.paintedHeight / shadersettings.font.virtualResolution.height; + var vertical_density = shadersettings.font.virtualResolution.height; + var horizontal_density = shadersettings.font.virtualResolution.width; + var scanline_height = fontMetrics.paintedHeight / vertical_density; + var scanline_width = fontMetrics.paintedWidth / horizontal_density; + + console.log("Font height: " + fontMetrics.paintedHeight) + + var scanline_spacing = shadersettings.font.lineSpacing; var line_spacing = Math.round(scanline_spacing * scanline_height); + + console.log("Scanline Height: " + scanline_height) + console.log("Line Spacing: " + line_spacing) + + terminalContainer.scanlineHeight = scanline_height; + terminalContainer.scanlineWidth = scanline_width; + setLineSpacing(line_spacing); + restartBlurredSource(); } onUpdatedImage: {blurredSource.live = true;livetimer.restart();} @@ -117,7 +143,6 @@ Item{ MenuItem{action: fullscreenAction} } MouseArea{ - acceptedButtons: Qt.LeftButton | Qt.MiddleButton | Qt.RightButton anchors.fill: parent onWheel: @@ -166,48 +191,60 @@ Item{ id: source sourceItem: kterminal hideSource: true + smooth: false } - Loader{ - anchors.fill: parent - active: mBlur !== 0 - ShaderEffectSource{ - id: blurredSource - sourceItem: blurredterminal - recursive: true - live: true + ShaderEffectSource{ + id: blurredSource + sourceItem: blurredterminal + recursive: true + live: true - smooth: false - antialiasing: false + smooth: false + antialiasing: false - Timer{ - id: livetimer - running: true - onTriggered: parent.live = false; - } + Timer{ + id: livetimer + running: true + onTriggered: parent.live = false; } } + ShaderEffectSource{ + id: finalSource + sourceItem: blurredterminal + sourceRect: frame.sourceRect + } ShaderEffect { id: blurredterminal anchors.fill: parent property variant source: source property variant blurredSource: (mBlur !== 0) ? blurredSource : undefined - property size txt_size: Qt.size(width, height) - + property size virtual_resolution: parent.virtual_resolution + property size delta: Qt.size((mScanlines == shadersettings.pixel_rasterization ? deltax : 0), + mScanlines != shadersettings.no_rasterization ? deltay : 0) z: 2 fragmentShader: "uniform lowp float qt_Opacity;" + "uniform lowp sampler2D source;" + - "uniform lowp vec2 txt_size;" + + "uniform highp vec2 delta;" + - "varying highp vec2 qt_TexCoord0;" + + "varying highp vec2 qt_TexCoord0; + + uniform highp vec2 virtual_resolution;" + (mBlur !== 0 ? "uniform lowp sampler2D blurredSource;" : "") + "void main() {" + - "float color = texture2D(source, qt_TexCoord0).r * 256.0;" + + "vec2 coords = qt_TexCoord0;" + + (mScanlines != shadersettings.no_rasterization ? " + coords.y = floor(virtual_resolution.y * coords.y) / virtual_resolution.y;" + + (mScanlines == shadersettings.pixel_rasterization ? " + coords.x = floor(virtual_resolution.x * coords.x) / virtual_resolution.x;" : "") + : "") + + + "float color = texture2D(source, coords + delta).r * 256.0;" + (mBlur !== 0 ? "float blurredSourceColor = texture2D(blurredSource, qt_TexCoord0).r * 256.0;" + "blurredSourceColor = blurredSourceColor - blurredSourceColor * " + (1.0 - motionBlurCoefficient) * fpsAttenuation+ ";" + @@ -218,4 +255,65 @@ Item{ "gl_FragColor = vec4(vec3(floor(color) / 256.0), 1.0);" + "}" } + ////////////////////////////////////////////////////////////////////// + //EFFECTS + ////////////////////////////////////////////////////////////////////// + //Bloom + Loader{ + id: bloomEffectLoader + active: mBloom != 0 + anchors.fill: parent + sourceComponent: FastBlur{ + radius: 32 + source: kterminal + transparentBorder: true + smooth: false + } + } + Loader{ + id: bloomSourceLoader + active: mBloom != 0 + sourceComponent: ShaderEffectSource{ + sourceItem: bloomEffectLoader.item + hideSource: true + sourceRect: frame.sourceRect + smooth: false + } + } + //Scanlines + Loader{ + id: scanlineEffectLoader + active: mScanlines != shadersettings.no_rasterization + anchors.fill: parent + sourceComponent: ShaderEffect { + property size virtual_resolution: terminalContainer.virtual_resolution + + fragmentShader: + "uniform lowp float qt_Opacity;" + + + "varying highp vec2 qt_TexCoord0; + uniform highp vec2 virtual_resolution; + + float getScanlineIntensity(vec2 coords) { + float result = abs(sin(coords.y * virtual_resolution.y * "+Math.PI+"));" + + (mScanlines == shadersettings.pixel_rasterization ? + "result *= abs(sin(coords.x * virtual_resolution.x * "+Math.PI+"));" : "") + " + return result; + }" + + + "void main() {" + + "gl_FragColor = vec4(getScanlineIntensity(qt_TexCoord0));" + + "}" + } + } + Loader{ + id: scanlineSourceLoader + active: mScanlines != shadersettings.no_rasterization + sourceComponent: ShaderEffectSource{ + sourceItem: scanlineEffectLoader.item + sourceRect: frame.sourceRect + hideSource: true + smooth: true + } + } } diff --git a/app/app.qmlproject.user b/app/app.qmlproject.user index 17be06b..e686147 100644 --- a/app/app.qmlproject.user +++ b/app/app.qmlproject.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget diff --git a/app/frames/BlackRoughFrame.qml b/app/frames/BlackRoughFrame.qml index 74dd56f..7bc688a 100644 --- a/app/frames/BlackRoughFrame.qml +++ b/app/frames/BlackRoughFrame.qml @@ -14,8 +14,8 @@ TerminalFrame{ imageSource: "../images/black-frame.png" normalsSource: "../images/black-frame-normals.png" - rectX: 15 - rectY: 15 + rectX: 20 + rectY: 20 distortionCoefficient: 1.9 diff --git a/app/main.qml b/app/main.qml index bc5965f..9f019ed 100644 --- a/app/main.qml +++ b/app/main.qml @@ -133,16 +133,8 @@ ApplicationWindow{ } Terminal{ id: terminal - anchors.centerIn: parent - property int frameOffsetX: frame.item.addedWidth - frame.item.borderLeft - frame.item.borderRight - property int frameOffsetY: frame.item.addedHeight - frame.item.borderTop - frame.item.borderBottom - width: parent.width + frameOffsetX * shadersettings.window_scaling - height: parent.height + frameOffsetY * shadersettings.window_scaling - } - ShaderEffectSource{ - id: theSource - sourceItem: terminal - sourceRect: frame.sourceRect + anchors.fill: parent + anchors.margins: 30 } ShaderManager{ id: shadercontainer