12 Commits

Author SHA1 Message Date
Filippo Scognamiglio
77dc82a381 Unload frame when not needed. 2018-12-03 19:28:50 +01:00
Filippo Scognamiglio
44a63d4aaa Change default curvature values. 2018-12-03 17:12:41 +01:00
Filippo Scognamiglio
5b3297f916 Tweak some shader constants. 2018-12-03 16:55:44 +01:00
Filippo Scognamiglio
41413d4712 Rearrange settings window. 2018-12-03 16:39:20 +01:00
Filippo Scognamiglio
fd2e5ce71e Reduce default fps to 20. It looks good with new burnin and saves some gpu. 2018-12-03 16:06:48 +01:00
Filippo Scognamiglio
e9ddd7d3b8 Split effects into static (cached) and dynamic computed at every frame. 2018-12-03 14:58:34 +01:00
Filippo Scognamiglio
da6795f002 Use window scaling parameter for framebuffer size. 2018-12-03 12:43:40 +01:00
Filippo Scognamiglio
f497bb4b44 First wrong framebuffer implementation. 2018-12-02 19:57:24 +01:00
Filippo Scognamiglio
4aea85649f Merge branch 'master' of https://github.com/Swordfish90/cool-retro-term 2018-12-01 19:56:13 +01:00
Filippo Scognamiglio
b9ffae25e3 Merge pull request #427 from suve/add-T-option-to-man-page
Add the -T option to the debian man page
2018-11-26 22:55:03 +01:00
suve
e2c4392c6d Fix alphabetically incorrect ordering of options in man page 2018-02-25 12:40:46 +01:00
suve
7e771b1cfc Add a description of the -T option to the man page 2018-02-25 12:40:42 +01:00
11 changed files with 533 additions and 422 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,12 +23,17 @@ import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
Tab{ Tab{
GroupBox{
title: qsTr("Effects")
anchors.fill: parent
ColumnLayout{ ColumnLayout{
anchors.fill: parent anchors.fill: parent
spacing: 2 spacing: 2
GroupBox{
title: qsTr("Effects")
Layout.fillWidth: true
ColumnLayout {
anchors.fill: parent
CheckableSlider{ CheckableSlider{
name: qsTr("Bloom") name: qsTr("Bloom")
onNewValue: appSettings.bloom = newValue onNewValue: appSettings.bloom = newValue
@@ -82,4 +87,29 @@ Tab{
} }
} }
} }
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

@@ -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,51 +23,56 @@ 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
ShaderEffect {
id: dynamicShader
property ShaderEffectSource screenBuffer: frameBuffer
property ShaderEffectSource burnInSource: burnInEffect.source
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
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))
property size virtual_resolution: parent.virtual_resolution
property real time: timeManager.time property real time: timeManager.time
property ShaderEffectSource noiseSource: noiseShaderSource property ShaderEffectSource noiseSource: noiseShaderSource
// If something goes wrong activate the fallback version of the shader. // If something goes wrong activate the fallback version of the shader.
property bool fallBack: false property bool fallBack: false
anchors.fill: parent
blending: false blending: false
//Smooth random texture used for flickering effect. //Smooth random texture used for flickering effect.
@@ -104,9 +109,6 @@ ShaderEffect {
(!fallBack ? " (!fallBack ? "
uniform sampler2D noiseSource;" : "") + uniform sampler2D noiseSource;" : "") +
(!fallBack && rbgShift !== 0.0 ?"
varying lowp vec4 constantNoise;" : "") +
(!fallBack && flickering !== 0.0 ?" (!fallBack && flickering !== 0.0 ?"
varying lowp float brightness; varying lowp float brightness;
uniform lowp float flickering;" : "") + uniform lowp float flickering;" : "") +
@@ -121,13 +123,10 @@ ShaderEffect {
qt_TexCoord0 = qt_MultiTexCoord0; qt_TexCoord0 = qt_MultiTexCoord0;
vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + 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 && (flickering !== 0.0 || horizontalSync !== 0.0) ?
"vec4 initialNoiseTexel = texture2D(noiseSource, coords);" "vec4 initialNoiseTexel = texture2D(noiseSource, coords);"
: "") + : "") +
(!fallBack && rbgShift !== 0.0 ?"
constantNoise = initialNoiseTexel;" : "") +
(!fallBack && flickering !== 0.0 ? " (!fallBack && flickering !== 0.0 ? "
brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;"
: "") + : "") +
@@ -146,27 +145,24 @@ ShaderEffect {
precision mediump float; precision mediump float;
#endif #endif
uniform sampler2D source; uniform sampler2D screenBuffer;
uniform highp float qt_Opacity; uniform highp float qt_Opacity;
uniform highp float time; uniform highp float time;
varying highp vec2 qt_TexCoord0; varying highp vec2 qt_TexCoord0;
uniform highp vec4 fontColor; uniform highp vec4 fontColor;
uniform highp vec4 backgroundColor; uniform highp vec4 backgroundColor;
uniform lowp float screen_brightness; uniform lowp float shadowLength;
uniform highp vec2 virtual_resolution;" + uniform highp vec2 virtual_resolution;" +
(bloom !== 0 ? "
uniform highp sampler2D bloomSource;
uniform lowp float bloom;" : "") +
(burnIn !== 0 ? " (burnIn !== 0 ? "
uniform sampler2D burnInSource; uniform sampler2D burnInSource;
uniform highp float burnInLastUpdate; uniform highp float burnInLastUpdate;
uniform highp float burnInTime;" : "") + uniform highp float burnInTime;" : "") +
(staticNoise !== 0 ? " (staticNoise !== 0 ? "
uniform highp float staticNoise;" : "") + uniform highp float staticNoise;" : "") +
(((staticNoise !== 0 || jitter !== 0 || rbgShift) (((staticNoise !== 0 || jitter !== 0)
||(fallBack && (flickering || horizontalSync))) ? " ||(fallBack && (flickering || horizontalSync))) ? "
uniform lowp sampler2D noiseSource; uniform lowp sampler2D noiseSource;
uniform highp vec2 scaleNoiseSize;" : "") + uniform highp vec2 scaleNoiseSize;" : "") +
@@ -178,8 +174,6 @@ ShaderEffect {
uniform lowp float chromaColor;" : "") + uniform lowp float chromaColor;" : "") +
(jitter !== 0 ? " (jitter !== 0 ? "
uniform lowp vec2 jitterDisplacement;" : "") + uniform lowp vec2 jitterDisplacement;" : "") +
(rbgShift !== 0 ? "
uniform lowp float rbgShift;" : "") +
(ambientLight !== 0 ? " (ambientLight !== 0 ? "
uniform lowp float ambientLight;" : "") + uniform lowp float ambientLight;" : "") +
@@ -194,38 +188,41 @@ ShaderEffect {
varying lowp float distortionScale; varying lowp float distortionScale;
varying lowp float distortionFreq;" : "") + varying lowp float distortionFreq;" : "") +
(!fallBack && rbgShift !== 0.0 ?"
varying lowp vec4 constantNoise;" : "") +
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
float randomPass(vec2 coords){ float randomPass(vec2 coords){
return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015)));
}" : "") + }" : "") +
"highp float getScanlineIntensity(vec2 coords) { "float min2(vec2 v) {
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); return min(v.x, v.y);
} }
float rgb2grey(vec3 v){ float rgb2grey(vec3 v){
return dot(v, vec3(0.21, 0.72, 0.04)); 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() {" + "void main() {" +
@@ -233,7 +230,7 @@ ShaderEffect {
"float distance = length(cc);" + "float distance = length(cc);" +
//FallBack if there are problems //FallBack if there are problems
(fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0.0) ? (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0) ?
"vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0))); "vec2 initialCoords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));
vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);" vec4 initialNoiseTexel = texture2D(noiseSource, initialCoords);"
: "") + : "") +
@@ -245,29 +242,30 @@ ShaderEffect {
float distortionScale = step(0.0, randval) * randval * horizontalSync; float distortionScale = step(0.0, randval) * randval * horizontalSync;
float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" float distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);"
: "") + : "") +
(fallBack && rbgShift !== 0.0 ?"
lowp vec4 constantNoise = initialNoiseTexel;" : "") +
(staticNoise ? " (staticNoise ? "
float noise = staticNoise;" : "") + float noise = staticNoise;" : "") +
(screenCurvature !== 0 ? " (screenCurvature !== 0 ? "
float distortion = dot(cc, cc) * screenCurvature; vec2 curvatureCoords = barrel(qt_TexCoord0, cc);
vec2 curvatureCoords = (qt_TexCoord0 - cc * (1.0 + distortion) * distortion); float staticInScreen = min2(step(0.0, curvatureCoords) - step(1.0, curvatureCoords));
vec2 staticCoords = - 2.0 * curvatureCoords + 3.0 * step(vec2(0.0), curvatureCoords) * curvatureCoords - 3.0 * step(vec2(1.0), curvatureCoords) * curvatureCoords;" vec2 staticCoords = curvatureCoords;"
:" :"
vec2 staticCoords = qt_TexCoord0;") + vec2 staticCoords = qt_TexCoord0;
float staticInScreen = 1.0;") +
"vec2 coords = staticCoords;" + "vec2 coords = qt_TexCoord0;" +
(horizontalSync !== 0 ? " (horizontalSync !== 0 ? "
float dst = sin((coords.y + time * 0.001) * distortionFreq); float dst = sin((coords.y + time * 0.001) * distortionFreq);
coords.x += dst * distortionScale;" + coords.x += dst * distortionScale;" +
(staticNoise ? " (staticNoise ? "
noise += distortionScale * 7.0;" : "") noise += distortionScale * 7.0;" : "")
: "") + : "") +
(jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? (jitter !== 0 || staticNoise !== 0 ?
"vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));"
: "") + : "") +
@@ -285,49 +283,21 @@ ShaderEffect {
(glowingLine !== 0 ? " (glowingLine !== 0 ? "
color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + color += randomPass(coords * virtual_resolution) * glowingLine;" : "") +
"vec3 txt_color = texture2D(source, txt_coords).rgb;" + "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen);
float inScreen2 = isInScreen(barrel(txt_coords, cc));
(rbgShift !== 0 ? " vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb;
vec2 displacement = vec2(12.0, 0.0) * rbgShift * (0.6 * constantNoise.r + 0.4); vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" +
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 ? " (burnIn !== 0 ? "
vec4 txt_blur = texture2D(burnInSource, staticCoords); vec4 txt_blur = texture2D(burnInSource, staticCoords);
float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0);
txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));" vec3 burnInColor = 0.65 * (txt_blur.rgb - vec3(blurDecay));
txt_color = max(txt_color, convertWithChroma(burnInColor));"
: "") + : "") +
"txt_color *= getScanlineIntensity(coords);" + "txt_color += fontColor.rgb * vec3(color);" +
"txt_color += vec3(color);" + "vec3 finalColor = txt_color;" +
"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, coords);
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 ? "
vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords);
finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);"
:"") +
(flickering !== 0 ? " (flickering !== 0 ? "
finalColor *= brightness;" : "") + finalColor *= brightness;" : "") +
@@ -336,7 +306,12 @@ ShaderEffect {
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + 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);
finalColor = mix(origTxtColor, finalColor, staticInScreen);
gl_FragColor = vec4(finalColor, qt_Opacity);" +
"}" "}"
onStatusChanged: { onStatusChanged: {
@@ -349,4 +324,182 @@ ShaderEffect {
fallBack = true; 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>

View File

@@ -30,14 +30,17 @@ Print a help screen and exit.
\fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR \fB\-p\fR \fIPROFILE\fR, \fB\-\-profile\fR \fIPROFILE\fR
Run with the given profile. Run with the given profile.
.TP .TP
\fB\-\-workdir\fR \fIDIR\fR \fB\-T\fR \fITITLE\fR
Start with \fIDIR\fR as the working directory. Use \fITITLE\fR as the window title.
.TP .TP
\fB\-\-verbose\fR \fB\-\-verbose\fR
Print additional information such as profiles and settings. Print additional information such as profiles and settings.
.TP .TP
\fB\-v\fR, \fB\-\-version\fR \fB\-v\fR, \fB\-\-version\fR
Print the version number and exit. Print the version number and exit.
.TP
\fB\-\-workdir\fR \fIDIR\fR
Start with \fIDIR\fR as the working directory.
.SH LICENCE .SH LICENCE
This program is available under the terms of the GNU General Public License, This program is available under the terms of the GNU General Public License,
version 3 or any later version, as published by the Free Software Foundation. version 3 or any later version, as published by the Free Software Foundation.