- Add HUD effect plugin showing FPS, effect name, intensity bar, pipeline - Add pygame window resize handling (VIDEORESIZE event) - Move HUD to end of chain so it renders on top - Fix monitor stats API (returns dict, not object) - Add tests/test_hud.py for HUD effect verification
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
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
|