diff --git a/src/frontend/gui/GUI.cpp b/src/frontend/gui/GUI.cpp index 2173eb45..07f94e84 100644 --- a/src/frontend/gui/GUI.cpp +++ b/src/frontend/gui/GUI.cpp @@ -135,6 +135,10 @@ bool GUI::isFocusCaught() const { return focus && focus->isfocuskeeper(); } +void GUI::addBack(std::shared_ptr panel) { + container->addBack(panel); +} + void GUI::add(shared_ptr panel) { container->add(panel); } diff --git a/src/frontend/gui/GUI.h b/src/frontend/gui/GUI.h index e9b19258..df3cdcff 100644 --- a/src/frontend/gui/GUI.h +++ b/src/frontend/gui/GUI.h @@ -71,6 +71,7 @@ namespace gui { void act(float delta); void draw(Batch2D* batch, Assets* assets); + void addBack(std::shared_ptr panel); void add(std::shared_ptr panel); void remove(std::shared_ptr panel); void store(std::string name, std::shared_ptr node); diff --git a/src/frontend/gui/panels.cpp b/src/frontend/gui/panels.cpp index 2c838aa7..b91f1d84 100644 --- a/src/frontend/gui/panels.cpp +++ b/src/frontend/gui/panels.cpp @@ -22,7 +22,9 @@ shared_ptr Container::getAt(vec2 pos, shared_ptr self) { return nullptr; } if (!isInside(pos)) return nullptr; - for (auto node : nodes) { + + for (int i = nodes.size()-1; i >= 0; i--) { + auto& node = nodes[i]; if (!node->visible()) continue; auto hover = node->getAt(pos, node); @@ -91,6 +93,12 @@ void Container::draw(Batch2D* batch, Assets* assets) { Window::popScissor(); } +void Container::addBack(shared_ptr node) { + nodes.insert(nodes.begin(), node); + node->setParent(this); + refresh(); +} + void Container::add(shared_ptr node) { nodes.push_back(node); node->setParent(this); diff --git a/src/frontend/gui/panels.h b/src/frontend/gui/panels.h index a93773ea..6bc1018c 100644 --- a/src/frontend/gui/panels.h +++ b/src/frontend/gui/panels.h @@ -37,6 +37,7 @@ namespace gui { virtual void drawBackground(Batch2D* batch, Assets* assets) {}; virtual void draw(Batch2D* batch, Assets* assets) override; virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; + virtual void addBack(std::shared_ptr node); virtual void add(std::shared_ptr node); virtual void add(UINode* node); virtual void add(std::shared_ptr node, glm::vec2 coord); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 9564c892..7a05abdd 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -279,6 +279,9 @@ HudRenderer::HudRenderer(Engine* engine, LevelFrontend* frontend) hotbarView = createHotbar(); inventoryView = createInventory(); + darkOverlay = std::make_unique(glm::vec2(4000.0f)); + darkOverlay->color(glm::vec4(0, 0, 0, 0.5f)); + uicamera = new Camera(vec3(), 1); uicamera->perspective = false; uicamera->flipped = true; @@ -286,9 +289,10 @@ HudRenderer::HudRenderer(Engine* engine, LevelFrontend* frontend) createDebugPanel(engine); menu->reset(); + gui->addBack(darkOverlay); + gui->addBack(hotbarView); gui->add(debugPanel); gui->add(contentAccessPanel); - gui->add(hotbarView); gui->add(inventoryView); gui->add(grabbedItemView); } @@ -297,6 +301,7 @@ HudRenderer::~HudRenderer() { gui->remove(grabbedItemView); gui->remove(inventoryView); gui->remove(hotbarView); + gui->remove(darkOverlay); gui->remove(contentAccessPanel); gui->remove(debugPanel); delete uicamera; @@ -368,6 +373,8 @@ void HudRenderer::update(bool visible) { } player->setChosenSlot(slot); } + + darkOverlay->visible(pause); } void HudRenderer::closeInventory() { @@ -376,26 +383,6 @@ void HudRenderer::closeInventory() { grabbed.clear(); } -void HudRenderer::drawOverlay(const GfxContext& ctx) { - if (pause) { - Shader* uishader = assets->getShader("ui"); - uishader->use(); - uishader->uniformMatrix("u_projview", uicamera->getProjView()); - - const Viewport& viewport = ctx.getViewport(); - const uint width = viewport.getWidth(); - const uint height = viewport.getHeight(); - auto batch = ctx.getBatch2D(); - batch->begin(); - - // draw fullscreen dark overlay - batch->texture(nullptr); - batch->color = vec4(0.0f, 0.0f, 0.0f, 0.5f); - batch->rect(0, 0, width, height); - batch->render(); - } -} - void HudRenderer::draw(const GfxContext& ctx){ auto level = frontend->getLevel(); diff --git a/src/frontend/hud.h b/src/frontend/hud.h index 307cbaf8..753bb6ff 100644 --- a/src/frontend/hud.h +++ b/src/frontend/hud.h @@ -42,6 +42,7 @@ class HudRenderer { std::shared_ptr hotbarView; std::shared_ptr inventoryView; std::shared_ptr debugPanel; + std::shared_ptr darkOverlay; std::unique_ptr interaction; std::shared_ptr grabbedItemView; gui::GUI* gui; @@ -57,7 +58,6 @@ public: ~HudRenderer(); void update(bool hudVisible); - void drawOverlay(const GfxContext& context); void draw(const GfxContext& context); void drawDebug(int fps); diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index e90cb5d8..e6bdf360 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -474,6 +474,7 @@ void create_pause_panel(Engine* engine, PagesControl* menu) { panel->add(create_button(L"Continue", vec4(10.0f), vec4(1), [=](GUI*){ menu->reset(); })); + panel->add(guiutil::gotoButton(L"Content", "content", menu)); panel->add(guiutil::gotoButton(L"Settings", "settings", menu)); panel->add(create_button(L"Save and Quit to Menu", vec4(10.f), vec4(1), [=](GUI*){ diff --git a/src/frontend/screens.cpp b/src/frontend/screens.cpp index b1c8ba97..4ce02380 100644 --- a/src/frontend/screens.cpp +++ b/src/frontend/screens.cpp @@ -154,7 +154,6 @@ void LevelScreen::draw(float delta) { worldRenderer->draw(ctx, camera.get(), hudVisible); - hud->drawOverlay(ctx); if (hudVisible) { hud->draw(ctx); if (level->player->debug) {