From 247f5722181b2d07474a886ce73cd150094b9040 Mon Sep 17 00:00:00 2001 From: David Gwilliam Date: Sat, 21 Mar 2026 19:27:06 -0700 Subject: [PATCH] fix: Bug fixes and improvements - fix(demo-lfo-effects): Fix math.sin() usage (was angle.__sin__()) - feat(pipeline): Add set_effect_intensity() method for runtime effect control - Allows changing effect intensity during pipeline execution - Returns False if effect not found or intensity out of range - Used by LFO modulation demo The demo-lfo-effects.py script now works correctly with proper math.sin() usage and the new set_effect_intensity() method provides a clean API for runtime effect intensity control. --- engine/pipeline/controller.py | 29 +++++++++++++++++++++++++++++ scripts/demo-lfo-effects.py | 3 ++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/engine/pipeline/controller.py b/engine/pipeline/controller.py index 62eeb49..7a0079b 100644 --- a/engine/pipeline/controller.py +++ b/engine/pipeline/controller.py @@ -984,6 +984,35 @@ class Pipeline: """Get historical frame times for sparklines/charts.""" return [f.total_ms for f in self._frame_metrics] + def set_effect_intensity(self, effect_name: str, intensity: float) -> bool: + """Set the intensity of an effect in the pipeline. + + Args: + effect_name: Name of the effect to modify + intensity: New intensity value (0.0 to 1.0) + + Returns: + True if successful, False if effect not found or not an effect stage + """ + if not 0.0 <= intensity <= 1.0: + return False + + stage = self._stages.get(effect_name) + if not stage: + return False + + # Check if this is an EffectPluginStage + from engine.pipeline.adapters.effect_plugin import EffectPluginStage + + if isinstance(stage, EffectPluginStage): + # Access the underlying effect plugin + effect = stage._effect + if hasattr(effect, "config"): + effect.config.intensity = intensity + return True + + return False + class PipelineRunner: """High-level pipeline runner with animation support.""" diff --git a/scripts/demo-lfo-effects.py b/scripts/demo-lfo-effects.py index e4be04b..9b3fc91 100644 --- a/scripts/demo-lfo-effects.py +++ b/scripts/demo-lfo-effects.py @@ -14,6 +14,7 @@ Effects modulated: The LFO uses a sine wave to oscillate intensity between 0.0 and 1.0. """ +import math import sys import time from dataclasses import dataclass @@ -64,7 +65,7 @@ class LFOEffectDemo: angle = ( (elapsed * effect_cfg.frequency + effect_cfg.phase_offset) * 2 * 3.14159 ) - lfo_value = 0.5 + 0.5 * (angle.__sin__()) + lfo_value = 0.5 + 0.5 * math.sin(angle) # Scale to intensity range intensity = effect_cfg.min_intensity + lfo_value * (