1
0
mirror of https://github.com/Swordfish90/cool-retro-term.git synced 2025-01-18 20:20:45 +00:00

Merge pull request #487 from Swordfish90/framebuffer

Separate dynamic effects (the one based on time) from static ones. This caches a lot of computations and reduce resource consumption.
This commit is contained in:
Filippo Scognamiglio 2018-12-03 22:18:43 +01:00 committed by GitHub
commit 633e4e642c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 528 additions and 420 deletions

View File

@ -48,7 +48,7 @@ QtObject{
property bool showTerminalSize: true property bool showTerminalSize: true
property real windowScaling: 1.0 property real windowScaling: 1.0
property real fps: 24 property real fps: 20
property bool verbose: false property bool verbose: false
property real bloomQuality: 0.5 property real bloomQuality: 0.5
@ -73,7 +73,7 @@ QtObject{
property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3)) property color backgroundColor: Utils.mix(Utils.strToColor(_backgroundColor), Utils.strToColor(saturatedColor), 0.7 + (contrast * 0.3))
property real staticNoise: 0.12 property real staticNoise: 0.12
property real screenCurvature: 0.2 property real screenCurvature: 0.3
property real glowingLine: 0.2 property real glowingLine: 0.2
property real burnIn: 0.25 property real burnIn: 0.25
property real bloom: 0.55 property real bloom: 0.55
@ -155,7 +155,7 @@ QtObject{
if (index === undefined) return; if (index === undefined) return;
fontManager.item.selectedFontIndex = index; fontManager.item.selectedFontIndex = index;
fontManager.item.scaling = totalFontScaling * windowScaling; fontManager.item.scaling = totalFontScaling;
var fontSource = fontManager.item.source; var fontSource = fontManager.item.source;
var pixelSize = fontManager.item.pixelSize; var pixelSize = fontManager.item.pixelSize;
@ -384,7 +384,7 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.2483, "saturationColor": 0.2483,
"screenCurvature": 0.1997, "screenCurvature": 0.3,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -411,7 +411,7 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.0, "saturationColor": 0.0,
"screenCurvature": 0.1997, "screenCurvature": 0.3,
"staticNoise": 0.1198, "staticNoise": 0.1198,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -438,7 +438,7 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.5, "saturationColor": 0.5,
"screenCurvature": 0.2, "screenCurvature": 0.3,
"staticNoise": 0.15, "staticNoise": 0.15,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -466,7 +466,7 @@ QtObject{
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0, "screenCurvature": 0,
"staticNoise": 0.1545, "staticNoise": 0.15,
"windowOpacity": 1 "windowOpacity": 1
}' }'
builtin: true builtin: true
@ -492,7 +492,7 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.8976, "screenCurvature": 0.5,
"staticNoise": 0.099, "staticNoise": 0.099,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -519,7 +519,7 @@ QtObject{
"rasterization": 1, "rasterization": 1,
"rbgShift": 0.2969, "rbgShift": 0.2969,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.3003, "screenCurvature": 0.5,
"staticNoise": 0.2969, "staticNoise": 0.2969,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -546,7 +546,7 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0.3524, "rbgShift": 0.3524,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.401, "screenCurvature": 0.4,
"staticNoise": 0.0503, "staticNoise": 0.0503,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -573,7 +573,7 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0, "saturationColor": 0,
"screenCurvature": 0.1997, "screenCurvature": 0.2,
"staticNoise": 0, "staticNoise": 0,
"windowOpacity": 1 "windowOpacity": 1
}' }'
@ -600,7 +600,7 @@ QtObject{
"rasterization": 0, "rasterization": 0,
"rbgShift": 0, "rbgShift": 0,
"saturationColor": 0.4983, "saturationColor": 0.4983,
"screenCurvature": 0.05, "screenCurvature": 0,
"staticNoise": 0.0955, "staticNoise": 0.0955,
"windowOpacity": 0.7 "windowOpacity": 0.7
}' }'

View File

@ -13,8 +13,6 @@ ShaderEffect {
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight)
visible: screenCurvature != 0
fragmentShader: " fragmentShader: "
#ifdef GL_ES #ifdef GL_ES
precision mediump float; precision mediump float;
@ -53,7 +51,6 @@ ShaderEffect {
float alpha = 0.0; float alpha = 0.0;
float outShadowLength = shadowLength; float outShadowLength = shadowLength;
float inShadowLength = 0.5 * shadowLength;
float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords)); float outShadow = max2(1.0 - smoothstep(vec2(-outShadowLength), vec2(0.0), coords) + smoothstep(vec2(1.0), vec2(1.0 + outShadowLength), coords));
outShadow = clamp(0.0, 1.0, outShadow); outShadow = clamp(0.0, 1.0, outShadow);
@ -61,10 +58,6 @@ ShaderEffect {
alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords)); alpha = sum2(1.0 - step(0.0, coords) + step(1.0, coords));
alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow)); alpha = clamp(alpha, 0.0, 1.0) * mix(1.0, 0.9, sqrt(outShadow));
float inShadow = min2(step(vec2(0.0), coords) - step(vec2(1.0), coords));
inShadow -= min2(smoothstep(0.0, inShadowLength, coords) - smoothstep(1.0 - inShadowLength, 1.0, coords));
alpha += 0.35 * inShadow;
gl_FragColor = vec4(color * alpha, alpha); gl_FragColor = vec4(color * alpha, alpha);
} }
" "

