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;
}
}