diff --git a/resources/shaders/incinerate.frag b/resources/shaders/incinerate.frag
index 18ebb9c..02224a9 100644
--- a/resources/shaders/incinerate.frag
+++ b/resources/shaders/incinerate.frag
@@ -14,7 +14,7 @@
// The content from common.glsl is automatically prepended to each shader effect.
uniform vec2 uSeed;
-// uniform vec3 uColor;
+uniform vec3 uColor;
uniform float uScale;
// uniform float uWidth;
uniform float uTurbulence;
@@ -22,9 +22,10 @@ uniform float uTurbulence;
const float SCORCH_WIDTH = 0.1;
const float BURN_WIDTH = 0.02;
const float SMOKE_WIDTH = 0.6;
+const float FLAME_WIDTH = 0.1;
vec4 getFireColor(float val) {
- return vec4(tritone(val, vec3(0.0), vec3(1.0, 0.8, 0.6), vec3(1.0)), val);
+ return vec4(tritone(val, vec3(0.0), uColor, vec3(1.0)), val);
}
void main() {
@@ -32,8 +33,9 @@ void main() {
float hideThreshold = mix(-SCORCH_WIDTH, 1.0 + SMOKE_WIDTH, uProgress);
vec2 scorchRange = uForOpening ? vec2(hideThreshold - SCORCH_WIDTH, hideThreshold)
: vec2(hideThreshold, hideThreshold + SCORCH_WIDTH);
- vec2 smokeRange = vec2(hideThreshold - SMOKE_WIDTH, hideThreshold);
vec2 burnRange = vec2(hideThreshold - BURN_WIDTH, hideThreshold + BURN_WIDTH);
+ vec2 flameRange = vec2(hideThreshold - FLAME_WIDTH, hideThreshold);
+ vec2 smokeRange = vec2(hideThreshold - SMOKE_WIDTH, hideThreshold);
vec2 uv = cogl_tex_coord_in[0].st / uScale * uSize;
@@ -42,36 +44,51 @@ void main() {
float mask = mix(gradient, noise, 0.15);
+ // Now we retrieve the window color. We add some distortion in the scorch zone.
vec2 distort = vec2(0.0);
- if (!uForOpening && (smokeRange.x < mask && mask < smokeRange.y)) {
- distort.y += pow(1.0 - (mask - smokeRange.x) / SMOKE_WIDTH, 2.0) * 0.1;
- }
-
if ((uForOpening && mask > scorchRange.x) || (!uForOpening && mask <= scorchRange.y)) {
- distort +=
+ distort =
0.5 * vec2(dFdx(mask), dFdy(mask)) * (scorchRange.y - mask) / SCORCH_WIDTH * 5.0;
}
vec4 oColor = getInputColor(cogl_tex_coord_in[0].st + distort);
+ // Hide after buring zone has passed.
if ((uForOpening && mask > smokeRange.y) || (!uForOpening && mask < smokeRange.y)) {
oColor = vec4(0.0);
}
- float smoke =
+ float smokeMask =
smoothstep(0, 1, (mask - smokeRange.x) / SMOKE_WIDTH) * getRelativeEdgeMask(0.1);
- smoke *=
- simplex2DFractal(uv * 0.01 + uSeed - smoke * smoke * vec2(0.0, 0.1 * uDuration));
+
+ float smokeNoise = simplex2DFractal(uv * 0.01 + uSeed -
+ smokeMask * smokeMask * vec2(0.0, 0.1 * uDuration));
+
+ float flameNoise =
+ simplex2DFractal(uv * 0.02 + uSeed - smokeNoise * vec2(0.0, 1.0 * uDuration) -
+ vec2(0.0, uProgress * uDuration));
float emberNoise =
- simplex2DFractal(uv * 0.075 + uSeed - smoke * vec2(0.0, 0.5 * uDuration));
+ simplex2DFractal(uv * 0.075 + uSeed - smokeMask * vec2(0.0, 0.2 * uDuration));
if (smokeRange.x < mask && mask < smokeRange.y) {
- oColor = alphaOver(oColor, vec4(0.5 * vec3(smoke), smoke));
- float embers = clamp(pow(emberNoise + 0.32, 100.0), 0.0, 2.0) * smoke;
- embers += clamp(pow(emberNoise + 0.32, 10.0), 0.0, 2.0) * smoke;
- oColor = alphaOver(oColor, getFireColor(embers));
+ float smoke = smokeMask * smokeNoise;
+ oColor = alphaOver(oColor, vec4(0.5 * vec3(smoke), smoke));
+
+ float embers = clamp(pow(emberNoise + 0.3, 100.0), 0.0, 2.0) * smoke;
+ // embers += clamp(pow(emberNoise + 0.32, 10.0), 0.0, 2.0) * smoke;
+ oColor += getFireColor(embers);
+ }
+
+ if (flameRange.x < mask && mask < flameRange.y) {
+
+ float flameMask =
+ smoothstep(0, 1, (mask - flameRange.x) / FLAME_WIDTH) * getRelativeEdgeMask(0.1);
+
+ float flame = clamp(pow(flameNoise + 0.3, 20.0), 0.0, 2.0) * flameMask;
+ flame += clamp(pow(flameNoise + 0.8, 5.0), 0.0, 2.0) * flameMask * 0.1;
+ oColor += getFireColor(flame);
}
// Add scorch effect.
@@ -85,10 +102,11 @@ void main() {
oColor.rgb = mix(oColor.rgb, mix(oColor.rgb, vec3(0.1, 0.05, 0.02), 0.4), scorch);
}
+ // Add burning edge.
if (burnRange.x < mask && mask < burnRange.y) {
float fireEdge = smoothstep(1, 0, abs(mask - hideThreshold) / BURN_WIDTH) * oColor.a;
- fireEdge = fireEdge * pow(emberNoise + 0.4, 4.0);
- oColor = alphaOver(oColor, getFireColor(fireEdge));
+ fireEdge = fireEdge * pow(flameNoise + 0.4, 4.0);
+ oColor += getFireColor(fireEdge * oColor.a);
}
setOutputColor(oColor);
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
index 4aeb5cc..74891d5 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
@@ -348,7 +348,7 @@
- 3500
+ 1750
Incinerate Animation Time
The time the Incinerate effect takes.
@@ -372,7 +372,7 @@
- "rgb(255, 200, 50)"
+ "rgb(255, 180, 127)"
Incinerate Color
The color of the effect.