diff options
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/shader_uniforms.js')
| -rw-r--r-- | raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/shader_uniforms.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/shader_uniforms.js b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/shader_uniforms.js new file mode 100644 index 0000000..a82b261 --- /dev/null +++ b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/shader_uniforms.js @@ -0,0 +1,61 @@ +import GObject from 'gi://GObject'; + +const INTEGRAL_UNIFORMS = new Set([ + 'corners_bottom', + 'corners_top', + 'divider', + 'dir', + 'downsampling_mode', + 'factor', + 'iterations', + 'mode', + 'operation', + 'prefer_closer_pixels', + 'straight_corners', + 'use_base_pixel', +]); + +export function set_uniform(effect, name, value) { + if (!effect._bms_uniforms) + effect._bms_uniforms = new Map(); + + effect._bms_uniforms.set(name, value); + effect._bms_uniforms_dirty = true; + effect.queue_repaint(); +} + +export function mark_dirty(effect) { + if (effect._bms_uniforms) + effect._bms_uniforms_dirty = true; +} + +export function upload_uniforms(effect) { + if (!effect._bms_uniforms_dirty || !effect._bms_uniforms || !effect.get_actor()) + return; + + for (const [name, value] of effect._bms_uniforms) { + try { + effect.set_uniform_value(name, get_shader_value(name, value)); + } catch (e) { + if (!effect._bms_uniform_warning_shown) { + effect._bms_uniform_warning_shown = true; + console.warn(`[Blur my Shell] shader uniform upload failed for ${effect.constructor.name}`, e); + } + } + } + + effect._bms_uniforms_dirty = false; +} + +function get_shader_value(name, value) { + if (typeof value !== 'number') + return value; + + if (INTEGRAL_UNIFORMS.has(name)) + return Math.trunc(value); + + const float_value = new GObject.Value(); + float_value.init(GObject.TYPE_FLOAT); + float_value.set_float(value); + return float_value; +} |