diff --git a/resources/shaders/fire.frag b/resources/shaders/fire.frag
index 06a6957..218334b 100644
--- a/resources/shaders/fire.frag
+++ b/resources/shaders/fire.frag
@@ -23,6 +23,10 @@ uniform vec4 uGradient3;
uniform vec4 uGradient4;
uniform vec4 uGradient5;
+//new
+uniform bool uRandomColor;
+uniform float uSeed;
+
// These may be configurable in the future.
const float EDGE_FADE = 70.0;
const float FADE_WIDTH = 0.1;
@@ -58,6 +62,36 @@ vec4 getFireColor(float v) {
return colors[4];
}
+vec4 getFireColorV2(float v, vec4 c0, vec4 c1, vec4 c2, vec4 c3, vec4 c4)
+{
+ float steps[5];
+ steps[0] = 0.0;
+ steps[1] = 0.2;
+ steps[2] = 0.35;
+ steps[3] = 0.5;
+ steps[4] = 0.8;
+
+ vec4 colors[5];
+ colors[0] = c0;
+ colors[1] = c1;
+ colors[2] = c2;
+ colors[3] = c3;
+ colors[4] = c4;
+
+ if (v < steps[0]) {
+ return colors[0];
+ }
+
+ for (int i = 0; i < 4; ++i) {
+ if (v <= steps[i + 1]) {
+ return mix(colors[i], colors[i + 1],
+ vec4(v - steps[i]) / (steps[i + 1] - steps[i]));
+ }
+ }
+
+ return colors[4];
+}
+
// This method requires the uniforms from standardUniforms() to be available.
// It returns two values: The first is an alpha value which can be used for the window
// texture. This gradually dissolves the window from top to bottom. The second can be used
@@ -114,7 +148,28 @@ void main() {
noise *= effectMask.y;
// Map noise value to color.
- vec4 fire = getFireColor(noise);
+ vec4 fire = vec4(0.0);
+
+ if (uRandomColor)
+ {
+ vec3 baseColor0 = offsetHue(vec3(1.0,0.0,0.0), hash11(uSeed));
+ vec3 baseColor1 = offsetHue(baseColor0, 0.1);
+ vec3 baseColor2 = offsetHue(baseColor1, 0.1);
+
+ //hardcoding alpha values
+ vec4 c0 = vec4(baseColor0,0.0);
+ vec4 c1 = vec4(baseColor0,0.3);
+ vec4 c2 = vec4(baseColor1,0.6);
+ vec4 c3 = vec4(baseColor1,0.9);
+ vec4 c4 = vec4(baseColor2,1.0);
+
+
+ fire = getFireColorV2(noise,c0,c1,c2,c3,c4);
+ }
+ else
+ {
+ fire = getFireColor(noise);
+ }
// Get the window texture.
vec4 oColor = getInputColor(iTexCoord.st);
@@ -131,4 +186,4 @@ void main() {
// oColor = vec4(vec3(effectMask.y), 1);
setOutputColor(oColor);
-}
\ No newline at end of file
+}
diff --git a/resources/ui/adw/fire.ui b/resources/ui/adw/fire.ui
index 08d7e81..038f585 100644
--- a/resources/ui/adw/fire.ui
+++ b/resources/ui/adw/fire.ui
@@ -147,6 +147,28 @@ SPDX-License-Identifier: GPL-3.0-or-later
+
+
+
+
Gradient
@@ -206,4 +228,4 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
\ No newline at end of file
+
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
index 47cebb9..e6b87a4 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
@@ -242,6 +242,12 @@ SPDX-License-Identifier: CC0-1.0
The size of the fire.
+
+ false
+ use a random color for the fire
+ use a random color of the fire
+
+
false
Fire 3D Noise
@@ -1110,4 +1116,4 @@ SPDX-License-Identifier: CC0-1.0
-
\ No newline at end of file
+
diff --git a/src/Shader.js b/src/Shader.js
index fa5ba48..9719884 100644
--- a/src/Shader.js
+++ b/src/Shader.js
@@ -61,7 +61,7 @@ export var Shader = GObject.registerClass({
}
},
- class Shader extends Shell.GLSLEffect {
+ class Shader extends Shell.GLSLEffect{
// --------------------------------------------
// The constructor automagically loads the shader's source code (in
// vfunc_build_pipeline()) from the resource file resources/shaders/.glsl
diff --git a/src/ShaderFactory.js b/src/ShaderFactory.js
index 6056262..06fbea7 100644
--- a/src/ShaderFactory.js
+++ b/src/ShaderFactory.js
@@ -61,7 +61,7 @@ export default class ShaderFactory {
// Only try to register the new type once.
if (GObject.type_from_name(typeName) == null) {
const outerThis = this;
- GObject.registerClass({GTypeName: typeName}, class ShaderImp extends Shader {
+ GObject.registerClass({GTypeName: typeName}, class ShaderImp extends Shader{
// This will actually load the GLSL source code from the resources.
_init() {
super._init(outerThis._nick);
diff --git a/src/effects/Fire.js b/src/effects/Fire.js
index f10e765..d763621 100644
--- a/src/effects/Fire.js
+++ b/src/effects/Fire.js
@@ -12,6 +12,8 @@
// SPDX-FileCopyrightText: Simon Schneegans
// SPDX-License-Identifier: GPL-3.0-or-later
+// modified by Justin Garza
+
'use strict';
import Gio from 'gi://Gio';
@@ -58,6 +60,9 @@ export default class Effect {
shader._uScale = shader.get_uniform_location('uScale');
shader._uMovementSpeed = shader.get_uniform_location('uMovementSpeed');
+ shader._uRandomColor = shader.get_uniform_location('uRandomColor');
+ shader._uSeed = shader.get_uniform_location('uSeed');
+
// And update all uniforms at the start of each animation.
shader.connect('begin-animation', (shader, settings) => {
for (let i = 1; i <= 5; i++) {
@@ -68,6 +73,8 @@ export default class Effect {
// clang-format off
shader.set_uniform_float(shader._u3DNoise, 1, [settings.get_boolean('fire-3d-noise')]);
+ shader.set_uniform_float(shader._uRandomColor, 1, [settings.get_boolean('fire-random-color')]);
+ shader.set_uniform_float(shader._uSeed, 1, [Math.random()]);
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('fire-scale')]);
shader.set_uniform_float(shader._uMovementSpeed, 1, [settings.get_double('fire-movement-speed')]);
// clang-format on
@@ -107,6 +114,7 @@ export default class Effect {
dialog.bindAdjustment('fire-movement-speed');
dialog.bindAdjustment('fire-scale');
dialog.bindSwitch('fire-3d-noise');
+ dialog.bindSwitch('fire-random-color');
dialog.bindColorButton('fire-color-1');
dialog.bindColorButton('fire-color-2');
dialog.bindColorButton('fire-color-3');
@@ -129,6 +137,33 @@ export default class Effect {
// Initialize the fire-preset dropdown.
Effect._createFirePresets(dialog);
}
+
+ // enables and disables the color buttons
+ function EnableDisableColorButtons(dialog, state) {
+
+ for (let i = 1; i <= 5; i++) {
+ dialog.getBuilder().get_object('fire-color-' + i).set_sensitive(!state);
+ }
+ }
+
+ const switchWidget = dialog.getBuilder().get_object('fire-random-color');
+ if (switchWidget) {
+ // Connect to the "state-set" signal to update preferences dynamically based on
+ // the switch state.
+ switchWidget.connect('state-set', (widget, state) => {
+ EnableDisableColorButtons(dialog,
+ state); // Update sensitivity when the state changes.
+ });
+
+ // Manually call the update function on startup, using the initial state of the
+ // switch.
+ const initialState =
+ switchWidget.get_active(); // Get the current state of the switch.
+ EnableDisableColorButtons(dialog, initialState);
+ } else {
+ // Log an error if the switch widget is not found in the UI.
+ log('Error: \'fire-random-color\' switch widget not found.');
+ }
}
// ---------------------------------------------------------------- API for extension.js