From 845c765843bc9780d0f3c1be37c93953286530fd Mon Sep 17 00:00:00 2001 From: Justin Garza Date: Sat, 8 Mar 2025 11:45:31 -0500 Subject: [PATCH] resync and updated --- resources/shaders/fire.frag | 59 ++++++++++++++++++- resources/ui/adw/fire.ui | 24 +++++++- ...nsions.burn-my-windows-profile.gschema.xml | 8 ++- src/Shader.js | 2 +- src/ShaderFactory.js | 2 +- src/effects/Fire.js | 35 +++++++++++ 6 files changed, 124 insertions(+), 6 deletions(-) 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 + + + Use Random Color + fire-random-color + + + center + + + + + edit-clear-symbolic + center + Reset to Default Value + + + + + + 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