diff --git a/src/frontend/gui/GUI.h b/src/frontend/gui/GUI.h index 33e57a52..a519d870 100644 --- a/src/frontend/gui/GUI.h +++ b/src/frontend/gui/GUI.h @@ -51,7 +51,7 @@ namespace gui { class Container; class PagesControl; - /** The main UI controller */ + /// @brief The main UI controller class GUI { std::shared_ptr container; std::shared_ptr hover = nullptr; @@ -67,55 +67,58 @@ namespace gui { GUI(); ~GUI(); - /** Get the main menu (PagesControl) node */ + /// @brief Get the main menu (PagesControl) node std::shared_ptr getMenu(); - /** Get current focused node - * @return focused node or nullptr */ + /// @brief Get current focused node + /// @return focused node or nullptr std::shared_ptr getFocused() const; - /** Check if all user input is caught by some element like TextBox */ + /// @brief Check if all user input is caught by some element like TextBox bool isFocusCaught() const; - /** Main input handling and logic update method - * @param delta delta time */ + /// @brief Main input handling and logic update method + /// @param delta delta time void act(float delta); - /** Draw all visible elements on main container - * @param pctx parent graphics context - * @param assets active assets storage */ + /// @brief Draw all visible elements on main container + /// @param pctx parent graphics context + /// @param assets active assets storage void draw(const GfxContext* pctx, Assets* assets); - /** Add node to the main container */ + /// @brief Add element to the main container + /// @param node UI element void add(std::shared_ptr node); - /** Remove node from the main container */ + /// @brief Add element to the main container + /// @param node UI element + /// @param coord element position within the main container + void add(std::shared_ptr node, glm::vec2 coord); + + /// @brief Remove node from the main container void remove(std::shared_ptr node) noexcept; - /** Store node in the GUI nodes dictionary - * (does not add node to the main container) - * @param name node key - * @param node target node - */ + /// @brief Store node in the GUI nodes dictionary + /// (does not add node to the main container) + /// @param name node key + /// @param node target node void store(std::string name, std::shared_ptr node); - /** Get node from the GUI nodes dictionary - * @param name node key - * @return stored node or nullptr - */ + /// @brief Get node from the GUI nodes dictionary + /// @param name node key + /// @return stored node or nullptr std::shared_ptr get(std::string name) noexcept; - /** Remove node from the GUI nodes dictionary - * @param name node key - */ + /// @brief Remove node from the GUI nodes dictionary + /// @param name node key void remove(std::string name) noexcept; - /** Set node as focused - * @param node new focused node or nullptr to remove focus - */ + /// @brief Set node as focused + /// @param node new focused node or nullptr to remove focus void setFocus(std::shared_ptr node); - /** Get the main container */ + /// @brief Get the main container + /// @deprecated std::shared_ptr getContainer() const; void postRunnable(runnable callback); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 63f27b5e..48847ea1 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -59,6 +59,43 @@ extern std::shared_ptr create_debug_panel( Player* player ); +class DeltaGrapher : public gui::UINode { + std::unique_ptr points; + float multiplier; + int index = 0; + int dmwidth; + int dmheight; +public: + DeltaGrapher(uint width, uint height, float multiplier) + : gui::UINode(glm::vec2(width, height)), + multiplier(multiplier), + dmwidth(width), + dmheight(height) + { + points = std::make_unique(width); + } + + void act(float delta) override { + index = index + 1 % dmwidth; + int value = static_cast(delta * multiplier); + points[index % dmwidth] = std::min(value, dmheight); + } + + void draw(const GfxContext* pctx, Assets* assets) override { + glm::vec2 pos = calcPos(); + auto batch = pctx->getBatch2D(); + batch->texture(nullptr); + batch->lineWidth(1); + for (int i = index+1; i < index+dmwidth; i++) { + int j = i % dmwidth; + batch->line( + pos.x + i - index, pos.y + size.y - points[j], + pos.x + i - index, pos.y + size.y, 1.0f, 1.0f, 1.0f, 0.2f + ); + } + } +}; + HudElement::HudElement( hud_element_mode mode, UiDocument* document, @@ -70,6 +107,7 @@ HudElement::HudElement( void HudElement::update(bool pause, bool inventoryOpen, bool debugMode) { if (debug && !debugMode) { node->setVisible(false); + return; } switch (mode) { case hud_element_mode::permanent: @@ -189,6 +227,13 @@ Hud::Hud(Engine* engine, LevelFrontend* frontend, Player* player) gui->add(debugPanel); gui->add(contentAccessPanel); gui->add(grabbedItemView); + + auto dgrapher = std::make_shared(350, 250, 2000); + dgrapher->setPositionFunc([=]() { + glm::vec2 size = dgrapher->getSize(); + return glm::vec2(Window::width-size.x, Window::height-size.y); + }); + add(HudElement(hud_element_mode::permanent, nullptr, dgrapher, true)); } Hud::~Hud() { @@ -428,11 +473,6 @@ void Hud::remove(std::shared_ptr node) { cleanup(); } -class DeltaGrapher : gui::UINode { - -public: -}; - void Hud::draw(const GfxContext& ctx){ const Viewport& viewport = ctx.getViewport(); const uint width = viewport.getWidth(); @@ -465,26 +505,6 @@ void Hud::draw(const GfxContext& ctx){ batch->flush(); } - // Delta-time visualizer - if (player->debug) { - batch->texture(nullptr); - const int dmwidth = 256; - const float dmscale = 4000.0f; - static float deltameter[dmwidth]{}; - static int index = 0; - index = index + 1 % dmwidth; - float delta = static_cast(engine->getDelta()); - deltameter[index%dmwidth] = glm::min(0.2f, delta)*dmscale; - batch->lineWidth(1); - for (int i = index+1; i < index+dmwidth; i++) { - int j = i % dmwidth; - batch->line( - width-dmwidth+i-index, height-deltameter[j], - width-dmwidth+i-index, height, 1.0f, 1.0f, 1.0f, 0.2f - ); - } - } - if (inventoryOpen) { float caWidth = inventoryView ? contentAccess->getSize().x : 0.0f; contentAccessPanel->setPos(glm::vec2(width-caWidth, 0));