View File

@ -23,62 +23,92 @@ import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
Tab{ Tab{
GroupBox{ ColumnLayout{
title: qsTr("Effects")
anchors.fill: parent anchors.fill: parent
ColumnLayout{ spacing: 2
anchors.fill: parent
spacing: 2 GroupBox{
CheckableSlider{ title: qsTr("Effects")
name: qsTr("Bloom") Layout.fillWidth: true
onNewValue: appSettings.bloom = newValue
value: appSettings.bloom ColumnLayout {
anchors.fill: parent
CheckableSlider{
name: qsTr("Bloom")
onNewValue: appSettings.bloom = newValue
value: appSettings.bloom
}
CheckableSlider{
name: qsTr("BurnIn")
onNewValue: appSettings.burnIn = newValue
value: appSettings.burnIn
}
CheckableSlider{
name: qsTr("Static Noise")
onNewValue: appSettings.staticNoise = newValue
value: appSettings.staticNoise
}
CheckableSlider{
name: qsTr("Jitter")
onNewValue: appSettings.jitter = newValue
value: appSettings.jitter
}
CheckableSlider{
name: qsTr("Glow Line")
onNewValue: appSettings.glowingLine = newValue;
value: appSettings.glowingLine
}
CheckableSlider{
name: qsTr("Screen Curvature")
onNewValue: appSettings.screenCurvature = newValue;
value: appSettings.screenCurvature;
}
CheckableSlider{
name: qsTr("Ambient Light")
onNewValue: appSettings.ambientLight = newValue;
value: appSettings.ambientLight
enabled: appSettings.framesIndex !== 0
}
CheckableSlider{
name: qsTr("Flickering")
onNewValue: appSettings.flickering = newValue;
value: appSettings.flickering;
}
CheckableSlider{
name: qsTr("Horizontal Sync")
onNewValue: appSettings.horizontalSync = newValue;
value: appSettings.horizontalSync;
}
CheckableSlider{
name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue;
value: appSettings.rbgShift;
}
} }
CheckableSlider{ }
name: qsTr("BurnIn")
onNewValue: appSettings.burnIn = newValue GroupBox{
value: appSettings.burnIn title: qsTr("Lights")
} Layout.fillWidth: true
CheckableSlider{ GridLayout{
name: qsTr("Static Noise") anchors.fill: parent
onNewValue: appSettings.staticNoise = newValue columns: 2
value: appSettings.staticNoise Label{ text: qsTr("Brightness") }
} SimpleSlider{
CheckableSlider{ onValueChanged: appSettings.brightness = value
name: qsTr("Jitter") value: appSettings.brightness
onNewValue: appSettings.jitter = newValue }
value: appSettings.jitter Label{ text: qsTr("Contrast") }
} SimpleSlider{
CheckableSlider{ onValueChanged: appSettings.contrast = value
name: qsTr("Glow Line") value: appSettings.contrast
onNewValue: appSettings.glowingLine = newValue; }
value: appSettings.glowingLine Label{ text: qsTr("Opacity") }
} SimpleSlider{
CheckableSlider{ onValueChanged: appSettings.windowOpacity = value
name: qsTr("Screen Curvature") value: appSettings.windowOpacity
onNewValue: appSettings.screenCurvature = newValue; }
value: appSettings.screenCurvature;
}
CheckableSlider{
name: qsTr("Ambient Light")
onNewValue: appSettings.ambientLight = newValue;
value: appSettings.ambientLight
enabled: appSettings.framesIndex !== 0
}
CheckableSlider{
name: qsTr("Flickering")
onNewValue: appSettings.flickering = newValue;
value: appSettings.flickering;
}
CheckableSlider{
name: qsTr("Horizontal Sync")
onNewValue: appSettings.horizontalSync = newValue;
value: appSettings.horizontalSync;
}
CheckableSlider{
name: qsTr("RGB Shift")
onNewValue: appSettings.rbgShift = newValue;
value: appSettings.rbgShift;
} }
} }
} }

View File

@ -1,67 +0,0 @@
/*******************************************************************************
* Copyright (c) 2013 "Filippo Scognamiglio"
* https://github.com/Swordfish90/cool-retro-term
*
* This file is part of cool-retro-term.
*
* cool-retro-term is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.1
Tab{
ColumnLayout{
anchors.fill: parent
GroupBox{
title: qsTr("Rasterization Mode")
Layout.fillWidth: true
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
anchors.fill: parent
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
}
GroupBox{
title: qsTr("Lights")
Layout.fillWidth: true
GridLayout{
anchors.fill: parent
columns: 2
Label{ text: qsTr("Brightness") }
SimpleSlider{
onValueChanged: appSettings.brightness = value
value: appSettings.brightness
}
Label{ text: qsTr("Contrast") }
SimpleSlider{
onValueChanged: appSettings.contrast = value
value: appSettings.contrast
}
Label{ text: qsTr("Opacity") }
SimpleSlider{
onValueChanged: appSettings.windowOpacity = value
value: appSettings.windowOpacity
}
}
}
}
}

View File

@ -27,13 +27,26 @@ import "Components"
Tab{ Tab{
ColumnLayout{ ColumnLayout{
anchors.fill: parent anchors.fill: parent
GroupBox{ GroupBox{
property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization] title: qsTr("Font")
title: qsTr("Font " + "(" + rasterization + ")")
Layout.fillWidth: true Layout.fillWidth: true
GridLayout{ GridLayout{
anchors.fill: parent anchors.fill: parent
columns: 2 columns: 2
Label { text: qsTr("Rasterization") }
ComboBox {
id: rasterizationBox
property string selectedElement: model[currentIndex]
Layout.fillWidth: true
model: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")]
currentIndex: appSettings.rasterization
onCurrentIndexChanged: {
appSettings.rasterization = currentIndex
}
}
Label{ text: qsTr("Name") } Label{ text: qsTr("Name") }
ComboBox{ ComboBox{
id: fontChanger id: fontChanger

View File

@ -28,7 +28,7 @@ Window {
id: settings_window id: settings_window
title: qsTr("Settings") title: qsTr("Settings")
width: 580 width: 580
height: 400 height: 500
property int tabmargins: 15 property int tabmargins: 15
@ -42,12 +42,6 @@ Window {
anchors.fill: parent anchors.fill: parent
anchors.margins: tabmargins anchors.margins: tabmargins
} }
SettingsScreenTab{
id: screenTab
title: qsTr("Screen")
anchors.fill: parent
anchors.margins: tabmargins
}
SettingsTerminalTab{ SettingsTerminalTab{
id: terminalTab id: terminalTab
title: qsTr("Terminal") title: qsTr("Terminal")

View File

@ -23,330 +23,483 @@ import QtGraphicalEffects 1.0
import "utils.js" as Utils import "utils.js" as Utils
ShaderEffect { Item {
property ShaderEffectSource source property ShaderEffectSource source
property BurnInEffect burnInEffect property BurnInEffect burnInEffect
property ShaderEffectSource bloomSource property ShaderEffectSource bloomSource
property color fontColor: appSettings.fontColor property color fontColor: appSettings.fontColor
property color backgroundColor: appSettings.backgroundColor 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 screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
property real glowingLine: appSettings.glowingLine * 0.2
property real chromaColor: appSettings.chromaColor; 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 ambientLight: appSettings.ambientLight * 0.2 property real ambientLight: appSettings.ambientLight * 0.2
property size virtual_resolution property size virtual_resolution
property real time: timeManager.time ShaderEffect {
property ShaderEffectSource noiseSource: noiseShaderSource id: dynamicShader
// If something goes wrong activate the fallback version of the shader. property ShaderEffectSource screenBuffer: frameBuffer
property bool fallBack: false 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. property real flickering: appSettings.flickering
Image{ property real horizontalSync: appSettings.horizontalSync * 0.5
id: noiseTexture property real glowingLine: appSettings.glowingLine * 0.2
source: "images/allNoise512.png" property real burnIn: appSettings.burnIn
width: 512 property real burnInLastUpdate: burnInEffect.lastUpdate
height: 512 property real burnInTime: burnInEffect.burnInFadeTime
fillMode: Image.Tile property real jitter: appSettings.jitter
visible: false property size jitterDisplacement: Qt.size(0.007 * jitter, 0.002 * jitter)
} property real shadowLength: 0.25 * screenCurvature * Utils.lint(0.50, 1.5, ambientLight)
ShaderEffectSource{ property real staticNoise: appSettings.staticNoise
id: noiseShaderSource property size scaleNoiseSize: Qt.size((width) / (noiseTexture.width * appSettings.windowScaling * appSettings.totalFontScaling),
sourceItem: noiseTexture (height) / (noiseTexture.height * appSettings.windowScaling * appSettings.totalFontScaling))
wrapMode: ShaderEffectSource.Repeat
visible: false
smooth: true
}
//Print the number with a reasonable precision for the shader. property size virtual_resolution: parent.virtual_resolution
function str(num){
return num.toFixed(8);
}
vertexShader: " property real time: timeManager.time
uniform highp mat4 qt_Matrix; property ShaderEffectSource noiseSource: noiseShaderSource
uniform highp float time;
attribute highp vec4 qt_Vertex; // If something goes wrong activate the fallback version of the shader.
attribute highp vec2 qt_MultiTexCoord0; property bool fallBack: false
varying highp vec2 qt_TexCoord0;" + anchors.fill: parent
blending: false
(!fallBack ? " //Smooth random texture used for flickering effect.
uniform sampler2D noiseSource;" : "") + 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
}
(!fallBack && rbgShift !== 0.0 ?" //Print the number with a reasonable precision for the shader.
varying lowp vec4 constantNoise;" : "") + function str(num){
return num.toFixed(8);
}
(!fallBack && flickering !== 0.0 ?" vertexShader: "
varying lowp float brightness; uniform highp mat4 qt_Matrix;
uniform lowp float flickering;" : "") + uniform highp float time;
(!fallBack && horizontalSync !== 0.0 ?" attribute highp vec4 qt_Vertex;
uniform lowp float horizontalSync; attribute highp vec2 qt_MultiTexCoord0;
varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
" varying highp vec2 qt_TexCoord0;" +
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) ? (!fallBack ? "
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);" uniform sampler2D noiseSource;" : "") +
: "") +
(!fallBack && rbgShift !== 0.0 ?" (!fallBack && flickering !== 0.0 ?"
constantNoise = initialNoiseTexel;" : "") + varying lowp float brightness;
uniform lowp float flickering;" : "") +
(!fallBack && flickering !== 0.0 ? " (!fallBack && horizontalSync !== 0.0 ?"
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" uniform lowp float horizontalSync;
: "") + varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") +
(!fallBack && horizontalSync !== 0.0 ? " "
float randval = horizontalSync - initialNoiseTexel.r; void main() {
distortionScale = step(0.0, randval) * randval * horizontalSync; qt_TexCoord0 = qt_MultiTexCoord0;
distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" +
: "") +
"gl_Position = qt_Matrix * qt_Vertex; (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
}" "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
: "") +
fragmentShader: " (!fallBack && flickering !== 0.0 ? "
#ifdef GL_ES brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
precision mediump float; : "") +
#endif
uniform sampler2D source; (!fallBack && horizontalSync !== 0.0 ? "
uniform highp float qt_Opacity; float randval = horizontalSync - initialNoiseTexel.r;
uniform highp float time; distortionScale = step(0.0, randval) * randval * horizontalSync;
varying highp vec2 qt_TexCoord0; distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") +
uniform highp vec4 fontColor; "gl_Position = qt_Matrix * qt_Vertex;
uniform highp vec4 backgroundColor; }"
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" + fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
(bloom !== 0 ? " uniform sampler2D screenBuffer;
uniform highp sampler2D bloomSource; uniform highp float qt_Opacity;
uniform lowp float bloom;" : "") + uniform highp float time;
(burnIn !== 0 ? " varying highp vec2 qt_TexCoord0;
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;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
(fallBack && horizontalSync !== 0 ? " uniform highp vec4 fontColor;
uniform lowp float horizontalSync;" : "") + uniform highp vec4 backgroundColor;
(fallBack && flickering !== 0.0 ?" uniform lowp float shadowLength;
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 ?" uniform highp vec2 virtual_resolution;" +
varying lowp vec4 constantNoise;" : "") +
(glowingLine !== 0 ? " (burnIn !== 0 ? "
float randomPass(vec2 coords){ uniform sampler2D burnInSource;
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); uniform highp float burnInLastUpdate;
}" : "") + uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0)
||(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;" : "") +
"highp float getScanlineIntensity(vec2 coords) { (fallBack && horizontalSync !== 0 ? "
float result = 1.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;" : "") +
(appSettings.rasterization != appSettings.no_rasterization ? (glowingLine !== 0 ? "
"float val = 0.0; float randomPass(vec2 coords){
vec2 rasterizationCoords = fract(coords * virtual_resolution); return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
val += smoothstep(0.0, 0.5, rasterizationCoords.y); }" : "") +
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
result *= mix(0.5, 1.0, val);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
"val = 0.0;
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
result *= mix(0.5, 1.0, val);" : "") + "
return result; "float min2(vec2 v) {
} return min(v.x, v.y);
}
float min2(vec2 v) { float rgb2grey(vec3 v){
return min(v.x, v.y); return dot(v, vec3(0.21, 0.72, 0.04));
} }
float rgb2grey(vec3 v){ float isInScreen(vec2 v) {
return dot(v, vec3(0.21, 0.72, 0.04)); return min2(step(0.0, v) - step(1.0, v));
}" + }
"void main() {" + vec2 barrel(vec2 v, vec2 cc) {" +
"vec2 cc = vec2(0.5) - qt_TexCoord0;" +
"float distance = length(cc);" +
//FallBack if there are problems (screenCurvature !== 0 ? "
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? float distortion = dot(cc, cc) * screenCurvature;
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); return (v - cc * (1.0 + distortion) * distortion);"
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" :
: "") + "return v;") +
(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 ? " "vec3 convertWithChroma(vec3 inColor) {
float noise = staticNoise;" : "") + vec3 outColor = inColor;" +
(screenCurvature !== 0 ? " (chromaColor !== 0 ?
float distortion = dot(cc, cc) * screenCurvature; "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);"
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion); :
vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;" "outColor = fontColor.rgb * rgb2grey(inColor);") +
:"
vec2 staticCoords = qt_TexCoord0;") +
"vec2 coords = staticCoords;" + " return outColor;
}" +
(horizontalSync !== 0 ? " "void main() {" +
float dst = sin((coords.y + time * 0.001) * distortionFreq); "vec2 cc = vec2(0.5) - qt_TexCoord0;" +
coords.x += dst * distortionScale;" + "float distance = length(cc);" +
(staticNoise ? "
noise += distortionScale * 7.0;" : "")
: "") +
(jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? //FallBack if there are problems
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" (fallBack && (flickering !== 0.0 || horizontalSync !== 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);"
: "") +
(jitter !== 0 ? " (staticNoise ? "
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); float noise = staticNoise;" : "") +
vec2 txt_coords = coords + offset * jitterDisplacement;"
: "vec2 txt_coords = coords;") +
"float color = 0.0001;" + (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;") +
(staticNoise !== 0 ? " "vec2 coords = qt_TexCoord0;" +
float noiseVal = noiseTexel.a;
color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
(glowingLine !== 0 ? " (horizontalSync !== 0 ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + float dst = sin((coords.y + time * 0.001) * distortionFreq);
coords.x += dst * distortionScale;" +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" + (staticNoise ? "
noise += distortionScale * 7.0;" : "")
(rbgShift !== 0 ? " : "") +
vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4);
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
(burnIn !== 0 ? " (jitter !== 0 || staticNoise !== 0 ?
vec4 txt_blur = texture2D(burnInSource, staticCoords); "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); : "") +
txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));"
: "") +
"txt_color *= getScanlineIntensity(coords);" + (jitter !== 0 ? "
vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5);
vec2 txt_coords = coords + offset * jitterDisplacement;"
: "vec2 txt_coords = coords;") +
"txt_color += vec3(color);" + "float color = 0.0001;" +
"float greyscale_color = rgb2grey(txt_color);" +
(chromaColor !== 0 ? (staticNoise !== 0 ? "
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor); float noiseVal = noiseTexel.a;
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);" color += noiseVal * noise * (1.0 - distance * 1.3);" : "") +
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
(bloom !== 0 ? (glowingLine !== 0 ? "
"vec4 bloomFullColor = texture2D(bloomSource, coords); color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
vec3 bloomColor = bloomFullColor.rgb;
float bloomAlpha = bloomFullColor.a;" +
(chromaColor !== 0 ?
"bloomColor = fontColor.rgb * mix(vec3(rgb2grey(bloomColor)), bloomColor, chromaColor);"
:
"bloomColor = fontColor.rgb * rgb2grey(bloomColor);") +
"finalColor += clamp(bloomColor * bloom * bloomAlpha, 0.0, 0.5);"
: "") +
(screenCurvature !== 0 ? " "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); float inScreen2 = isInScreen(barrel(txt_coords, cc));
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
:"") + vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
(flickering !== 0 ? " (burnIn !== 0 ? "
finalColor *= brightness;" : "") + vec4 txt_blur = texture2D(burnInSource, staticCoords);
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") +
(ambientLight !== 0 ? " "txt_color += fontColor.rgb * vec3(color);" +
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
"vec3 finalColor = txt_color;" +
(flickering !== 0 ? "
finalColor *= brightness;" : "") +
(ambientLight !== 0 ? "
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") +
"gl_FragColor = vec4(finalColor * screen_brightness, qt_Opacity);" + "float inShadow = 1.0 - min2(smoothstep(0.0, shadowLength, staticCoords) - smoothstep(1.0 - shadowLength, 1.0, staticCoords));
"}" inShadow = pow(inShadow, 100.0) + 0.35 * inShadow * inShadow; // Inner shadow and antialiasing when screen background is bright.
finalColor = mix(finalColor, vec3(0.0), inShadow);
onStatusChanged: { finalColor = mix(origTxtColor, finalColor, staticInScreen);
// Print warning messages gl_FragColor = vec4(finalColor, qt_Opacity);" +
if (log) "}"
console.log(log);
// Activate fallback mode onStatusChanged: {
if (status == ShaderEffect.Error) { // Print warning messages
fallBack = true; if (log)
console.log(log);
// Activate fallback mode
if (status == ShaderEffect.Error) {
fallBack = true;
}
}
}
ShaderEffect {
id: staticShader
width: parent.width * appSettings.windowScaling
height: parent.height * appSettings.windowScaling
property ShaderEffectSource source: parent.source
property ShaderEffectSource bloomSource: parent.bloomSource
property color fontColor: parent.fontColor
property color backgroundColor: parent.backgroundColor
property real bloom: appSettings.bloom * 2.5
property real screenCurvature: parent.screenCurvature
property real chromaColor: appSettings.chromaColor;
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: 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){
return num.toFixed(8);
}
fragmentShader: "
#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D source;
uniform highp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness;
uniform highp vec2 virtual_resolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
uniform lowp float bloom;" : "") +
(screenCurvature !== 0 ? "
uniform highp float screenCurvature;" : "") +
(chromaColor !== 0 ? "
uniform lowp float chromaColor;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") +
"highp float getScanlineIntensity(vec2 coords) {
float result = 1.0;" +
(appSettings.rasterization != appSettings.no_rasterization ?
"float val = 0.0;
vec2 rasterizationCoords = fract(coords * virtual_resolution);
val += smoothstep(0.0, 0.5, rasterizationCoords.y);
val -= smoothstep(0.5, 1.0, rasterizationCoords.y);
result *= mix(0.5, 1.0, val);" : "") +
(appSettings.rasterization == appSettings.pixel_rasterization ?
"val = 0.0;
val += smoothstep(0.0, 0.5, rasterizationCoords.x);
val -= smoothstep(0.5, 1.0, rasterizationCoords.x);
result *= mix(0.5, 1.0, val);" : "") + "
return result;
}
float min2(vec2 v) {
return min(v.x, v.y);
}
float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04));
}" +
"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;" +
(screenCurvature !== 0 ? "
float distortion = dot(cc, cc) * screenCurvature;
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion);
vec2 txt_coords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;"
:"
vec2 txt_coords = qt_TexCoord0;") +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" +
(rbgShift !== 0 ? "
vec2 displacement = vec2(12.0, 0.0) * rbgShift;
vec3 rightColor = texture2D(source, txt_coords + displacement).rgb;
vec3 leftColor = texture2D(source, txt_coords - displacement).rgb;
txt_color.r = leftColor.r * 0.10 + rightColor.r * 0.30 + txt_color.r * 0.60;
txt_color.g = leftColor.g * 0.20 + rightColor.g * 0.20 + txt_color.g * 0.60;
txt_color.b = leftColor.b * 0.30 + rightColor.b * 0.10 + txt_color.b * 0.60;
" : "") +
"txt_color *= getScanlineIntensity(txt_coords);" +
"txt_color += vec3(0.0001);" +
"float greyscale_color = rgb2grey(txt_color);" +
(chromaColor !== 0 ?
"vec3 foregroundColor = mix(fontColor.rgb, txt_color * fontColor.rgb / greyscale_color, chromaColor);
vec3 finalColor = mix(backgroundColor.rgb, foregroundColor, greyscale_color);"
:
"vec3 finalColor = mix(backgroundColor.rgb, fontColor.rgb, greyscale_color);") +
(bloom !== 0 ?
"vec4 bloomFullColor = texture2D(bloomSource, txt_coords);
vec3 bloomColor = bloomFullColor.rgb;
float bloomAlpha = bloomFullColor.a;
bloomColor = convertWithChroma(bloomColor);
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, qt_Opacity);" +
"}"
Loader {
anchors.fill: parent
active: screenCurvature !== 0
sourceComponent: NewTerminalFrame {
blending: true
}
}
onStatusChanged: {
// Print warning messages
if (log) console.log(log);
} }
} }
ShaderEffectSource {
id: frameBuffer
visible: false
sourceItem: staticShader
hideSource: true
}
} }

View File

@ -10,8 +10,6 @@ ShaderTerminal {
id: mainShader id: mainShader
opacity: appSettings.windowOpacity * 0.3 + 0.7 opacity: appSettings.windowOpacity * 0.3 + 0.7
blending: false
source: terminal.mainSource source: terminal.mainSource
burnInEffect: terminal.burnInEffect burnInEffect: terminal.burnInEffect
virtual_resolution: terminal.virtualResolution virtual_resolution: terminal.virtualResolution
@ -36,7 +34,7 @@ ShaderTerminal {
height: parent.height * appSettings.bloomQuality height: parent.height * appSettings.bloomQuality
sourceComponent: FastBlur{ sourceComponent: FastBlur{
radius: Utils.lint(16, 64, appSettings.bloomQuality * appSettings.windowScaling); radius: Utils.lint(16, 64, appSettings.bloomQuality);
source: terminal.mainSource source: terminal.mainSource
transparentBorder: true transparentBorder: true
} }
@ -56,11 +54,11 @@ ShaderTerminal {
bloomSource: bloomSourceLoader.item bloomSource: bloomSourceLoader.item
NewTerminalFrame { // NewTerminalFrame {
id: terminalFrame // id: terminalFrame
anchors.fill: parent // anchors.fill: parent
blending: true // blending: true
} // }
// This shader might be useful in the future. Since we used it only for a couple // This shader might be useful in the future. Since we used it only for a couple
// of calculations is probably best to move those in the main shader. If in the future // of calculations is probably best to move those in the main shader. If in the future

View File

@ -137,13 +137,8 @@ ApplicationWindow{
TerminalContainer{ TerminalContainer{
id: terminalContainer id: terminalContainer
y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar.
width: parent.width * appSettings.windowScaling width: parent.width
height: (parent.height + Math.abs(y)) * appSettings.windowScaling height: (parent.height + Math.abs(y))
transform: Scale {
xScale: 1 / appSettings.windowScaling
yScale: 1 / appSettings.windowScaling
}
} }
SettingsWindow{ SettingsWindow{
id: settingswindow id: settingswindow

View File

@ -32,7 +32,6 @@
<file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file> <file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file>
<file>fonts/modern-hermit/Hermit-medium.otf</file> <file>fonts/modern-hermit/Hermit-medium.otf</file>
<file>fonts/modern-inconsolata/Inconsolata.otf</file> <file>fonts/modern-inconsolata/Inconsolata.otf</file>
<file>SettingsScreenTab.qml</file>
<file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file> <file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file>
<file>../icons/32x32/cool-retro-term.png</file> <file>../icons/32x32/cool-retro-term.png</file>
<file>Components/SizedLabel.qml</file> <file>Components/SizedLabel.qml</file>