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 * (