mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-11-04 09:02:14 +00:00 
			
		
		
		
	Improved frames. They are now faster, better looking, and more customizable. Also added a workaround for segementation faults when changing them.
This commit is contained in:
		@@ -78,7 +78,7 @@ Item{
 | 
			
		||||
 | 
			
		||||
    ListModel{
 | 
			
		||||
        id: framelist
 | 
			
		||||
        ListElement{text: "No frame"; source: "./frames/NoFrame.qml"; reflections: false}
 | 
			
		||||
        ListElement{text: "No frame"; source: ""; reflections: false}
 | 
			
		||||
        ListElement{text: "Simple white frame"; source: "./frames/WhiteSimpleFrame.qml"; reflections: true}
 | 
			
		||||
        ListElement{text: "Rough black frame"; source: "./frames/BlackRoughFrame.qml"; reflections: true}
 | 
			
		||||
    }
 | 
			
		||||
@@ -154,7 +154,7 @@ Item{
 | 
			
		||||
 | 
			
		||||
    // FRAMES /////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
    property bool _frameReflections: true
 | 
			
		||||
    property bool _frameReflections: false
 | 
			
		||||
    property bool reflectionsAllowed: framelist.get(frames_index).reflections
 | 
			
		||||
    property bool frameReflections: _frameReflections && reflectionsAllowed
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -35,10 +35,10 @@ Item{
 | 
			
		||||
    property alias title: ksession.title
 | 
			
		||||
    property alias kterminal: kterminal
 | 
			
		||||
 | 
			
		||||
    anchors.leftMargin: frame.item.displacementLeft * appSettings.window_scaling
 | 
			
		||||
    anchors.rightMargin: frame.item.displacementRight * appSettings.window_scaling
 | 
			
		||||
    anchors.topMargin: frame.item.displacementTop * appSettings.window_scaling
 | 
			
		||||
    anchors.bottomMargin: frame.item.displacementBottom * appSettings.window_scaling
 | 
			
		||||
    anchors.leftMargin: frame.displacementLeft * appSettings.window_scaling
 | 
			
		||||
    anchors.rightMargin: frame.displacementRight * appSettings.window_scaling
 | 
			
		||||
    anchors.topMargin: frame.displacementTop * appSettings.window_scaling
 | 
			
		||||
    anchors.bottomMargin: frame.displacementBottom * appSettings.window_scaling
 | 
			
		||||
 | 
			
		||||
    //The blur effect has to take into account the framerate
 | 
			
		||||
    property real mBlur: appSettings.motion_blur
 | 
			
		||||
 
 | 
			
		||||
@@ -49,10 +49,10 @@ ShaderEffect {
 | 
			
		||||
 | 
			
		||||
    property bool frameReflections: appSettings.frameReflections
 | 
			
		||||
 | 
			
		||||
    property real disp_top: (frame.item.displacementTop * appSettings.window_scaling) / height
 | 
			
		||||
    property real disp_bottom: (frame.item.displacementBottom * appSettings.window_scaling) / height
 | 
			
		||||
    property real disp_left: (frame.item.displacementLeft * appSettings.window_scaling) / width
 | 
			
		||||
    property real disp_right: (frame.item.displacementRight * appSettings.window_scaling) / width
 | 
			
		||||
    property real disp_top: (frame.displacementTop * appSettings.window_scaling) / height
 | 
			
		||||
    property real disp_bottom: (frame.displacementBottom * appSettings.window_scaling) / height
 | 
			
		||||
    property real disp_left: (frame.displacementLeft * appSettings.window_scaling) / width
 | 
			
		||||
    property real disp_right: (frame.displacementRight * appSettings.window_scaling) / width
 | 
			
		||||
 | 
			
		||||
    property real screen_brightness: appSettings.brightness * 1.5 + 0.5
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,15 @@ ShaderTerminal{
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: frame
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
 | 
			
		||||
        property real displacementLeft: item ? item.displacementLeft : 0
 | 
			
		||||
        property real displacementTop: item ? item.displacementTop : 0
 | 
			
		||||
        property real displacementRight: item ? item.displacementRight : 0
 | 
			
		||||
        property real displacementBottom: item ? item.displacementBottom : 0
 | 
			
		||||
 | 
			
		||||
        asynchronous: true
 | 
			
		||||
        visible: status === Loader.Ready
 | 
			
		||||
 | 
			
		||||
        z: 2.1
 | 
			
		||||
        source: appSettings.frame_source
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -21,5 +21,6 @@ TerminalFrame{
 | 
			
		||||
    displacementRight: 80.0
 | 
			
		||||
    displacementBottom: 65.0
 | 
			
		||||
 | 
			
		||||
    shaderString: "FrameShader.qml"
 | 
			
		||||
    staticDiffuseComponent: 1.0
 | 
			
		||||
    dinamycDiffuseComponent: 0.6
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,5 +21,6 @@ TerminalFrame{
 | 
			
		||||
    displacementRight: 55
 | 
			
		||||
    displacementBottom: 50
 | 
			
		||||
 | 
			
		||||
    shaderString: "FrameShader.qml"
 | 
			
		||||
    staticDiffuseComponent: 1.0
 | 
			
		||||
    dinamycDiffuseComponent: 0.6
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.2 MiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 507 KiB After Width: | Height: | Size: 498 KiB  | 
@@ -1,103 +0,0 @@
 | 
			
		||||
import QtQuick 2.2
 | 
			
		||||
import QtGraphicalEffects 1.0
 | 
			
		||||
 | 
			
		||||
ShaderEffect{
 | 
			
		||||
    property variant source: framesource
 | 
			
		||||
    property variant normals: framesourcenormals
 | 
			
		||||
    property real screen_distorsion: appSettings.screen_distortion * framecontainer.distortionCoefficient
 | 
			
		||||
    property real ambient_light: appSettings.ambient_light
 | 
			
		||||
    property color font_color: appSettings.font_color
 | 
			
		||||
    property color background_color: appSettings.background_color
 | 
			
		||||
    property real brightness: appSettings.brightness * 1.5 + 0.5
 | 
			
		||||
 | 
			
		||||
    property bool frameReflections: appSettings.frameReflections
 | 
			
		||||
    property variant lightSource: reflectionEffectSourceLoader.item
 | 
			
		||||
 | 
			
		||||
    property real chroma_color: appSettings.chroma_color
 | 
			
		||||
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: reflectionEffectLoader
 | 
			
		||||
        width: parent.width * 0.33
 | 
			
		||||
        height: parent.height * 0.33
 | 
			
		||||
        active: frameReflections
 | 
			
		||||
 | 
			
		||||
        sourceComponent: FastBlur{
 | 
			
		||||
            id: frameReflectionEffect
 | 
			
		||||
            radius: 128
 | 
			
		||||
            source: terminal.kterminal
 | 
			
		||||
            smooth: false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: reflectionEffectSourceLoader
 | 
			
		||||
        active: frameReflections
 | 
			
		||||
        sourceComponent: ShaderEffectSource{
 | 
			
		||||
            id: frameReflectionSource
 | 
			
		||||
            sourceItem: reflectionEffectLoader.item
 | 
			
		||||
            hideSource: true
 | 
			
		||||
            smooth: true
 | 
			
		||||
            visible: false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    blending: true
 | 
			
		||||
 | 
			
		||||
    fragmentShader: "
 | 
			
		||||
                            uniform sampler2D source;
 | 
			
		||||
                            uniform sampler2D normals;
 | 
			
		||||
                            uniform highp float screen_distorsion;
 | 
			
		||||
                            uniform highp float ambient_light;
 | 
			
		||||
                            uniform highp float qt_Opacity;
 | 
			
		||||
                            uniform lowp float chroma_color;" +
 | 
			
		||||
 | 
			
		||||
                            (frameReflections ?
 | 
			
		||||
                                "uniform sampler2D lightSource;" : "") + "
 | 
			
		||||
 | 
			
		||||
                            uniform vec4 font_color;
 | 
			
		||||
                            uniform vec4 background_color;
 | 
			
		||||
                            varying lowp float brightness;
 | 
			
		||||
 | 
			
		||||
                            varying highp vec2 qt_TexCoord0;
 | 
			
		||||
 | 
			
		||||
                            vec2 distortCoordinates(vec2 coords){
 | 
			
		||||
                                vec2 cc = coords - vec2(0.5);
 | 
			
		||||
                                float dist = dot(cc, cc) * screen_distorsion;
 | 
			
		||||
                                return (coords + cc * (1.0 + dist) * dist);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            float rgb2grey(vec3 v){
 | 
			
		||||
                                return dot(v, vec3(0.21, 0.72, 0.04));
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            void main(){
 | 
			
		||||
                                vec2 coords = distortCoordinates(qt_TexCoord0);
 | 
			
		||||
                                vec4 txt_color = texture2D(source, coords);
 | 
			
		||||
                                vec4 txt_normal = texture2D(normals, coords);
 | 
			
		||||
                                vec3 normal = normalize(txt_normal.rgb * 2.0 - 1.0);
 | 
			
		||||
                                vec3 light_direction = normalize(vec3(0.5, 0.5, 0.0) - vec3(qt_TexCoord0, 0.0));
 | 
			
		||||
 | 
			
		||||
                                float dotProd = dot(normal, light_direction);" +
 | 
			
		||||
 | 
			
		||||
                                (frameReflections ? "
 | 
			
		||||
                                    vec3 realLightColor = texture2D(lightSource, coords).rgb;
 | 
			
		||||
                                    float screenLight = rgb2grey(realLightColor);
 | 
			
		||||
                                    float clampedDotProd = clamp(dotProd, 0.05, 1.0);
 | 
			
		||||
                                    float diffuseReflection = clamp(screenLight * 1.5 * clampedDotProd, 0.0, 0.35);
 | 
			
		||||
                                    float reflectionAlpha = mix(1.0, 0.90, dotProd);
 | 
			
		||||
                                    vec3 lightColor = mix(font_color.rgb * screenLight, font_color.rgb * realLightColor, chroma_color);"
 | 
			
		||||
                                : "
 | 
			
		||||
                                    float diffuseReflection = 0.0;
 | 
			
		||||
                                    float reflectionAlpha = 1.0;
 | 
			
		||||
                                    vec3 lightColor = font_color.rgb;") + "
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                vec3 back_color = background_color.rgb * (0.2 + 0.5 * dotProd);
 | 
			
		||||
                                vec3 front_color = lightColor * (0.05 + diffuseReflection);
 | 
			
		||||
 | 
			
		||||
                                vec4 dark_color = vec4((back_color + front_color) * txt_normal.a, txt_normal.a * reflectionAlpha);
 | 
			
		||||
                                gl_FragColor = mix(dark_color, txt_color, ambient_light);
 | 
			
		||||
                            }"
 | 
			
		||||
 | 
			
		||||
    onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,7 @@
 | 
			
		||||
import QtQuick 2.2
 | 
			
		||||
import QtGraphicalEffects 1.0
 | 
			
		||||
 | 
			
		||||
import "../../utils.js" as Utils
 | 
			
		||||
 | 
			
		||||
Item{
 | 
			
		||||
    id: framecontainer
 | 
			
		||||
@@ -21,6 +24,10 @@ Item{
 | 
			
		||||
    property real displacementRight
 | 
			
		||||
    property real displacementBottom
 | 
			
		||||
 | 
			
		||||
    // Material coefficients
 | 
			
		||||
    property real staticDiffuseComponent: 0.7
 | 
			
		||||
    property real dinamycDiffuseComponent: 1.0
 | 
			
		||||
 | 
			
		||||
    property real distortionCoefficient
 | 
			
		||||
 | 
			
		||||
    BorderImage{
 | 
			
		||||
@@ -65,10 +72,138 @@ Item{
 | 
			
		||||
        textureSize: Qt.size(parent.width, parent.height)
 | 
			
		||||
        visible: false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // REFLECTIONS ////////////////////////////////////////////////////////////
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: reflectionEffectLoader
 | 
			
		||||
        width: parent.width * 0.33
 | 
			
		||||
        height: parent.height * 0.33
 | 
			
		||||
        active: appSettings.frameReflections
 | 
			
		||||
 | 
			
		||||
        sourceComponent: FastBlur{
 | 
			
		||||
            id: frameReflectionEffect
 | 
			
		||||
            radius: 128
 | 
			
		||||
            source: terminal.kterminal
 | 
			
		||||
            smooth: false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: reflectionEffectSourceLoader
 | 
			
		||||
        active: appSettings.frameReflections
 | 
			
		||||
        sourceComponent: ShaderEffectSource{
 | 
			
		||||
            id: frameReflectionSource
 | 
			
		||||
            sourceItem: reflectionEffectLoader.item
 | 
			
		||||
            hideSource: true
 | 
			
		||||
            smooth: true
 | 
			
		||||
            visible: false
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // This texture represent the static light component.
 | 
			
		||||
    ShaderEffect {
 | 
			
		||||
        id: staticLight
 | 
			
		||||
        property alias source: framesource
 | 
			
		||||
        property alias normals: framesourcenormals
 | 
			
		||||
        property real screen_distorsion: appSettings.screen_distortion * framecontainer.distortionCoefficient
 | 
			
		||||
        property real ambient_light: appSettings.ambient_light
 | 
			
		||||
        property color font_color: appSettings.font_color
 | 
			
		||||
        property color background_color: appSettings.background_color
 | 
			
		||||
        property color reflectionColor: Utils.mix(font_color, background_color, 0.2)
 | 
			
		||||
        property real diffuseComponent: staticDiffuseComponent
 | 
			
		||||
 | 
			
		||||
        anchors.centerIn: parent
 | 
			
		||||
        width: parent.width + (addedWidth / textureWidth) * parent.width
 | 
			
		||||
        height: parent.height + (addedHeight / textureHeight) * parent.height
 | 
			
		||||
        source: shaderString
 | 
			
		||||
 | 
			
		||||
        blending: true
 | 
			
		||||
 | 
			
		||||
        fragmentShader: "
 | 
			
		||||
            uniform highp sampler2D normals;
 | 
			
		||||
            uniform highp sampler2D source;
 | 
			
		||||
            uniform lowp float screen_distorsion;
 | 
			
		||||
            uniform lowp float ambient_light;
 | 
			
		||||
            uniform highp float qt_Opacity;
 | 
			
		||||
            uniform lowp vec4 reflectionColor;
 | 
			
		||||
            uniform lowp float diffuseComponent;
 | 
			
		||||
 | 
			
		||||
            varying highp vec2 qt_TexCoord0;
 | 
			
		||||
 | 
			
		||||
            vec2 distortCoordinates(vec2 coords){
 | 
			
		||||
                vec2 cc = coords - vec2(0.5);
 | 
			
		||||
                float dist = dot(cc, cc) * screen_distorsion;
 | 
			
		||||
                return (coords + cc * (1.0 + dist) * dist);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            float rgb2grey(vec3 v){
 | 
			
		||||
                return dot(v, vec3(0.21, 0.72, 0.04));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            void main(){
 | 
			
		||||
                vec2 coords = distortCoordinates(qt_TexCoord0);
 | 
			
		||||
                vec4 txtColor = texture2D(source, coords);
 | 
			
		||||
                vec4 txtNormal = texture2D(normals, coords);
 | 
			
		||||
 | 
			
		||||
                vec3 normal = normalize(txtNormal.rgb * 2.0 - 1.0);
 | 
			
		||||
                vec2 lightDirection = normalize(vec2(0.5, 0.5) - coords);
 | 
			
		||||
                float dotProd = dot(normal, vec3(lightDirection, 0.0)) * diffuseComponent;
 | 
			
		||||
 | 
			
		||||
                vec3 darkColor = dotProd * reflectionColor.rgb;
 | 
			
		||||
                gl_FragColor = vec4(mix(darkColor, txtColor.rgb, ambient_light), dotProd);
 | 
			
		||||
            }
 | 
			
		||||
        "
 | 
			
		||||
 | 
			
		||||
        onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ShaderEffectSource {
 | 
			
		||||
        id: staticLightSource
 | 
			
		||||
        sourceItem: staticLight
 | 
			
		||||
        hideSource: true
 | 
			
		||||
        anchors.fill: staticLight
 | 
			
		||||
        live: true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Loader{
 | 
			
		||||
        id: dynamicLightLoader
 | 
			
		||||
        anchors.fill: staticLight
 | 
			
		||||
        active: appSettings.frameReflections
 | 
			
		||||
        sourceComponent: ShaderEffect {
 | 
			
		||||
            property ShaderEffectSource lightMask: staticLightSource
 | 
			
		||||
            property ShaderEffectSource reflectionSource: reflectionEffectSourceLoader.item
 | 
			
		||||
            property real diffuseComponent: dinamycDiffuseComponent
 | 
			
		||||
            property real chroma_color: appSettings.chroma_color
 | 
			
		||||
            property color font_color: appSettings.font_color
 | 
			
		||||
 | 
			
		||||
            visible: true
 | 
			
		||||
            blending: true
 | 
			
		||||
 | 
			
		||||
            fragmentShader: "
 | 
			
		||||
                uniform sampler2D lightMask;
 | 
			
		||||
                uniform sampler2D reflectionSource;
 | 
			
		||||
                uniform lowp float diffuseComponent;
 | 
			
		||||
                uniform lowp float chroma_color;
 | 
			
		||||
                uniform highp vec4 font_color;
 | 
			
		||||
                uniform highp float qt_Opacity;
 | 
			
		||||
 | 
			
		||||
                varying highp vec2 qt_TexCoord0;
 | 
			
		||||
 | 
			
		||||
                float rgb2grey(vec3 v){
 | 
			
		||||
                    return dot(v, vec3(0.21, 0.72, 0.04));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                void main() {
 | 
			
		||||
                    float alpha = texture2D(lightMask, qt_TexCoord0).a * diffuseComponent;
 | 
			
		||||
                    vec3 reflectionColor = texture2D(reflectionSource, qt_TexCoord0).rgb;
 | 
			
		||||
                    vec3 color = font_color.rgb * rgb2grey(reflectionColor);" +
 | 
			
		||||
                    (chroma_color !== 0 ?
 | 
			
		||||
                        "color = mix(color, font_color.rgb * reflectionColor, chroma_color);"
 | 
			
		||||
                    : "") +
 | 
			
		||||
                    "gl_FragColor = vec4(color, 1.0) * alpha;
 | 
			
		||||
                }
 | 
			
		||||
            "
 | 
			
		||||
 | 
			
		||||
            onStatusChanged: if (log) console.log(log) //Print warning messages
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@
 | 
			
		||||
        <file>frames/images/black-frame-original.png</file>
 | 
			
		||||
        <file>frames/images/screen-frame-original.png</file>
 | 
			
		||||
        <file>frames/WhiteSimpleFrame.qml</file>
 | 
			
		||||
        <file>frames/utils/FrameShader.qml</file>
 | 
			
		||||
        <file>frames/utils/TerminalFrame.qml</file>
 | 
			
		||||
        <file>SizeOverlay.qml</file>
 | 
			
		||||
        <file>ShaderTerminal.qml</file>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user