#pragma once #include #include #include #include #include #include "utils/defaults.hpp" class Text; // Overlay de debug amb tres estats (OFF / TOP / BOTTOM). Mostra una barra // d'info dividida en segments independents (fps, driver, shader, temps) que // apareixen i desapareixen suaument. No llig cap configuració; el caller // (Director a init, GameScene a update) injecta cada frame l'estat desitjat // via Frame. class RenderInfo { public: static auto get() -> RenderInfo&; RenderInfo(const RenderInfo&) = delete; RenderInfo(RenderInfo&&) = delete; auto operator=(const RenderInfo&) -> RenderInfo& = delete; auto operator=(RenderInfo&&) -> RenderInfo& = delete; // Estat extern que dirigeix què ha de mostrar RenderInfo. La posició // determina si la barra entra per dalt o per baix (o s'amaga). El // shader_preset ja ha d'estar pre-seleccionat (crtpi/postfx) pel caller. struct Frame { Defaults::RenderInfoPosition target_position{Defaults::RenderInfoPosition::OFF}; bool show_time{false}; bool shader_enabled{false}; std::string shader_name; std::string shader_preset; Uint8 text_color{0}; Uint8 shadow_color{0}; }; // Injecta la font compartida a init(). La resta de l'estat visual ve // pel Frame a cada frame, així que RenderInfo no depèn de cap recurs // global. void init(const Frame& initial, std::shared_ptr text); void update(int delta_ms, const Frame& frame); void render(); static constexpr int HEIGHT = 10; static constexpr float SLIDE_SPEED = 5.0F; // posició global (1/s) static constexpr float SEG_SPEED = 6.0F; // segments individuals (1/s) private: static constexpr int SEGMENT_COUNT = 4; // fps · driver · shader · temps struct Segment { std::string text; float anim{0.0F}; // 0 = fora, 1 = dins bool visible{false}; // objectiu cap al que tendeix anim bool mono_digits{false}; // true només al segment de temps }; RenderInfo() = default; ~RenderInfo(); void refreshSegments(); [[nodiscard]] auto segmentWidth(const Segment& seg, int digit_cell_w) const -> int; std::shared_ptr text_; Defaults::RenderInfoPosition visible_pos_{Defaults::RenderInfoPosition::OFF}; float info_anim_{0.0F}; // 0..1, suavitzat amb outQuad al render std::array segments_{}; int elapsed_ms_{0}; Frame current_{}; };