diff --git a/resources/shaders/common.glsl b/resources/shaders/common.glsl
index 69a1aad..e89f4ff 100644
--- a/resources/shaders/common.glsl
+++ b/resources/shaders/common.glsl
@@ -379,7 +379,10 @@ float getWinding(vec2 a, vec2 b) { return cross(vec3(a, 0.0), vec3(b, 0.0)).z; }
// Rotates the given 2D vector a clockwise by the angle alpha (given in radians).
vec2 rotate(vec2 a, float angle) {
- return vec2(a.x * cos(angle) - a.y * sin(angle), a.x * sin(angle) + a.y * cos(angle));
+ return vec2(
+ a.x * cos(angle) - a.y * sin(angle),
+ a.x * sin(angle) + a.y * cos(angle)
+ );
}
// --------------------------------------------------------------------------------- noise
diff --git a/resources/shaders/mushroom.frag b/resources/shaders/mushroom.frag
index 4b0ea15..396a739 100644
--- a/resources/shaders/mushroom.frag
+++ b/resources/shaders/mushroom.frag
@@ -32,24 +32,22 @@
// The width of the fading effect is loaded from the settings.
-// use 8BitStyle or not
-uniform bool u8BitStyle;
+// use 8BitStyle or not (sliding scale)
+uniform float uScaleStyle;
-//these are for the 4 point stars (or sparks)
-uniform bool uEnable4PStars;
-uniform float u4PStars;
-uniform vec4 u4PSColor;
-uniform float u4PSRotation;
+//these are for the sparks
+uniform float uSparkCount;
+uniform vec4 uSparkColor;
+uniform float uSparkRotation;
//these are for the Rays
-uniform bool uEnableRays;
uniform vec4 uRaysColor;
-//these are for the 5 pointed stars
-uniform bool uEnable5pStars;
-uniform float uRings;
+//these are for the stars
+uniform float uRingCount;
uniform float uRingRotation;
-uniform float uStarPerRing;
+uniform float uStarCount;
+
// and the colors they change over time
uniform vec4 uStarColor0;
uniform vec4 uStarColor1;
@@ -58,6 +56,9 @@ uniform vec4 uStarColor3;
uniform vec4 uStarColor4;
uniform vec4 uStarColor5;
+//seed
+uniform vec2 uSeed;
+
//helps to find the angle
vec3 getPosByAngle(float angle)
{
@@ -65,6 +66,7 @@ vec3 getPosByAngle(float angle)
}
+//gets the mask of a Star
float getStar(vec2 uv, vec2 center, float npoints, float radiusRatio, float size, float rotation)
{
@@ -104,56 +106,65 @@ float getStar(vec2 uv, vec2 center, float npoints, float radiusRatio, float size
}
-float getStarWithFade(vec2 uv, vec2 center, float npoints, float radiusRatio, float size, float rotation)
+//use to scale the window
+vec2 scaleUV(vec2 uv, vec2 scale)
{
- float radiusMax = 1.0;
- float radiusMin = radiusMax * radiusRatio;
-
- float PI = 3.1415926;
- float starangle = 2.0 * PI / npoints; // Angle between points on the star
+ // Put texture coordinate origin to center of window.
+ uv = uv * 2.0 - 1.0;
- // Offset rotation to ensure one point is always up when rotation = 0
- rotation += PI / 2.0 - starangle / 1.0;
+ //scale
+ uv /= mix(vec2(1.0,1.0), vec2(0.0,0.0), scale);
- // Define the positions for the outer and inner points of the star's initial angle, rotated by `rotation`
- vec3 p0 = (radiusMax * size) * getPosByAngle(rotation); // Outer point, rotated by `rotation`
- vec3 p1 = (radiusMin * size) * getPosByAngle(starangle + rotation); // Inner point, also rotated
+ // scale from center
+ uv = uv * 0.5 + 0.5;
- // Calculate the position of the current fragment relative to the star's center
- vec2 curPosuv = (uv - center); // Center UV coordinates, then scale to fit the star size
- float curRadius = length(curPosuv); // Radius from center, no need to scale further
- float curPosAngle = atan(curPosuv.y, curPosuv.x) - rotation; // Calculate angle and adjust by `rotation`
+ return uv;
+}
- // Determine the fractional position within the current star segment
- float a = fract(curPosAngle / starangle); // Fractional angle position within one segment
- if (a >= 0.5)
- a = 1.0 - a; // Ensure we are within the first half of the segment (symmetry)
-
- // Calculate the current point on the star segment, applying rotation
- a = a * starangle; // Actual angle for this position on the segment
- vec3 curPos = curRadius * getPosByAngle(a + rotation); // Final position, rotated
-
- // Calculate directions for edge detection using cross product
- vec3 dir0 = p1 - p0; // Vector from outer to inner point
- vec3 dir1 = curPos - p0; // Vector from outer point to current position
-
- float crossZ = dir0.x * dir1.y - dir0.y * dir1.x;
-
- float result = remap(
- crossZ,
- 0.0,0.03,//0.0275,
- 0.0,1.0 //hardness [1.0,100]
+//rotates the UV
+//needs to use this once since it rotates around the middle (i.e. 0.5)
+vec2 rotateUV(vec2 uv, float rotation)
+{
+ float mid = 0.5;
+ return vec2(
+ cos(rotation) * (uv.x - mid) + sin(rotation) * (uv.y - mid) + mid,
+ cos(rotation) * (uv.y - mid) - sin(rotation) * (uv.x - mid) + mid
);
-
- //brightness
- result = result * 7.0;
- result = clamp(result,0.0,1.0);
- result = easeInSine(result);
-
- return result;
+}
+
+//this returns the Spark
+float getSpark(vec2 uv, vec2 center, float brightness, float size, float rotation)
+{
+ brightness = clamp(brightness,0.001,1.0);
+ size = clamp(size,0.001,1.0);
+ float bn = mix(0.0,0.07,brightness); //recalculate size
+
+ uv = (uv + vec2(0.5)) ;
+ uv = (uv - center) ;//Center UV coordinates, then scale to fit the star size
+ uv = scaleUV(uv, vec2(1.0 - size));
+ uv = rotateUV(uv, rotation); //rotate the UV
+
+ //this is basically the brightness
+ float p = mix(-1.0,1000.0,easeInExpo(bn));
+
+ float m = mix(
+ 0.0,
+ 1.0,
+ clamp(
+ pow(abs(uv.x-0.5)*2.0,p) + pow(abs(uv.y-0.5)*2.0,p),0.0,1.0
+ )
+ );
+
+
+ float mask = easeInSine(1.0 - (m - bn)) - 0.004 ;
+ mask = clamp(mask,0.0,1.0);
+
+ return mask;
+
}
+//returns the star's color
vec4 getStarColor(float v, float alpha) {
// Clamp v to ensure it's in [0.0, 1.0]
v = clamp(v, 0.0, 1.0);
@@ -201,8 +212,8 @@ vec4 getStarColor(float v, float alpha) {
return vec4(0.0, 0.0, 0.0, 1.0);
}
-float zeroStartEnd(float t, float max_size, float power)
-{
+
+
// 1| __________
// | / \
// | / \
@@ -214,11 +225,11 @@ graph above ... where t is close to 0, or 1 the result will fade to zero
i.e. this is just the function of power(x,p) shifted
where x is time, and p is 2.0,4.0,8.0,10.0 ... or any positive even number
*/
-
+float zeroStartEnd(float t, float max_size, float power)
+{
float s = -1.0 * pow((t-0.5)/(0.5),power)+1.0;
s = clamp(s,0.0,1.0) * max_size;
return s;
-
}
//this gives us the jerky 8bit growth effect.
@@ -264,48 +275,50 @@ float eightBitScale(float progress)
return scale;
}
-//use to scale the window
-vec2 scaleUV(vec2 uv, vec2 scale)
+
+//gets all the sparks
+vec4 getSparks(float progress)
{
- // Put texture coordinate origin to center of window.
- uv = uv * 2.0 - 1.0;
+ //the UV for this function
+ float aspect = uSize.x / uSize.y;
+ vec2 uv = iTexCoord.st * vec2(aspect,1.0);
- //scale
- uv /= mix(vec2(1.0,1.0), vec2(0.0,0.0), scale);
-
- // scale from center
- uv = uv * 0.5 + 0.5;
-
- return uv;
-}
-
-
-
-vec4 get4pStars(vec2 starUV, float progress)
-{
//this will be the result to return
vec4 result = vec4(0.0);
- vec2 h = vec2(0.0);
+ // 0 at the edges
+ float xEdge = -1.0 * pow((uv.x-(aspect*0.5))/(aspect*0.5),8.0)+1.0;
+ xEdge = clamp(xEdge,0.0,1.0);
+
+ //declare some variables before the loop
+ vec2 h = vec2(0.0);
float y = 0.0;
+ float x = 0.0;
- for (float x = 0.0; x < u4PStars; ++x)
+ //loop for each spart
+ for (float xusp = 0.0; xusp < uSparkCount; ++xusp)
{
- h = hash21(x);
- y = mix( 0.0 - h.y , 1.0+(1.0-h.y) , (1.0 - progress));
+ //calculate some variables
+ h = hash21(xusp + uSeed.x);
+ y = mix( 0.0 - h.y , 1.0+(1.0-h.y) , progress);
+ y = clamp(y,0.0,1.0);
- float a4ps = getStarWithFade(
- starUV,
- vec2( sin(h.x * 6.28 ) * 0.66, y), //position (x, y)
- 4.0, //nPoints
- 0.33, //radiusRatio
- zeroStartEnd(y,0.1 ,4.0), //Size
- progress * 6.28 * float(u4PSRotation) //rotation
+ x = 0.66 * sin(h.x * 6.28) ;
+ x += 0.5 * aspect;
+
+ //here we get the mask for the spark
+ float a4ps = getSpark(
+ uv,
+ vec2( x , y), //position (x, y)
+ zeroStartEnd(y,1.0 ,4.0) * xEdge ,//Brightness
+ zeroStartEnd(y,0.5 ,4.0) * xEdge,//Size
+ progress * 6.28 * float(uSparkRotation) //rotation
);
+ //set it to the results
result = alphaOver(
result,
- vec4(u4PSColor.r,u4PSColor.g,u4PSColor.b,u4PSColor.a * a4ps)
+ vec4(uSparkColor.r,uSparkColor.g,uSparkColor.b,uSparkColor.a * a4ps)
);
}
@@ -313,17 +326,24 @@ vec4 get4pStars(vec2 starUV, float progress)
return result;
}
+//gets the Rays
vec4 getRays(float progress)
{
+ //create the UV for it
vec2 rayUV = iTexCoord.st;
rayUV *= vec2(10.0,0.5);
rayUV.y += progress * -1.0;
+ rayUV.x += uSeed.y;
+ //gets the ray
float ray = simplex2D(rayUV);
+ //0 around the edges
ray *= zeroStartEnd(iTexCoord.t,1.0,8.0);
+ ray *= zeroStartEnd(iTexCoord.s,1.0,8.0);
+ // 0 at the begining and end of the animation
ray *= zeroStartEnd(progress,1.0,8.0);
-
+ //adjust the numbers and clamp
ray = remap(
ray * 1.10,
0.0,1.0,
@@ -331,11 +351,13 @@ vec4 getRays(float progress)
);
ray = clamp(ray,0.0,1.0);
+ //return
return vec4(uRaysColor.r,uRaysColor.g,uRaysColor.b,uRaysColor.a * ray);
}
-vec4 get5PStars(vec2 starUV, float aspect, float progress, float oColorAlpha)
+//returns the stars
+vec4 getStars(vec2 starUV, float aspect, float progress, float oColorAlpha)
{
//this will be the result to return
vec4 result = vec4(0.0);
@@ -344,19 +366,19 @@ vec4 get5PStars(vec2 starUV, float aspect, float progress, float oColorAlpha)
float y = 0.0;
//for each ring
- for (float r = 0.0; r < uRings; ++r)
+ for (float r = 0.0; r < uRingCount; ++r)
{
- float spread = r*(1.0/uRings);
+ float spread = r*(1.0/uRingCount);
y = mix( 0.0 - spread , 1.0+(1.0-spread) , 1.0 - progress);
y = clamp(y,0.00001,0.99999);
//each star in each ring
- for (float s = 0.0; s < uStarPerRing; ++s)
+ for (float s = 0.0; s < uStarCount; ++s)
{
float a5ps = getStar(
starUV,
- vec2( sin(progress * uRingRotation * 6.28 + (s*(6.28/uStarPerRing))) * aspect * 0.33 , y), //position (x, y)
+ vec2( sin(progress * uRingRotation * 6.28 + (s*(6.28/uStarCount))) * aspect * 0.33 , y), //position (x, y)
5.0, //nPoints
0.5, //radiusRatio
zeroStartEnd(y,0.1,2.0), //Size
@@ -365,7 +387,7 @@ vec4 get5PStars(vec2 starUV, float aspect, float progress, float oColorAlpha)
a5ps = clamp(a5ps,0.0,1.0);
// //put the star in back or the front of the window
- float depth = cos(progress * uRingRotation * 6.28 + (s*(6.28/uStarPerRing)) );
+ float depth = cos(progress * uRingRotation * 6.28 + (s*(6.28/uStarCount)) );
if (depth < 0.0)
{
result = alphaOver(result,getStarColor(y,a5ps));
@@ -395,55 +417,48 @@ void main() {
// Initialize the output color to fully transparent black
vec4 oColor = vec4(0.0, 0.0, 0.0, 0.0);
- // Check if the 8-bit style is enabled
- if (u8BitStyle)
+
+ //get scales
+ float scale8bit = eightBitScale(progress);
+ vec2 scaleV2 = vec2(easeInOutSine(progress), easeInQuad(progress));
+
+ vec2 fscale = mix(vec2(scale8bit),scaleV2,uScaleStyle);
+
+ // Fetch the color based on the scaled texture coordinates
+ oColor = getInputColor(
+ scaleUV(iTexCoord.st, fscale)
+ );
+
+ // Store the alpha value of the fetched color for later use
+ float oColorAlpha = oColor.a;
+
+ // Calculate the aspect ratio of the render area
+ float aspect = uSize.x / uSize.y;
+
+ // Transform UV coordinates for star effects
+ // starUV.x [-0.5 , 0.5]
+ // starUV.y [1.0 , 0.0]
+ vec2 starUV = vec2(iTexCoord.s - 0.5, 1.0 - iTexCoord.t) * vec2(aspect, 1.0);
+
+ // If four-point stars are enabled, overlay them on the current color
+ if (uSparkCount > 0.0)
{
- // Scale UV coordinates using a custom 8-bit scaling function
- float scale8bit = eightBitScale(progress);
-
- // Fetch the color based on the scaled texture coordinates
- oColor = getInputColor(
- scaleUV(iTexCoord.st, vec2(scale8bit, scale8bit))
- );
+ oColor = alphaOver(oColor, getSparks(progress));
}
- else
+
+ // If rays are enabled, overlay them on the current color
+ if (uRaysColor.a > 0.0)
{
- // Non-8-bit style: Calculate scaling factors using easing functions
- vec2 scaleV2 = vec2(easeInOutSine(progress), easeInQuad(progress));
-
- // Fetch the color based on the scaled texture coordinates
- oColor = getInputColor(
- scaleUV(iTexCoord.st, scaleV2)
- );
-
- // Store the alpha value of the fetched color for later use
- float oColorAlpha = oColor.a;
-
- // Calculate the aspect ratio of the render area
- float aspect = uSize.x / uSize.y;
-
- // Transform UV coordinates for star effects
- vec2 starUV = vec2(iTexCoord.s - 0.5, 1.0 - iTexCoord.t) * vec2(aspect, 1.0);
-
- // If four-point stars are enabled, overlay them on the current color
- if (uEnable4PStars)
- {
- oColor = alphaOver(oColor, get4pStars(starUV, progress));
- }
-
- // If rays are enabled, overlay them on the current color
- if (uEnableRays)
- {
- oColor = alphaOver(oColor, getRays(progress));
- }
-
- // If five-point stars are enabled, overlay them using stored alpha
- if (uEnable5pStars)
- {
- oColor = alphaOver(oColor, get5PStars(starUV, aspect, progress, oColorAlpha));
- }
+ oColor = alphaOver(oColor, getRays(progress));
}
+ // If five-point stars are enabled, overlay them using stored alpha
+ if (uRingCount > 0.0 && uStarCount > 0.0)
+ {
+ oColor = alphaOver(oColor, getStars(starUV, aspect, progress, oColorAlpha));
+ }
+
+
// Set the final output color to the computed value
setOutputColor(oColor);
diff --git a/resources/ui/adw/mushroom.ui b/resources/ui/adw/mushroom.ui
index 4897a8b..b348ca4 100644
--- a/resources/ui/adw/mushroom.ui
+++ b/resources/ui/adw/mushroom.ui
@@ -13,60 +13,52 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
+
-
- 8Bit Style
- If ON an old 8Bit Style will be used
-
- mushroom-8bit-enable
+
+ Color Presets
+ mushroom-star-color-preset-button
+
-
+
-
-
-
-
- edit-clear-symbolic
- center
- Reset to Default Value
+ Choose a Preset
@@ -74,23 +66,35 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
-
+
-
- Show 4Point Stars (Sparks)
-
- mushroom-4pstars-enable
+
+ Scale Style
+ 8Bit --- Smooth
+
-
+
center
+ 1
+ 2
+ left
+ 300
+
+
+
+ 1.0
+ 0.0
+ 0.1
+ 0.25
+
+
-
+
-
- edit-clear-symbolic
+
+ edit-clear-symbolic
center
Reset to Default Value
+
+
+
+
+
+
+
+
+
+ Spark Rotation
+
+
+
+ center
+ 1
+ 2
+ left
+ 300
+
+
+
+ 3.0
+ -3.0
+ 0.5
+ 0.25
+
+
+
+
+
+
+
+ edit-clear-symbolic
center
Reset to Default Value
-
- 1
- 1
+
+ 1
+ 1
center
-
+
-
- edit-clear-symbolic
- center
- Reset to Default Value
-
-
-
-
-
-
-
-
-
-
- Show Rays
-
- mushroom-rays-enable
-
-
- center
-
-
-
-
-
- edit-clear-symbolic
+
+ edit-clear-symbolic
center
Reset to Default Value
- 1
- 1
+ 1
+ 1
center
-
+
- edit-clear-symbolic
- center
- Reset to Default Value
-
-
-
-
-
-
-
-
-
-
- Show Star Rings
-
- mushroom-5pstars-enable
-
-
- center
-
-
-
-
-
- edit-clear-symbolic
+ edit-clear-symbolic
center
Reset to Default Value
-
-
-
-
-
-
+
Star Gradient
-
+
-
+
- 1
- 1
+ 1
+ 1
center
@@ -448,10 +419,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
+
- edit-clear-symbolic
+ edit-clear-symbolic
center
Reset to Default Value