diff --git a/CHANGELOG.md b/CHANGELOG.md index 845cedc9..d4030492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,96 +1,153 @@ -# 0.25 - 2024.12.01 +# 0.26 - 2025.01.27 -[Documentation](https://github.com/MihailRis/VoxelEngine-Cpp/tree/release-0.25/doc/en/main-page.md) for 0.25 +[Documentation](https://github.com/MihailRis/VoxelEngine-Cpp/tree/release-0.26/doc/en/main-page.md) for 0.26 Table of contents: - [Added](#added) + - [Changes](#changes) - [Functions](#functions) - [Fixes](#fixes) ## Added -- 3dtext -- blockwraps -- network (http requests and sockets) +- headless mode `--headless` +- script execution mode `--headless --script filename` +- test execution mode `--headless --test filename` +- vctest console application - libraries: - - base64 - - gfx.text3d - - gfx.blockwraps - - network + - app + - byteutil +- in-game chat +- text markup: Markdown +- syntax-highlighting: Lua +- http post requests +- `Scripts` menu page for app scripts +- binding `hud.chat` +- user-defined console.submit - events: - - on_replaced - - on_block_replaced - - on_player_tick -- structures 'lowering' property -- add 'hint' property to textbox -- add 'taking' and 'placing' properties to slot and slotsgrid -- add 'scroll-step' property to container -- add 'line-numbers' and 'text-color' to textbox -- modules: - - base:util -- uinode property 'id' -- block.materials table -- block.properties table -- item.properties table -- add version to world info table -- add 'sizeSpread' particles property -- add user properties + - on_chunk_present + - on_chunk_remove + - on_inventory_open + - on_inventory_closed +- [canvas](https://github.com/MihailRis/VoxelEngine-Cpp/pull/444) ui node +- settings: + - `graphics.dense-render` +- block properties: + - `culling` +- particles properties: + - `angle_spread` + - `min_angular_vel`, `max_angular_vel` +- bytearray support in serializers +- ui properties: + - uinode: `cursor` + - textbox: `markup`, `syntax`, `text-color` + - label: `markup` +- base pack: + - add transparent leaves render mode + - add falling leaves particles + - 'states' parameter in base:falling_block + - added/updated sounds +- nameless worlds +- SIGTERM handler +- project: + - clang Windows workflow + - engine tests + +### Changes + +- moved `devtools.console` binding handler to Lua +- move `key:escape` binding handler to Lua +- upgrade dead emitters garbage collection +- reserved player entity ids: `0` - none (example: dead), `-1` - auto (spawns new one) +- input.add_callback("key:name") support and add optional `owner` argument ### Functions -- player.is_infinite_items -- player.set_infinite_items -- player.is_instant_destruction -- player.set_instant_destruction -- player.get_name -- player.set_name -- hud.open -- base64.encode -- base64.decode -- utf8.escape -- string.escape -- textbox:lineAt -- textbox:linePos -- network.get -- network.get_binary -- network.tcp_connect -- network.tcp_open -- network.get_total_upload -- network.get_total_download -- gfx.text3d.show -- gfx.text3d.hide -- gfx.text3d.get_text -- gfx.text3d.set_text -- gfx.text3d.get_pos -- gfx.text3d.set_pos -- gfx.text3d.get_axis_x -- gfx.text3d.set_axis_x -- gfx.text3d.get_axis_y -- gfx.text3d.set_axis_y -- gfx.text3d.set_rotation -- gfx.text3d.update_settings +- app.tick +- app.sleep +- app.sleep_until +- app.new_world +- app.open_world +- app.save_world +- app.close_world +- app.reopen_world +- app.delete_world +- app.config_packs +- app.reconfig_packs +- app.get_setting +- app.set_setting +- app.get_version +- app.get_setting_info +- app.load_content +- app.reset_content +- app.is_content_loaded +- app.quit +- entity:get_player +- start_coroutine +- gui.clear_markup +- gui.escape_markup +- gui.alert +- gui.confirm +- gui.load_document +- console.get +- world.get_chunk_data +- world.set_chunk_data +- world.save_chunk_data +- world.count_chunks +- player.create +- player.delete +- player.is_suspended +- player.set_suspended +- player.is_loaded_chunks +- player.set_loading_chunks +- network.post +- table.shuffle +- table.deep_copy +- math.normalize +- math.round +- byteutil.pack +- byteutil.unpack +- file.name +- file.stem +- file.ext +- file.prefix +- hud.set_allow_pause + +Methods: +- uinode:reposition +- socket:available + +New overloads: +- block.get_X, block.get_Y, block.get_Z +- player.get_rot +- Bytearray:append ## Fixes - -- [fix translucent blocks render](https://github.com/MihailRis/VoxelEngine-Cpp/pull/370) -- [fix blocks selection with semi-transparent blocks](https://github.com/MihailRis/VoxelEngine-Cpp/commit/171cbb48d099032d7e78c51a46c374104f96f0d1) -- [fix: commands repository not reset before world open](https://github.com/MihailRis/VoxelEngine-Cpp/commit/1a00a91b604399f3108aa995422d371e573e650b) -- [mip-mapping related fixes](https://github.com/MihailRis/VoxelEngine-Cpp/commit/d9277e1b31714632bd7f5f601b8362a9e7cb8819) -- [fix disabled slots display](https://github.com/MihailRis/VoxelEngine-Cpp/commit/e8ee3e04b1398a3ada8445591267525304410571) -- [fix attack](https://github.com/MihailRis/VoxelEngine-Cpp/commit/bc17abc8b3ee7ff9027f7e3c375ca0330bb8e7bc) -- [fix: commands repository not reset before world open](https://github.com/MihailRis/VoxelEngine-Cpp/commit/1a00a91b604399f3108aa995422d371e573e650b) -- [fix stdlib.lua](https://github.com/MihailRis/VoxelEngine-Cpp/commit/6ec33ab98c78523eaececf40f113f2323d25a33a) -- [fix file.write_bytes](https://github.com/MihailRis/VoxelEngine-Cpp/commit/0fec17a8b69ac81255b77022f3af5addf8fcc8f8) -- [fix World::nextInventoryId](https://github.com/MihailRis/VoxelEngine-Cpp/commit/371fdaedcef2c163edd226160f388068b2bf5e83) -- [fix block inventory unbinding](https://github.com/MihailRis/VoxelEngine-Cpp/commit/6f6c2a916afd6b9b79221111fc72b1a86109be13) -- [fix xml text escapes handling](https://github.com/MihailRis/VoxelEngine-Cpp/commit/53c54dc91d132c221ff5fea2f7e9fb4568db9a0f) -- [fix `\'` escape parsing](https://github.com/MihailRis/VoxelEngine-Cpp/commit/2bc6cbda2e809b14fa6cffe09161b53c1636675f) -- [fix crosshair look](https://github.com/MihailRis/VoxelEngine-Cpp/commit/e034bda477c35efe96548e78ecc722966a7a2197) -- [fix: actual block inventory size not updating on inventory-size property update](https://github.com/MihailRis/VoxelEngine-Cpp/commit/1ba5b0ce33103e539ccb199ee1cd52095e286a1f) -- [fix falling block hitbox](https://github.com/MihailRis/VoxelEngine-Cpp/commit/352ef6485a4b796d1cdc8dd0e00ab1a1d72a2c0a) -- [fix console position](https://github.com/MihailRis/VoxelEngine-Cpp/commit/3ea213e8d3cee7be55ec39ffb18dc557dec7557b) -- [fix: fatal error on pack removal when no world open](https://github.com/MihailRis/VoxelEngine-Cpp/commit/78d5ab02c2ba8a3d05cf5639eb10a49c9ca14ec3) -- [fix custom model lighting](https://github.com/MihailRis/VoxelEngine-Cpp/commit/a333cadfcaeb485a30833343d55faf01b28a5c5f) -- [fix: emitter does not skip particles](https://github.com/MihailRis/VoxelEngine-Cpp/commit/983e516fb4ebc1f2def592f2b7f3195d968deed2) -- [fix old custom models render](https://github.com/MihailRis/VoxelEngine-Cpp/commit/82733d38011b52a426cb74560521949c1cd43cc1) +- [fix on_block_interact & fix segfault after engine finished](https://github.com/MihailRis/VoxelEngine-Cpp/commit/d1f92c21d0bbdf2df0eb3b31c5637bdf7110444c) +- [fix item.properties](https://github.com/MihailRis/VoxelEngine-Cpp/commit/92fb19ba5e2307fdbcbf5d0e55f9c0712be45f72) +- [fix base:bazalt durability](https://github.com/MihailRis/VoxelEngine-Cpp/commit/a036c5e383135dc0f9b086e244188d1ceb3f0bf2) +- [fix camera-related bugs](https://github.com/MihailRis/VoxelEngine-Cpp/commit/0d071ab0141edbf087f3ec03505792740023c01e) +- [fix: grabbed item is deleted on inventory close](https://github.com/MihailRis/VoxelEngine-Cpp/commit/2787f2fc5495004f6029644ed5221f3abfc0c68f) +- [fix block overriding](https://github.com/MihailRis/VoxelEngine-Cpp/commit/cda34e3975a42696ea31a1b0018731e746cd13bb) +- [fix faces culling when 'light-passing' is false](https://github.com/MihailRis/VoxelEngine-Cpp/commit/954724c8378da525fc7349c018e9351c5bdfdf8f) +- [fix particles lighting](https://github.com/MihailRis/VoxelEngine-Cpp/commit/6be640458d6b4ae46866b342ca0f26e561ead125) +- [fix non-skipping particles](https://github.com/MihailRis/VoxelEngine-Cpp/pull/421/commits/f1c7317c5ab2a148e5188e091cd1aa3490dc8b4d) +- [fix content stats](https://github.com/MihailRis/VoxelEngine-Cpp/commit/97eef3ef1900157a9648bade8e06b203b99ee6f6) +- [fix byte manipulation functions](https://github.com/MihailRis/VoxelEngine-Cpp/commit/9490d1f7eacb00f56112dfdd1ea12bb9c3ca528d) +- [fix error handling in events and runnables](https://github.com/MihailRis/VoxelEngine-Cpp/commit/03a3062940ebfc4e8f0b3efc5930c71f8d07b604) +- [fix small dumb legacy memory leak](https://github.com/MihailRis/VoxelEngine-Cpp/commit/4d0b9f049b79322959e4aefd95eedc665e87d087) +- [fix grass lighting](https://github.com/MihailRis/VoxelEngine-Cpp/commit/9d7816a286fb3a7269b5220502354720e4d2726b) +- [small fixes in translation.](https://github.com/MihailRis/VoxelEngine-Cpp/commit/d25452784d68be19821dc917ad15bc0a92d81bd9) +- [fix errors handling in event handlers](https://github.com/MihailRis/VoxelEngine-Cpp/commit/f62fc5a039dca70219fb2b38f61fc53a2542adf7) +- [fix lua stack manipulations](https://github.com/MihailRis/VoxelEngine-Cpp/commit/e7555448cf0df86995b40d67fa58de1ca78f8105) +- [fix lua::create_lambda](https://github.com/MihailRis/VoxelEngine-Cpp/commit/40cdebb175014736e35bc31ecc93ae72fb00a6e9) +- [fix some UB](https://github.com/MihailRis/VoxelEngine-Cpp/commit/b5999fe36420d116674abc353ed3dad739ac5f70) +- [fix rigidbody:is_enabled](https://github.com/MihailRis/VoxelEngine-Cpp/commit/2adfbdb19226b2685848131073a56b354706433d) +- [fix panel elements removal](https://github.com/MihailRis/VoxelEngine-Cpp/commit/c6951e09651149463528bdffbc2cba4ea41de4a4) +- [fix infinite block fields conversion requests](https://github.com/MihailRis/VoxelEngine-Cpp/commit/0494db91872abff500cfc153a32035ee3f2745ae) +- [fix data_buffer:put_number](https://github.com/MihailRis/VoxelEngine-Cpp/commit/e247902cc6ffdaa6beab391fcfdaea7f021ab063) +- [fix textbox horizontal scroll & fix console log width](https://github.com/MihailRis/VoxelEngine-Cpp/commit/13fde2116d095b9393c4f5804ba23071e5f56ad6) +- [fix is_array](https://github.com/MihailRis/VoxelEngine-Cpp/pull/420) +- [fix neighbour chunk update](https://github.com/MihailRis/VoxelEngine-Cpp/pull/404) +- [fix lamp material](https://github.com/MihailRis/VoxelEngine-Cpp/commit/57356e1d64d6d9d7e8d59b078543b290e998ad00) diff --git a/Dockerfile b/Dockerfile index d44f4b2e..83a4a05c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,7 +29,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ # Install EnTT RUN git clone https://github.com/skypjack/entt.git && \ cd entt/build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ + cmake -DCMAKE_BUILD_TYPE=Release -DENTT_INSTALL=on .. && \ make install && \ cd ../.. && rm -rf entt diff --git a/README.md b/README.md index 8270f9b0..caae42ad 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Latest release - [Download](https://github.com/MihailRis/VoxelEngine-Cpp/releases/latest) | [Скачать](https://github.com/MihailRis/VoxelEngine-Cpp/releases/latest) -- [Documentation](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.25/doc/en/main-page.md) | [Документация](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.25/doc/ru/main-page.md) +- [Documentation](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.26/doc/en/main-page.md) | [Документация](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.26/doc/ru/main-page.md) ## Build project in Linux diff --git a/doc/en/main-page.md b/doc/en/main-page.md index 0daa4729..0a4748b4 100644 --- a/doc/en/main-page.md +++ b/doc/en/main-page.md @@ -1,8 +1,6 @@ # Documentation -Documentation for in-development version 0.26. - -[Documentation for stable release 0.25.x.](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.25/doc/en/main-page.md) +Documentation for release 0.26. ## Sections diff --git a/doc/en/scripting/builtins/libgui.md b/doc/en/scripting/builtins/libgui.md index 64b5005b..cf6839db 100644 --- a/doc/en/scripting/builtins/libgui.md +++ b/doc/en/scripting/builtins/libgui.md @@ -62,6 +62,17 @@ gui.escape_markup( Escapes markup in text. +```lua +gui.alert( + -- message (not automatically translated, use gui.str(...)) + message: str, + -- function called on close + on_ok: function() -> nil +) +``` + +Displays a message box. **Non-blocking**. + ```lua gui.confirm( -- message (does not translate automatically, use gui.str(...)) @@ -78,7 +89,7 @@ gui.confirm( ) ``` -Requests confirmation from the user for an action. **Does not** stop code execution. +Requests confirmation from the user for an action. **Non-blocking**. ```lua gui.load_document( diff --git a/doc/en/scripting/builtins/libplayer.md b/doc/en/scripting/builtins/libplayer.md index e235377a..fa799198 100644 --- a/doc/en/scripting/builtins/libplayer.md +++ b/doc/en/scripting/builtins/libplayer.md @@ -96,6 +96,15 @@ player.get_spawnpoint(playerid: int) -> number, number, number Spawn point setter and getter +```lua +player.is_suspended(pid: int) -> bool +player.set_suspended(pid: int, suspended: bool) +``` + +Setter and getter for the player's suspended status. + +When suspended, the entity is deleted and the player is disabled from the world simulation. + ```lua player.set_name(playerid: int, name: str) player.get_name(playerid: int) -> str diff --git a/doc/ru/main-page.md b/doc/ru/main-page.md index 10dff292..52e0faa1 100644 --- a/doc/ru/main-page.md +++ b/doc/ru/main-page.md @@ -1,8 +1,6 @@ # Документация -Документация разрабатываемой версии 0.26. - -[Документация стабильной версии 0.25.x.](https://github.com/MihailRis/VoxelEngine-Cpp/blob/release-0.25/doc/ru/main-page.md) +Документация версии 0.26. ## Разделы diff --git a/doc/ru/scripting/builtins/libgui.md b/doc/ru/scripting/builtins/libgui.md index 66e67809..aea2f44a 100644 --- a/doc/ru/scripting/builtins/libgui.md +++ b/doc/ru/scripting/builtins/libgui.md @@ -59,6 +59,17 @@ gui.escape_markup( Экранирует разметку в тексте. +```lua +gui.alert( + -- сообщение (не переводится автоматически, используйте gui.str(...)) + message: str, + -- функция, вызываемая при закрытии + on_ok: function() -> nil +) +``` + +Выводит окно с сообщением. **Не** останавливает выполнение кода. + ```lua gui.confirm( -- сообщение (не переводится автоматически, используйте gui.str(...)) diff --git a/doc/ru/scripting/builtins/libplayer.md b/doc/ru/scripting/builtins/libplayer.md index 35dda747..2228f42c 100644 --- a/doc/ru/scripting/builtins/libplayer.md +++ b/doc/ru/scripting/builtins/libplayer.md @@ -96,6 +96,15 @@ player.get_spawnpoint(playerid: int) -> number, number, number Сеттер и геттер точки спавна игрока +```lua +player.is_suspended(pid: int) -> bool +player.set_suspended(pid: int, suspended: bool) +``` + +Сеттер и геттер статуса "заморозки" игрока. + +При "заморозке" удаляется сущность, а игрок выключается из симуляции мира. + ```lua player.set_name(playerid: int, name: str) player.get_name(playerid: int) -> str diff --git a/res/content/base/block_materials/snow.json b/res/content/base/block_materials/snow.json new file mode 100644 index 00000000..42359b2e --- /dev/null +++ b/res/content/base/block_materials/snow.json @@ -0,0 +1,5 @@ +{ + "steps-sound": "steps/snow", + "place-sound": "blocks/snow_place", + "break-sound": "blocks/snow_break" +} diff --git a/res/content/base/scripts/components/player_animator.lua b/res/content/base/scripts/components/player_animator.lua index 8862c6c2..78049a2c 100644 --- a/res/content/base/scripts/components/player_animator.lua +++ b/res/content/base/scripts/components/player_animator.lua @@ -19,7 +19,7 @@ function on_render() return end - local rx, ry, rz = player.get_rot(pid, true) + local rx, ry, rz = player.get_rot(pid, pid ~= hud.get_player()) rig:set_matrix(headIndex, mat4.rotate({1, 0, 0}, ry)) rig:set_matrix(bodyIndex, mat4.rotate({0, 1, 0}, rx)) diff --git a/res/content/base/sounds/blocks/snow_3.ogg b/res/content/base/sounds/blocks/snow_3.ogg new file mode 100644 index 00000000..72af9661 Binary files /dev/null and b/res/content/base/sounds/blocks/snow_3.ogg differ diff --git a/res/content/base/sounds/blocks/snow_break.ogg b/res/content/base/sounds/blocks/snow_break.ogg new file mode 100644 index 00000000..8f2df1a8 Binary files /dev/null and b/res/content/base/sounds/blocks/snow_break.ogg differ diff --git a/res/content/base/sounds/blocks/snow_place.ogg b/res/content/base/sounds/blocks/snow_place.ogg new file mode 100644 index 00000000..9595ba20 Binary files /dev/null and b/res/content/base/sounds/blocks/snow_place.ogg differ diff --git a/res/content/base/sounds/blocks/wood_break.ogg b/res/content/base/sounds/blocks/wood_break.ogg index d0fa78cc..e6c9a47f 100644 Binary files a/res/content/base/sounds/blocks/wood_break.ogg and b/res/content/base/sounds/blocks/wood_break.ogg differ diff --git a/res/content/base/sounds/blocks/wood_place.ogg b/res/content/base/sounds/blocks/wood_place.ogg index fea80562..6fbeee5e 100644 Binary files a/res/content/base/sounds/blocks/wood_place.ogg and b/res/content/base/sounds/blocks/wood_place.ogg differ diff --git a/res/content/base/sounds/steps/snow_0.ogg b/res/content/base/sounds/steps/snow_0.ogg index e50bd5fc..603946af 100644 Binary files a/res/content/base/sounds/steps/snow_0.ogg and b/res/content/base/sounds/steps/snow_0.ogg differ diff --git a/res/content/base/sounds/steps/snow_1.ogg b/res/content/base/sounds/steps/snow_1.ogg index c7409c15..8be6751e 100644 Binary files a/res/content/base/sounds/steps/snow_1.ogg and b/res/content/base/sounds/steps/snow_1.ogg differ diff --git a/res/content/base/sounds/steps/snow_2.ogg b/res/content/base/sounds/steps/snow_2.ogg index b4f44e98..415775bc 100644 Binary files a/res/content/base/sounds/steps/snow_2.ogg and b/res/content/base/sounds/steps/snow_2.ogg differ diff --git a/res/content/base/sounds/steps/snow_3.ogg b/res/content/base/sounds/steps/snow_3.ogg index 33f0161d..9e0a1c31 100644 Binary files a/res/content/base/sounds/steps/snow_3.ogg and b/res/content/base/sounds/steps/snow_3.ogg differ diff --git a/res/content/base/sounds/steps/snow_4.ogg b/res/content/base/sounds/steps/snow_4.ogg index 5ad40d6d..12f811ab 100644 Binary files a/res/content/base/sounds/steps/snow_4.ogg and b/res/content/base/sounds/steps/snow_4.ogg differ diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 67cdd0fe..9d29b873 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -194,8 +194,8 @@ function gui.template(name, params) text = text:gsub("if%s*=%s*'%%{%w+}'", "if=''") text = text:gsub("if%s*=%s*\"%%{%w+}\"", "if=\"\"") -- remove unsolved properties: attr='%{var}' - text = text:gsub("%w+%s*=%s*'%%{%w+}'%s?", "") - text = text:gsub("%w+%s*=%s*\"%%{%w+}\"%s?", "") + text = text:gsub("%s*%S+='%%{[^}]+}'%s*", " ") + text = text:gsub('%s*%S+="%%{[^}]+}"%s*', " ") return text end diff --git a/src/graphics/render/BlocksRenderer.cpp b/src/graphics/render/BlocksRenderer.cpp index bc05fc72..5cddcb57 100644 --- a/src/graphics/render/BlocksRenderer.cpp +++ b/src/graphics/render/BlocksRenderer.cpp @@ -9,7 +9,7 @@ #include "lighting/Lightmap.hpp" #include "frontend/ContentGfxCache.hpp" -const glm::vec3 BlocksRenderer::SUN_VECTOR (0.411934f, 0.863868f, -0.279161f); +const glm::vec3 BlocksRenderer::SUN_VECTOR (0.2275f,0.9388f,-0.1005f); BlocksRenderer::BlocksRenderer( size_t capacity, @@ -129,7 +129,7 @@ void BlocksRenderer::faceAO( float s = 0.5f; if (lights) { float d = glm::dot(glm::normalize(Z), SUN_VECTOR); - d = 0.8f + d * 0.2f; + d = 0.7f + d * 0.3f; auto axisX = glm::normalize(X); auto axisY = glm::normalize(Y); @@ -167,7 +167,7 @@ void BlocksRenderer::face( float s = 0.5f; if (lights) { float d = glm::dot(glm::normalize(Z), SUN_VECTOR); - d = 0.8f + d * 0.2f; + d = 0.7f + d * 0.3f; tint *= d; } vertex(coord + (-X - Y + Z) * s, region.u1, region.v1, tint); diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 08485201..55dd8ceb 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -5,6 +5,7 @@ #include "elements/UINode.hpp" #include "elements/Label.hpp" #include "elements/Menu.hpp" +#include "elements/Panel.hpp" #include "assets/Assets.hpp" #include "frontend/UiDocument.hpp" @@ -23,8 +24,10 @@ using namespace gui; -GUI::GUI() : batch2D(std::make_unique(1024)) { - container = std::make_shared(glm::vec2(1000)); +GUI::GUI() + : batch2D(std::make_unique(1024)), + container(std::make_shared(glm::vec2(1000))) { + container->setId("root"); uicamera = std::make_unique(glm::vec3(), Window::height); uicamera->perspective = false; uicamera->flipped = true; @@ -214,6 +217,14 @@ void GUI::draw(const DrawContext& pctx, const Assets& assets) { auto& viewport = ctx.getViewport(); glm::vec2 wsize = viewport.size(); + auto& page = menu->getCurrent(); + if (page.panel) { + menu->setSize(page.panel->getSize()); + page.panel->refresh(); + if (auto panel = std::dynamic_pointer_cast(page.panel)) { + panel->cropToContent(); + } + } menu->setPos((wsize - menu->getSize()) / 2.0f); uicamera->setFov(wsize.y); diff --git a/src/graphics/ui/elements/Menu.cpp b/src/graphics/ui/elements/Menu.cpp index da827489..d059d693 100644 --- a/src/graphics/ui/elements/Menu.cpp +++ b/src/graphics/ui/elements/Menu.cpp @@ -65,9 +65,10 @@ void Menu::setPage(Page page, bool history) { setSize(current.panel->getSize()); } -void Menu::back() { - if (pageStack.empty()) - return; +bool Menu::back() { + if (pageStack.empty()) { + return false; + } Page page = pageStack.top(); pageStack.pop(); @@ -77,6 +78,7 @@ void Menu::back() { } setPage(page, false); + return true; } void Menu::setPageLoader(PageLoaderFunc loader) { diff --git a/src/graphics/ui/elements/Menu.hpp b/src/graphics/ui/elements/Menu.hpp index 478c985a..e3e134d6 100644 --- a/src/graphics/ui/elements/Menu.hpp +++ b/src/graphics/ui/elements/Menu.hpp @@ -54,7 +54,7 @@ namespace gui { PageLoaderFunc getPageLoader(); /// @brief Set page to previous saved in history - void back(); + bool back(); /// @brief Clear pages history void clearHistory(); diff --git a/src/graphics/ui/elements/Panel.cpp b/src/graphics/ui/elements/Panel.cpp index d76866f0..70446d7d 100644 --- a/src/graphics/ui/elements/Panel.cpp +++ b/src/graphics/ui/elements/Panel.cpp @@ -70,9 +70,6 @@ void Panel::remove(const std::shared_ptr &node) { void Panel::refresh() { UINode::refresh(); - std::stable_sort(nodes.begin(), nodes.end(), [](auto a, auto b) { - return a->getZIndex() < b->getZIndex(); - }); float x = padding.x; float y = padding.y; @@ -80,20 +77,21 @@ void Panel::refresh() { if (orientation == Orientation::vertical) { float maxw = size.x; for (auto& node : nodes) { - glm::vec2 nodesize = node->getSize(); const glm::vec4 margin = node->getMargin(); y += margin.y; float ex = x + margin.x; node->setPos(glm::vec2(ex, y)); - y += nodesize.y + margin.w + interval; - + float width = size.x - padding.x - padding.z - margin.x - margin.z; if (node->isResizing()) { - node->setSize(glm::vec2(width, nodesize.y)); + node->setMaxSize({width, node->getMaxSize().y}); + node->setSize(glm::vec2(width, node->getSize().y)); } node->refresh(); - maxw = fmax(maxw, ex+node->getSize().x+margin.z+padding.z); + glm::vec2 nodeSize = node->getSize(); + y += nodeSize.y + margin.w + interval; + maxw = fmax(maxw, ex+nodeSize.x+margin.z+padding.z); } actualLength = y + padding.w; } else { diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index 4ebe8c7a..f6444f41 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -195,7 +195,8 @@ glm::vec2 UINode::getSize() const { void UINode::setSize(glm::vec2 size) { this->size = glm::vec2( - glm::max(minSize.x, size.x), glm::max(minSize.y, size.y) + glm::max(minSize.x, glm::min(maxSize.x, size.x)), + glm::max(minSize.y, glm::min(maxSize.y, size.y)) ); } @@ -208,6 +209,15 @@ void UINode::setMinSize(glm::vec2 minSize) { setSize(getSize()); } +glm::vec2 UINode::getMaxSize() const { + return maxSize; +} + +void UINode::setMaxSize(glm::vec2 maxSize) { + this->maxSize = maxSize; + setSize(getSize()); +} + void UINode::setColor(glm::vec4 color) { this->color = color; this->hoverColor = color; diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index af0ab145..2f62dd27 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -75,6 +75,8 @@ namespace gui { glm::vec2 size; /// @brief minimal element size glm::vec2 minSize {1.0f}; + /// @brief maximal element size + glm::vec2 maxSize {1e6f}; /// @brief element primary color (background-color or text-color if label) glm::vec4 color {1.0f}; /// @brief element color when mouse is over it @@ -224,6 +226,8 @@ namespace gui { virtual void setSize(glm::vec2 size); virtual glm::vec2 getMinSize() const; virtual void setMinSize(glm::vec2 size); + virtual glm::vec2 getMaxSize() const; + virtual void setMaxSize(glm::vec2 size); /// @brief Called in containers when new element added virtual void refresh() {}; virtual void fullRefresh() { diff --git a/src/graphics/ui/gui_util.cpp b/src/graphics/ui/gui_util.cpp index 04026132..7fd40431 100644 --- a/src/graphics/ui/gui_util.cpp +++ b/src/graphics/ui/gui_util.cpp @@ -31,7 +31,17 @@ void guiutil::alert( const std::wstring& text, const runnable& on_hidden ) { - auto panel = std::make_shared(glm::vec2(500, 300), glm::vec4(4.0f), 4.0f); + auto panel = std::make_shared( + glm::vec2( + glm::min( + static_cast(650), + glm::max(text.length() * 10, static_cast(200)) + ), + 300 + ), + glm::vec4(4.0f), + 4.0f + ); panel->setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.5f)); auto menuPtr = engine.getGUI()->getMenu(); @@ -40,14 +50,15 @@ void guiutil::alert( menu.removePage(""); if (on_hidden) { on_hidden(); - } else { - menu.back(); + } else if (!menu.back()) { + menu.reset(); } }; auto label = std::make_shared