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:
commit
633e4e642c
@ -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
|
||||||
}'
|
}'
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
||||||
|
@ -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")
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user