diff --git a/res/scripts/hud.lua b/res/scripts/hud.lua index 8529ef991..3bdb4d634 100644 --- a/res/scripts/hud.lua +++ b/res/scripts/hud.lua @@ -128,11 +128,13 @@ function on_hud_open() hud.default_hand_controller = update_hand local name = "misc/moon" - gui.create_frame(name, name, {128, 128}) + local frame = gui.create_frame(name, name, {128, 128}) + frame:add("") + frame.color = {255, 0, 0, 255} - local document = Document.new(name) - document.root:add("") - document.root.color = {255, 0, 0, 255} + input.add_callback('key:y', function () + gui.set_active_frame(name) + end) end function on_hud_render() diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 8d6ac26c0..5b7cb8fd7 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -234,6 +234,14 @@ menu = _MENU gui.root = _GUI_ROOT gui.main_frame_id = "core:main" +local __gui_create_frame = gui.create_frame +function gui.create_frame(id, output, size) + __gui_create_frame(id, output, size) + + local document = Document.new(id) + return document.root, document +end + do local status, err = pcall(function() local default_styles = toml.parse(file.read( @@ -440,6 +448,8 @@ function __vc_on_hud_open() end elseif hud.is_inventory_open() then hud.close_inventory() + elseif gui.get_active_frame() then + gui.set_active_frame("") else hud.pause() end diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index dfeb1dfb4..acb3edf70 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -240,7 +240,7 @@ void LevelScreen::update(float delta) { auto menu = gui.getMenu(); bool inputLocked = - menu->hasOpenPage() || hud->isInventoryOpen() || gui.isFocusCaught(); + gui.getActiveFrame() || hud->isInventoryOpen() || gui.isFocusCaught(); bool paused = hud->isPause(); if (!paused) { world.updateTimers(delta); diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 73bf73e2c..1efc1e1f8 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -129,7 +129,7 @@ void GUI::actMouse(Frame& frame, float delta, const CursorState& cursor) { doubleClicked = false; doubleClickTimer += delta + mouseDelta * 0.1f; - auto hover = container->getAt(cursor.pos); + auto hover = frame.getAt(cursor.pos); if (this->hover && this->hover != hover) { this->hover->setMouseEnter(false); } @@ -289,8 +289,8 @@ void GUI::draw(const DrawContext& pctx, Assets& assets) { uicamera->setAspectRatio(viewport.x / static_cast(viewport.y)); auto uishader = assets.get("ui"); - uishader->use(); uishader->uniformMatrix("u_projview", uicamera->getProjView()); + uishader->use(); batch2D->begin(); for (auto& [outputTexture, frame] : frames) { diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 9de01404b..17c4fe23f 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "BlocksController.hpp" #include "content/Content.hpp" @@ -28,17 +29,19 @@ #include "window/input.hpp" #include "world/Level.hpp" -const float INTERACTION_RELOAD = 0.160f; -const float STEPS_SPEED = 2.2f; -const float CAM_SHAKE_OFFSET = 0.0075f; -const float CAM_SHAKE_OFFSET_Y = 0.031f; -const float CAM_SHAKE_SPEED = STEPS_SPEED; -const float CAM_SHAKE_DELTA_K = 10.0f; -const float ZOOM_SPEED = 16.0f; -const float CROUCH_ZOOM = 0.9f; -const float RUN_ZOOM = 1.1f; -const float C_ZOOM = 0.1f; -const float CROUCH_SHIFT_Y = -0.2f; +namespace { + const float INTERACTION_RELOAD = 0.160f; + const float STEPS_SPEED = 2.2f; + const float CAM_SHAKE_OFFSET = 0.0075f; + const float CAM_SHAKE_OFFSET_Y = 0.031f; + const float CAM_SHAKE_SPEED = STEPS_SPEED; + const float CAM_SHAKE_DELTA_K = 10.0f; + const float ZOOM_SPEED = 16.0f; + const float CROUCH_ZOOM = 0.9f; + const float RUN_ZOOM = 1.1f; + const float C_ZOOM = 0.1f; + const float CROUCH_SHIFT_Y = -0.2f; +} CameraControl::CameraControl(Player& player, const CameraSettings& settings) : player(player), @@ -249,17 +252,18 @@ void PlayerController::onFootstep(const Hitbox& hitbox) { } void PlayerController::updateFootsteps(float delta) { + const float pi = glm::pi(); auto hitbox = player.getHitbox(); if (hitbox && hitbox->grounded) { const glm::vec3& vel = hitbox->velocity; float f = glm::length(glm::vec2(vel.x, vel.z)); stepsTimer += delta * f * STEPS_SPEED; - if (stepsTimer >= M_PI) { - stepsTimer = fmod(stepsTimer, M_PI); + if (stepsTimer >= pi) { + stepsTimer = fmod(stepsTimer, pi); onFootstep(*hitbox); } } else { - stepsTimer = M_PI; + stepsTimer = pi; } }