1
0
mirror of https://github.com/Swordfish90/cool-retro-term.git synced 2026-02-08 00:32:27 +00:00

Add configurable screen radius and make frame look a little bit better.

This commit is contained in:
Filippo Scognamiglio
2026-01-04 16:54:43 +01:00
parent 33adf4106f
commit 048cfcce81
43 changed files with 59 additions and 32 deletions

View File

@@ -98,11 +98,14 @@ QtObject {
property real _frameShininess: 0.2 property real _frameShininess: 0.2
property real frameShininess: _frameShininess * 0.5 property real frameShininess: _frameShininess * 0.5
property real _margin: 0.5
property real margin: Utils.lint(1.0, 20.0, _margin)
property real _frameSize: 0.2 property real _frameSize: 0.2
property real frameSize: _frameSize * 0.1 property real frameSize: _frameSize * 0.05
property real _screenRadius: 0.2
property real screenRadius: Utils.lint(4.0, 40.0, _screenRadius)
property real _margin: 0.5
property real margin: Utils.lint(1.0, 40.0, _margin) + 0.5 * screenRadius
readonly property int no_rasterization: 0 readonly property int no_rasterization: 0
readonly property int scanline_rasterization: 1 readonly property int scanline_rasterization: 1
@@ -301,6 +304,7 @@ QtObject {
"margin": _margin, "margin": _margin,
"blinkingCursor": blinkingCursor, "blinkingCursor": blinkingCursor,
"frameSize": _frameSize, "frameSize": _frameSize,
"screenRadius": _screenRadius,
"frameColor": _frameColor, "frameColor": _frameColor,
"frameShininess": _frameShininess "frameShininess": _frameShininess
} }
@@ -412,6 +416,7 @@ QtObject {
_margin = settings.margin !== undefined ? settings.margin : _margin _margin = settings.margin !== undefined ? settings.margin : _margin
_frameSize = settings.frameSize !== undefined ? settings.frameSize : _frameSize _frameSize = settings.frameSize !== undefined ? settings.frameSize : _frameSize
_screenRadius = settings.screenRadius !== undefined ? settings.screenRadius : _screenRadius
_frameColor = settings.frameColor !== undefined ? settings.frameColor : _frameColor _frameColor = settings.frameColor !== undefined ? settings.frameColor : _frameColor
_frameShininess = settings.frameShininess !== undefined ? settings.frameShininess : _frameShininess _frameShininess = settings.frameShininess !== undefined ? settings.frameShininess : _frameShininess

View File

@@ -211,6 +211,13 @@ ColumnLayout {
onValueChanged: appSettings._margin = value onValueChanged: appSettings._margin = value
value: appSettings._margin value: appSettings._margin
} }
Label {
text: qsTr("Radius")
}
SimpleSlider {
onValueChanged: appSettings._screenRadius = value
value: appSettings._screenRadius
}
Label { Label {
text: qsTr("Frame size") text: qsTr("Frame size")
} }

View File

