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: fps = stats.fps frame_time = stats.avg_frame_time_ms 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