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,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>

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.