@@ -72,6 +72,7 @@ ShaderTerminal {
sourceComponent: ShaderEffectSource { sourceComponent: ShaderEffectSource {
id: _bloomEffectSource id: _bloomEffectSource
sourceItem: bloomEffectLoader.item sourceItem: bloomEffectLoader.item
wrapMode: ShaderEffectSource.Repeat
hideSource: true hideSource: true
smooth: true smooth: true
visible: false visible: false

View File

@@ -26,23 +26,24 @@ ShaderEffect {
property color _backgroundColor: appSettings.backgroundColor property color _backgroundColor: appSettings.backgroundColor
property color _fontColor: appSettings.fontColor property color _fontColor: appSettings.fontColor
property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2) property color _lightColor: Utils.mix(_fontColor, _backgroundColor, 0.2)
property real _ambientLight: appSettings.ambientLight
property color frameColor: Utils.sum( property color frameColor: Utils.mix(
Utils.scaleColor(_staticFrameColor, 0.8 * _ambientLight), Utils.scaleColor(_lightColor, 0.2),
Utils.scaleColor(_lightColor, 0.2) _staticFrameColor,
0.125 + 0.750 * ambientLight
) )
property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize property real screenCurvature: appSettings.screenCurvature * appSettings.screenCurvatureSize
// TODO FILIPPO... Get rid of those...
// Coefficient of the log curve used to approximate shadowing
property real frameShadowCoeff: 0.0125//Utils.lint(0.05, 0.025, _ambientLight)
property real frameShininess: appSettings.frameShininess property real frameShininess: appSettings.frameShininess
property real frameSize: appSettings.frameSize property real frameSize: appSettings.frameSize
property real qt_Opacity: 1.0 property real screenRadius: appSettings.screenRadius
property size viewportSize: Qt.size(width, height)
property real ambientLight: appSettings.ambientLight
vertexShader: "qrc:/shaders/terminal_frame.vert.qsb" vertexShader: "qrc:/shaders/terminal_frame.vert.qsb"
fragmentShader: "qrc:/shaders/terminal_frame.frag.qsb" fragmentShader: "qrc:/shaders/terminal_frame.frag.qsb"

View File

@@ -36,7 +36,6 @@ layout(std140, binding = 0) uniform ubuf {
float glowingLine; float glowingLine;
float chromaColor; float chromaColor;
vec2 jitterDisplacement; vec2 jitterDisplacement;
float ambientLight;
float jitter; float jitter;
float horizontalSync; float horizontalSync;
float horizontalSyncStrength; float horizontalSyncStrength;
@@ -151,6 +150,11 @@ void main() {
color += noiseTexel.a * staticNoise * (1.0 - distance * 1.3); color += noiseTexel.a * staticNoise * (1.0 - distance * 1.3);
color += randomPass(coords * virtualResolution) * glowingLine; color += randomPass(coords * virtualResolution) * glowingLine;
#if CRT_DISPLAY_FRAME == 1
vec4 frameColor = texture(frameSource, qt_TexCoord0);
color *= (1.0 - frameColor.a);
#endif
vec3 txt_color = texture(screenBuffer, txt_coords).rgb; vec3 txt_color = texture(screenBuffer, txt_coords).rgb;
float bloomScale = 1.0 + max(bloom, 0.0); float bloomScale = 1.0 + max(bloom, 0.0);
txt_color *= bloomScale; txt_color *= bloomScale;
@@ -169,12 +173,8 @@ void main() {
float brightness = mix(1.0, vBrightness, step(0.0, flickering)); float brightness = mix(1.0, vBrightness, step(0.0, flickering));
finalColor *= brightness; finalColor *= brightness;
finalColor += vec3(ambientLight) * (1.0 - distance) * (1.0 - distance);
#if CRT_DISPLAY_FRAME == 1 #if CRT_DISPLAY_FRAME == 1
vec4 frameColor = texture(frameSource, qt_TexCoord0); finalColor = mix(finalColor, frameColor.rgb, frameColor.a);
vec3 reflection = max(finalColor - backgroundColor.rgb, vec3(0.0)) * frameShininess;
finalColor = mix(finalColor, frameColor.rgb + reflection, frameColor.a);
#endif #endif
fragColor = vec4(finalColor, qt_Opacity); fragColor = vec4(finalColor, qt_Opacity);

View File

@@ -19,7 +19,6 @@ layout(std140, binding = 0) uniform ubuf {
float glowingLine; float glowingLine;
float chromaColor; float chromaColor;
vec2 jitterDisplacement; vec2 jitterDisplacement;
float ambientLight;
float jitter; float jitter;
float horizontalSync; float horizontalSync;
float horizontalSyncStrength; float horizontalSyncStrength;

View File

@@ -9,13 +9,13 @@ layout(std140, binding = 0) uniform ubuf {
float screenCurvature; float screenCurvature;
vec4 frameColor; vec4 frameColor;
float frameSize; float frameSize;
float screenRadius;
vec2 viewportSize;
float ambientLight;
}; };
float min2(vec2 v) { return min(v.x, v.y); } float min2(vec2 v) { return min(v.x, v.y); }
float max2(vec2 v) { return max(v.x, v.y); }
float prod2(vec2 v) { return v.x * v.y; } float prod2(vec2 v) { return v.x * v.y; }
float sum2(vec2 v) { return v.x + v.y; }
float hash(vec2 v) { return fract(sin(dot(v, vec2(12.9898, 78.233))) * 43758.5453); }
vec2 distortCoordinates(vec2 coords){ vec2 distortCoordinates(vec2 coords){
vec2 paddedCoords = coords * (vec2(1.0) + frameSize * 2.0) - frameSize; vec2 paddedCoords = coords * (vec2(1.0) + frameSize * 2.0) - frameSize;
@@ -24,14 +24,25 @@ vec2 distortCoordinates(vec2 coords){
return (paddedCoords + cc * (1.0 + dist) * dist); return (paddedCoords + cc * (1.0 + dist) * dist);
} }
float roundedRectSdfPixels(vec2 p, vec2 topLeft, vec2 bottomRight, float radiusPixels) {
vec2 sizePixels = (bottomRight - topLeft) * viewportSize;
vec2 centerPixels = (topLeft + bottomRight) * 0.5 * viewportSize;
vec2 localPixels = p * viewportSize - centerPixels;
vec2 halfSize = sizePixels * 0.5 - vec2(radiusPixels);
vec2 d = abs(localPixels) - halfSize;
return length(max(d, vec2(0.0))) + min(max(d.x, d.y), 0.0) - radiusPixels;
}
void main() { void main() {
vec2 staticCoords = qt_TexCoord0; vec2 staticCoords = qt_TexCoord0;
vec2 coords = distortCoordinates(staticCoords); vec2 coords = distortCoordinates(staticCoords);
float depth = 1.0 - 5.0 * min(min2(staticCoords), min2(vec2(1.0) - staticCoords)); float depth = 1.0 - 5.0 * min(min2(staticCoords), min2(vec2(1.0) - staticCoords));
float occlusionWidth = 0.025; float screenRadiusPixels = screenRadius;
float seamWidth = occlusionWidth; float edgeSoftPixels = 1.0;
float seamWidth = max(screenRadiusPixels, 0.5) / min2(viewportSize);
float e = min( float e = min(
smoothstep(-seamWidth, seamWidth, coords.x - coords.y), smoothstep(-seamWidth, seamWidth, coords.x - coords.y),
@@ -50,14 +61,14 @@ void main() {
smoothstep(-seamWidth, seamWidth, (1.0 - coords.x) - coords.y) smoothstep(-seamWidth, seamWidth, (1.0 - coords.x) - coords.y)
); );
vec2 clampedCoords = clamp(coords, vec2(0.0), vec2(1.0)); float distPixels = roundedRectSdfPixels(coords, vec2(0.0), vec2(1.0), screenRadiusPixels);
float innerEdgeDist = length(coords - clampedCoords); float frameShadow = (e * 0.66 + w * 0.66 + n * 0.33 + s) * depth;
float occlusion = smoothstep(0.0, occlusionWidth, innerEdgeDist); frameShadow *= smoothstep(0.0, edgeSoftPixels * 10.0, distPixels);
float frameShadow = e * 0.75 + w * 0.75 + n * 0.50 + s * 1.00; float inScreen = smoothstep(0.0, edgeSoftPixels, -distPixels);
frameShadow *= sqrt(occlusion) * depth; float alpha = mix(mix(0.7, 0.9, ambientLight), mix(0.0, 0.2, ambientLight), inScreen);
float glass = clamp(ambientLight * pow(prod2(coords * (1.0 - coords.yx)) * 50.0, 0.25) * inScreen, 0.0, 1.0);
vec3 color = mix(frameColor.rgb * frameShadow, vec3(glass), inScreen);
vec3 color = frameColor.rgb * frameShadow; fragColor = vec4(color, alpha) * qt_Opacity;
float alpha = clamp(sum2(1.0 - step(vec2(0.0), coords) + step(vec2(1.0), coords)), 0.0, 1.0);
fragColor = vec4(color * alpha, alpha) * qt_Opacity;
} }

Binary file not shown.

View File

@@ -9,6 +9,9 @@ layout(std140, binding = 0) uniform ubuf {
float screenCurvature; float screenCurvature;
vec4 frameColor; vec4 frameColor;
float frameSize; float frameSize;
float screenRadius;
vec2 viewportSize;
float ambientLight;
}; };
layout(location = 0) out vec2 qt_TexCoord0; layout(location = 0) out vec2 qt_TexCoord0;

Binary file not shown.