from engine.effects.performance import get_monitor from engine.effects.types import EffectConfig, EffectContext, EffectPlugin class HudEffect(EffectPlugin): name = "hud" config = EffectConfig(enabled=True, intensity=1.0) def process(self, buf: list[str], ctx: EffectContext) -> list[str]: result = list(buf) monitor = get_monitor() fps = 0.0 frame_time = 0.0 if monitor: stats = monitor.get_stats() if stats and "pipeline" in stats: frame_time = stats["pipeline"].get("avg_ms", 0.0) frame_count = stats.get("frame_count", 0) if frame_count > 0 and frame_time > 0: fps = 1000.0 / frame_time w = ctx.terminal_width h = ctx.terminal_height effect_name = self.config.params.get("display_effect", "none") effect_intensity = self.config.params.get("display_intensity", 0.0) hud_lines = [] hud_lines.append( f"\033[1;1H\033[38;5;46mMAINLINE DEMO\033[0m \033[38;5;245m|\033[0m \033[38;5;39mFPS: {fps:.1f}\033[0m \033[38;5;245m|\033[0m \033[38;5;208m{frame_time:.1f}ms\033[0m" ) bar_width = 20 filled = int(bar_width * effect_intensity) bar = ( "\033[38;5;82m" + "█" * filled + "\033[38;5;240m" + "░" * (bar_width - filled) + "\033[0m" ) hud_lines.append( f"\033[2;1H\033[38;5;45mEFFECT:\033[0m \033[1;38;5;227m{effect_name:12s}\033[0m \033[38;5;245m|\033[0m {bar} \033[38;5;245m|\033[0m \033[38;5;219m{effect_intensity * 100:.0f}%\033[0m" ) from engine.effects import get_effect_chain chain = get_effect_chain() order = chain.get_order() pipeline_str = ",".join(order) if order else "(none)" hud_lines.append(f"\033[3;1H\033[38;5;44mPIPELINE:\033[0m {pipeline_str}") for i, line in enumerate(hud_lines): if i < len(result): result[i] = line + result[i][len(line) :] else: result.append(line) return result def configure(self, config: EffectConfig) -> None: self.config = config