mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-10-31 07:04:20 +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:
		| @@ -48,7 +48,7 @@ QtObject{ | ||||
|     property bool showTerminalSize: true | ||||
|     property real windowScaling: 1.0 | ||||
|  | ||||
|     property real fps: 24 | ||||
|     property real fps: 20 | ||||
|     property bool verbose: false | ||||
|  | ||||
|     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 real staticNoise: 0.12 | ||||
|     property real screenCurvature: 0.2 | ||||
|     property real screenCurvature: 0.3 | ||||
|     property real glowingLine: 0.2 | ||||
|     property real burnIn: 0.25 | ||||
|     property real bloom: 0.55 | ||||
| @@ -155,7 +155,7 @@ QtObject{ | ||||
|         if (index === undefined) return; | ||||
|  | ||||
|         fontManager.item.selectedFontIndex = index; | ||||
|         fontManager.item.scaling = totalFontScaling * windowScaling; | ||||
|         fontManager.item.scaling = totalFontScaling; | ||||
|  | ||||
|         var fontSource = fontManager.item.source; | ||||
|         var pixelSize = fontManager.item.pixelSize; | ||||
| @@ -384,7 +384,7 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.2483, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -411,7 +411,7 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.0, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.1198, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -438,7 +438,7 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.5, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "screenCurvature": 0.3, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -466,7 +466,7 @@ QtObject{ | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.1545, | ||||
|                   "staticNoise": 0.15, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
|             builtin: true | ||||
| @@ -492,7 +492,7 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.8976, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.099, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -519,7 +519,7 @@ QtObject{ | ||||
|                   "rasterization": 1, | ||||
|                   "rbgShift": 0.2969, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.3003, | ||||
|                   "screenCurvature": 0.5, | ||||
|                   "staticNoise": 0.2969, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -546,7 +546,7 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0.3524, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.401, | ||||
|                   "screenCurvature": 0.4, | ||||
|                   "staticNoise": 0.0503, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -573,7 +573,7 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0, | ||||
|                   "screenCurvature": 0.1997, | ||||
|                   "screenCurvature": 0.2, | ||||
|                   "staticNoise": 0, | ||||
|                   "windowOpacity": 1 | ||||
|                 }' | ||||
| @@ -600,7 +600,7 @@ QtObject{ | ||||
|                   "rasterization": 0, | ||||
|                   "rbgShift": 0, | ||||
|                   "saturationColor": 0.4983, | ||||
|                   "screenCurvature": 0.05, | ||||
|                   "screenCurvature": 0, | ||||
|                   "staticNoise": 0.0955, | ||||
|                   "windowOpacity": 0.7 | ||||
|                 }' | ||||
|   | ||||
| @@ -13,8 +13,6 @@ ShaderEffect { | ||||
|     property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize | ||||
|     property real shadowLength: 0.5 * screenCurvature * Utils.lint(0.50, 1.5, _ambientLight) | ||||
|  | ||||
|     visible: screenCurvature != 0 | ||||
|  | ||||
|     fragmentShader: " | ||||
|         #ifdef GL_ES | ||||
|             precision mediump float; | ||||
| @@ -53,7 +51,6 @@ ShaderEffect { | ||||
|             float alpha = 0.0; | ||||
|  | ||||
|             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)); | ||||
|             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 = 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); | ||||
|         } | ||||
|     " | ||||
|   | ||||
| @@ -23,62 +23,92 @@ import QtQuick.Controls 1.1 | ||||
| import QtQuick.Layouts 1.1 | ||||
|  | ||||
| Tab{ | ||||
|     GroupBox{ | ||||
|         title: qsTr("Effects") | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|         ColumnLayout{ | ||||
|             anchors.fill: parent | ||||
|             spacing: 2 | ||||
|             CheckableSlider{ | ||||
|                 name: qsTr("Bloom") | ||||
|                 onNewValue: appSettings.bloom = newValue | ||||
|                 value: appSettings.bloom | ||||
|         spacing: 2 | ||||
|  | ||||
|         GroupBox{ | ||||
|             title: qsTr("Effects") | ||||
|             Layout.fillWidth: true | ||||
|  | ||||
|             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 | ||||
|                 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; | ||||
|         } | ||||
|  | ||||
|         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 | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -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{ | ||||
|     ColumnLayout{ | ||||
|         anchors.fill: parent | ||||
|  | ||||
|         GroupBox{ | ||||
|             property var rasterization: [qsTr("Default"), qsTr("Scanlines"), qsTr("Pixels")][appSettings.rasterization] | ||||
|             title: qsTr("Font " + "(" + rasterization + ")") | ||||
|             title: qsTr("Font") | ||||
|             Layout.fillWidth: true | ||||
|             GridLayout{ | ||||
|                 anchors.fill: parent | ||||
|                 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") } | ||||
|                 ComboBox{ | ||||
|                     id: fontChanger | ||||
|   | ||||
| @@ -28,7 +28,7 @@ Window { | ||||
|     id: settings_window | ||||
|     title: qsTr("Settings") | ||||
|     width: 580 | ||||
|     height: 400 | ||||
|     height: 500 | ||||
|  | ||||
|     property int tabmargins: 15 | ||||
|  | ||||
| @@ -42,12 +42,6 @@ Window { | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsScreenTab{ | ||||
|             id: screenTab | ||||
|             title: qsTr("Screen") | ||||
|             anchors.fill: parent | ||||
|             anchors.margins: tabmargins | ||||
|         } | ||||
|         SettingsTerminalTab{ | ||||
|             id: terminalTab | ||||
|             title: qsTr("Terminal") | ||||
|   | ||||
| @@ -23,330 +23,483 @@ import QtGraphicalEffects 1.0 | ||||
|  | ||||
| import "utils.js" as Utils | ||||
|  | ||||
| ShaderEffect { | ||||
| Item { | ||||
|     property ShaderEffectSource source | ||||
|     property BurnInEffect burnInEffect | ||||
|     property ShaderEffectSource bloomSource | ||||
|  | ||||
|     property color fontColor: appSettings.fontColor | ||||
|     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 glowingLine: appSettings.glowingLine * 0.2 | ||||
|  | ||||
|     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 chromaColor: appSettings.chromaColor | ||||
|  | ||||
|     property real ambientLight: appSettings.ambientLight * 0.2 | ||||
|  | ||||
|     property size virtual_resolution | ||||
|  | ||||
|     property real time: timeManager.time | ||||
|     property ShaderEffectSource noiseSource: noiseShaderSource | ||||
|      ShaderEffect { | ||||
|          id: dynamicShader | ||||
|  | ||||
|     // If something goes wrong activate the fallback version of the shader. | ||||
|     property bool fallBack: false | ||||
|          property ShaderEffectSource screenBuffer: frameBuffer | ||||
|          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. | ||||
|     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 | ||||
|     } | ||||
|          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)) | ||||
|  | ||||
|     //Print the number with a reasonable precision for the shader. | ||||
|     function str(num){ | ||||
|         return num.toFixed(8); | ||||
|     } | ||||
|          property size virtual_resolution: parent.virtual_resolution | ||||
|  | ||||
|     vertexShader: " | ||||
|         uniform highp mat4 qt_Matrix; | ||||
|         uniform highp float time; | ||||
|          property real time: timeManager.time | ||||
|          property ShaderEffectSource noiseSource: noiseShaderSource | ||||
|  | ||||
|         attribute highp vec4 qt_Vertex; | ||||
|         attribute highp vec2 qt_MultiTexCoord0; | ||||
|          // If something goes wrong activate the fallback version of the shader. | ||||
|          property bool fallBack: false | ||||
|  | ||||
|         varying highp vec2 qt_TexCoord0;" + | ||||
|          anchors.fill: parent | ||||
|          blending: false | ||||
|  | ||||
|         (!fallBack ? " | ||||
|             uniform sampler2D noiseSource;" : "") + | ||||
|          //Smooth random texture used for flickering effect. | ||||
|          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 ?" | ||||
|             varying lowp vec4 constantNoise;" : "") + | ||||
|          //Print the number with a reasonable precision for the shader. | ||||
|          function str(num){ | ||||
|              return num.toFixed(8); | ||||
|          } | ||||
|  | ||||
|         (!fallBack && flickering !== 0.0 ?" | ||||
|             varying lowp float brightness; | ||||
|             uniform lowp float flickering;" : "") + | ||||
|          vertexShader: " | ||||
|              uniform highp mat4 qt_Matrix; | ||||
|              uniform highp float time; | ||||
|  | ||||
|         (!fallBack && horizontalSync !== 0.0 ?" | ||||
|             uniform lowp float horizontalSync; | ||||
|             varying lowp float distortionScale; | ||||
|             varying lowp float distortionFreq;" : "") + | ||||
|              attribute highp vec4 qt_Vertex; | ||||
|              attribute highp vec2 qt_MultiTexCoord0; | ||||
|  | ||||
|         " | ||||
|         void main() { | ||||
|             qt_TexCoord0 = qt_MultiTexCoord0; | ||||
|             vec2 coords = vec2(fract(time/(1024.0*2.0)), fract(time/(1024.0*1024.0)));" + | ||||
|              varying highp vec2 qt_TexCoord0;" + | ||||
|  | ||||
|             (!fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 0) ? | ||||
|                 "vec4 initialNoiseTexel = texture2D(noiseSource, coords);" | ||||
|             : "") + | ||||
|              (!fallBack ? " | ||||
|                  uniform sampler2D noiseSource;" : "") + | ||||
|  | ||||
|             (!fallBack && rbgShift !== 0.0 ?" | ||||
|                 constantNoise = initialNoiseTexel;" : "") + | ||||
|              (!fallBack && flickering !== 0.0 ?" | ||||
|                  varying lowp float brightness; | ||||
|                  uniform lowp float flickering;" : "") + | ||||
|  | ||||
|             (!fallBack && flickering !== 0.0 ? " | ||||
|                 brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||
|             : "") + | ||||
|              (!fallBack && horizontalSync !== 0.0 ?" | ||||
|                  uniform lowp float horizontalSync; | ||||
|                  varying lowp float distortionScale; | ||||
|                  varying lowp float distortionFreq;" : "") + | ||||
|  | ||||
|             (!fallBack && horizontalSync !== 0.0 ? " | ||||
|                 float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                 distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                 distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|             : "") + | ||||
|              " | ||||
|              void main() { | ||||
|                  qt_TexCoord0 = qt_MultiTexCoord0; | ||||
|                  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: " | ||||
|         #ifdef GL_ES | ||||
|             precision mediump float; | ||||
|         #endif | ||||
|                  (!fallBack && flickering !== 0.0 ? " | ||||
|                      brightness = 1.0 + (initialNoiseTexel.g - 0.5) * flickering;" | ||||
|                  : "") + | ||||
|  | ||||
|         uniform sampler2D source; | ||||
|         uniform highp float qt_Opacity; | ||||
|         uniform highp float time; | ||||
|         varying highp vec2 qt_TexCoord0; | ||||
|                  (!fallBack && horizontalSync !== 0.0 ? " | ||||
|                      float randval = horizontalSync - initialNoiseTexel.r; | ||||
|                      distortionScale = step(0.0, randval) * randval * horizontalSync; | ||||
|                      distortionFreq = mix(4.0, 40.0, initialNoiseTexel.g);" | ||||
|                  : "") + | ||||
|  | ||||
|         uniform highp vec4 fontColor; | ||||
|         uniform highp vec4 backgroundColor; | ||||
|         uniform lowp float screen_brightness; | ||||
|                  "gl_Position = qt_Matrix * qt_Vertex; | ||||
|              }" | ||||
|  | ||||
|         uniform highp vec2 virtual_resolution;" + | ||||
|          fragmentShader: " | ||||
|              #ifdef GL_ES | ||||
|                  precision mediump float; | ||||
|              #endif | ||||
|  | ||||
|         (bloom !== 0 ? " | ||||
|             uniform highp sampler2D bloomSource; | ||||
|             uniform lowp float bloom;" : "") + | ||||
|         (burnIn !== 0 ? " | ||||
|             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;" : "") + | ||||
|              uniform sampler2D screenBuffer; | ||||
|              uniform highp float qt_Opacity; | ||||
|              uniform highp float time; | ||||
|              varying highp vec2 qt_TexCoord0; | ||||
|  | ||||
|         (fallBack && horizontalSync !== 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;" : "") + | ||||
|              uniform highp vec4 fontColor; | ||||
|              uniform highp vec4 backgroundColor; | ||||
|              uniform lowp float shadowLength; | ||||
|  | ||||
|         (!fallBack && rbgShift !== 0.0 ?" | ||||
|             varying lowp vec4 constantNoise;" : "") + | ||||
|              uniform highp vec2 virtual_resolution;" + | ||||
|  | ||||
|         (glowingLine !== 0 ? " | ||||
|             float randomPass(vec2 coords){ | ||||
|                 return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); | ||||
|             }" : "") + | ||||
|              (burnIn !== 0 ? " | ||||
|                  uniform sampler2D burnInSource; | ||||
|                  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) { | ||||
|             float result = 1.0;" + | ||||
|              (fallBack && horizontalSync !== 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 ? | ||||
|                "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);" : "") + " | ||||
|              (glowingLine !== 0 ? " | ||||
|                  float randomPass(vec2 coords){ | ||||
|                      return fract(smoothstep(-120.0, 0.0, coords.y - (virtual_resolution.y + 120.0) * fract(time * 0.00015))); | ||||
|                  }" : "") + | ||||
|  | ||||
|            return result; | ||||
|         } | ||||
|              "float min2(vec2 v) { | ||||
|                  return min(v.x, v.y); | ||||
|              } | ||||
|  | ||||
|         float min2(vec2 v) { | ||||
|             return min(v.x, v.y); | ||||
|         } | ||||
|              float rgb2grey(vec3 v){ | ||||
|                  return dot(v, vec3(0.21, 0.72, 0.04)); | ||||
|              } | ||||
|  | ||||
|         float rgb2grey(vec3 v){ | ||||
|             return dot(v, vec3(0.21, 0.72, 0.04)); | ||||
|         }" + | ||||
|              float isInScreen(vec2 v) { | ||||
|                  return min2(step(0.0, v) - step(1.0, v)); | ||||
|              } | ||||
|  | ||||
|         "void main() {" + | ||||
|             "vec2 cc = vec2(0.5) - qt_TexCoord0;" + | ||||
|             "float distance = length(cc);" + | ||||
|              vec2 barrel(vec2 v, vec2 cc) {" + | ||||
|  | ||||
|             //FallBack if there are problems | ||||
|             (fallBack && (flickering !== 0.0 || horizontalSync !== 0.0 || rbgShift !== 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);" | ||||
|             : "") + | ||||
|             (fallBack && rbgShift !== 0.0 ?" | ||||
|                 lowp vec4 constantNoise = initialNoiseTexel;" : "") + | ||||
|                  (screenCurvature !== 0 ? " | ||||
|                      float distortion = dot(cc, cc) * screenCurvature; | ||||
|                      return (v - cc * (1.0 + distortion) * distortion);" | ||||
|                  : | ||||
|                      "return v;") + | ||||
|              "}" + | ||||
|  | ||||
|             (staticNoise ? " | ||||
|                 float noise = staticNoise;" : "") + | ||||
|              "vec3 convertWithChroma(vec3 inColor) { | ||||
|                 vec3 outColor = inColor;" + | ||||
|  | ||||
|             (screenCurvature !== 0 ? " | ||||
|                 float distortion = dot(cc, cc) * screenCurvature; | ||||
|                 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;" | ||||
|             :" | ||||
|                 vec2 staticCoords = qt_TexCoord0;") + | ||||
|                  (chromaColor !== 0 ? | ||||
|                      "outColor = fontColor.rgb * mix(vec3(rgb2grey(inColor)), inColor, chromaColor);" | ||||
|                  : | ||||
|                      "outColor = fontColor.rgb * rgb2grey(inColor);") + | ||||
|  | ||||
|             "vec2 coords = staticCoords;" + | ||||
|              "  return outColor; | ||||
|              }" + | ||||
|  | ||||
|             (horizontalSync !== 0 ? " | ||||
|                 float dst = sin((coords.y + time * 0.001) * distortionFreq); | ||||
|                 coords.x += dst * distortionScale;" + | ||||
|                 (staticNoise ? " | ||||
|                     noise += distortionScale * 7.0;" : "") | ||||
|             : "") + | ||||
|              "void main() {" + | ||||
|                  "vec2 cc = vec2(0.5) - qt_TexCoord0;" + | ||||
|                  "float distance = length(cc);" + | ||||
|  | ||||
|             (jitter !== 0 || staticNoise !== 0 || rbgShift !== 0 ? | ||||
|                 "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" | ||||
|             : "") + | ||||
|                  //FallBack if there are problems | ||||
|                  (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 ? " | ||||
|                 vec2 offset = vec2(noiseTexel.b, noiseTexel.a) - vec2(0.5); | ||||
|                 vec2 txt_coords = coords + offset * jitterDisplacement;" | ||||
|             :  "vec2 txt_coords = coords;") + | ||||
|                  (staticNoise ? " | ||||
|                      float noise = staticNoise;" : "") + | ||||
|  | ||||
|             "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 ? " | ||||
|                 float noiseVal = noiseTexel.a; | ||||
|                 color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + | ||||
|                  "vec2 coords = qt_TexCoord0;" + | ||||
|  | ||||
|             (glowingLine !== 0 ? " | ||||
|                 color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||
|                  (horizontalSync !== 0 ? " | ||||
|                      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 ? " | ||||
|                 vec4 txt_blur = texture2D(burnInSource, staticCoords); | ||||
|                 float blurDecay = clamp((time - burnInLastUpdate) * burnInTime, 0.0, 1.0); | ||||
|                 txt_color = max(txt_color, 0.5 * (txt_blur.rgb - vec3(blurDecay)));" | ||||
|             : "") + | ||||
|                  (jitter !== 0 || staticNoise !== 0 ? | ||||
|                      "vec4 noiseTexel = texture2D(noiseSource, scaleNoiseSize * coords + vec2(fract(time / 51.0), fract(time / 237.0)));" | ||||
|                  : "") + | ||||
|  | ||||
|              "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 greyscale_color = rgb2grey(txt_color);" + | ||||
|                  "float color = 0.0001;" + | ||||
|  | ||||
|             (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);") + | ||||
|                  (staticNoise !== 0 ? " | ||||
|                      float noiseVal = noiseTexel.a; | ||||
|                      color += noiseVal * noise * (1.0 - distance * 1.3);" : "") + | ||||
|  | ||||
|             (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);" | ||||
|             : "") + | ||||
|                  (glowingLine !== 0 ? " | ||||
|                      color += randomPass(coords * virtual_resolution) * glowingLine;" : "") + | ||||
|  | ||||
|             (screenCurvature !== 0 ? " | ||||
|                 vec2 curvatureMask = step(vec2(0.0), curvatureCoords) - step(vec2(1.0), curvatureCoords); | ||||
|                 finalColor *= clamp(0.0, 1.0, curvatureMask.x + curvatureMask.y);" | ||||
|             :"") + | ||||
|                  "txt_coords = mix(qt_TexCoord0, txt_coords, staticInScreen); | ||||
|                   float inScreen2 = isInScreen(barrel(txt_coords, cc)); | ||||
|                   vec3 origTxtColor = texture2D(screenBuffer, txt_coords).rgb; | ||||
|                   vec3 txt_color = mix(backgroundColor.rgb, origTxtColor, inScreen2);" + | ||||
|  | ||||
|             (flickering !== 0 ? " | ||||
|                 finalColor *= brightness;" : "") + | ||||
|                  (burnIn !== 0 ? " | ||||
|                      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 ? " | ||||
|                 finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);" : "") + | ||||
|                   "txt_color += fontColor.rgb * vec3(color);" + | ||||
|  | ||||
|                  "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: { | ||||
|          // Print warning messages | ||||
|          if (log) | ||||
|              console.log(log); | ||||
|                   finalColor = mix(origTxtColor, finalColor, staticInScreen); | ||||
|                   gl_FragColor = vec4(finalColor, qt_Opacity);" + | ||||
|              "}" | ||||
|  | ||||
|          // Activate fallback mode | ||||
|          if (status == ShaderEffect.Error) { | ||||
|             fallBack = true; | ||||
|           onStatusChanged: { | ||||
|               // Print warning messages | ||||
|               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 | ||||
|     opacity: appSettings.windowOpacity * 0.3 + 0.7 | ||||
|  | ||||
|     blending: false | ||||
|  | ||||
|     source: terminal.mainSource | ||||
|     burnInEffect: terminal.burnInEffect | ||||
|     virtual_resolution: terminal.virtualResolution | ||||
| @@ -36,7 +34,7 @@ ShaderTerminal { | ||||
|         height: parent.height * appSettings.bloomQuality | ||||
|  | ||||
|         sourceComponent: FastBlur{ | ||||
|             radius: Utils.lint(16, 64, appSettings.bloomQuality * appSettings.windowScaling); | ||||
|             radius: Utils.lint(16, 64, appSettings.bloomQuality); | ||||
|             source: terminal.mainSource | ||||
|             transparentBorder: true | ||||
|         } | ||||
| @@ -56,11 +54,11 @@ ShaderTerminal { | ||||
|  | ||||
|     bloomSource: bloomSourceLoader.item | ||||
|  | ||||
|     NewTerminalFrame { | ||||
|         id: terminalFrame | ||||
|         anchors.fill: parent | ||||
|         blending: true | ||||
|     } | ||||
| //    NewTerminalFrame { | ||||
| //        id: terminalFrame | ||||
| //        anchors.fill: parent | ||||
| //        blending: true | ||||
| //    } | ||||
|  | ||||
|     // 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 | ||||
|   | ||||
| @@ -137,13 +137,8 @@ ApplicationWindow{ | ||||
|     TerminalContainer{ | ||||
|         id: terminalContainer | ||||
|         y: appSettings.showMenubar ? 0 : -2 // Workaroud to hide the margin in the menubar. | ||||
|         width: parent.width * appSettings.windowScaling | ||||
|         height: (parent.height + Math.abs(y)) * appSettings.windowScaling | ||||
|  | ||||
|         transform: Scale { | ||||
|             xScale: 1 / appSettings.windowScaling | ||||
|             yScale: 1 / appSettings.windowScaling | ||||
|         } | ||||
|         width: parent.width | ||||
|         height: (parent.height + Math.abs(y)) | ||||
|     } | ||||
|     SettingsWindow{ | ||||
|         id: settingswindow | ||||
|   | ||||
| @@ -32,7 +32,6 @@ | ||||
|         <file>fonts/modern-pro-font-win-tweaked/ProFontWindows.ttf</file> | ||||
|         <file>fonts/modern-hermit/Hermit-medium.otf</file> | ||||
|         <file>fonts/modern-inconsolata/Inconsolata.otf</file> | ||||
|         <file>SettingsScreenTab.qml</file> | ||||
|         <file>fonts/modern-fixedsys-excelsior/FSEX301-L2.ttf</file> | ||||
|         <file>../icons/32x32/cool-retro-term.png</file> | ||||
|         <file>Components/SizedLabel.qml</file> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user