From d294530184848f24094cae148b0ccf954cb0d991 Mon Sep 17 00:00:00 2001 From: Yaroslav Koval Date: Sat, 13 Jan 2024 17:59:21 +0200 Subject: [PATCH 01/29] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..f8956990 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ['https://www.donationalerts.com/r/mihailris'] From 74f1de0cb0738e9bbaea5a89a52c7e25ab91a742 Mon Sep 17 00:00:00 2001 From: Yaroslav Koval Date: Sat, 13 Jan 2024 18:10:20 +0200 Subject: [PATCH 02/29] Update issue templates --- .github/ISSUE_TEMPLATE/вопрос.md | 12 +++++++++++ .github/ISSUE_TEMPLATE/найден-баг.md | 31 ++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/новая-фича.md | 20 ++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/вопрос.md create mode 100644 .github/ISSUE_TEMPLATE/найден-баг.md create mode 100644 .github/ISSUE_TEMPLATE/новая-фича.md diff --git a/.github/ISSUE_TEMPLATE/вопрос.md b/.github/ISSUE_TEMPLATE/вопрос.md new file mode 100644 index 00000000..118f464b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/вопрос.md @@ -0,0 +1,12 @@ +--- +name: Вопрос +about: Вопрос другого характера +title: QUESTION +labels: question +assignees: '' + +--- + +**Опишите свой вопрос** +Кратко и понятно опишите ваш вопрос. +Перед созданием этого запроса убедитесь, что ранее не были созданы подобные. diff --git a/.github/ISSUE_TEMPLATE/найден-баг.md b/.github/ISSUE_TEMPLATE/найден-баг.md new file mode 100644 index 00000000..330c55bf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/найден-баг.md @@ -0,0 +1,31 @@ +--- +name: Найден баг +about: Создайте отчет, чтобы помочь нам исправить этот баг +title: BUG +labels: bug, wontfix +assignees: '' + +--- + +**Опишите ошибку** +Четкое и краткое описание ошибки. + +**Для воспроизведения** +Шаги для воспроизведения поведения: +1. Перейдите в раздел «...» +2. Нажмите «....» +3. Прокрутите вниз до «....» +4. См. ошибку + +**Ожидаемое поведение** +Четкое и краткое описание того, что вы ожидаете. + +**Скриншоты** +Если применимо, добавьте снимки экрана, которые помогут объяснить вашу проблему. + +**Техническая информация (заполните следующую информацию):** + - ОС: [например. Windows 10] + - Версия [например. 0.17] + +**Дополнительный контекст** +Добавьте сюда любой другой контекст проблемы. diff --git a/.github/ISSUE_TEMPLATE/новая-фича.md b/.github/ISSUE_TEMPLATE/новая-фича.md new file mode 100644 index 00000000..25a823a7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/новая-фича.md @@ -0,0 +1,20 @@ +--- +name: Новая фича +about: Новая идею для этого проекта +title: 'ENHANCEMENT ' +labels: enhancement +assignees: '' + +--- + +**Связан ли ваш запрос на добавление функции с проблемой? Пожалуйста, опишите.** +Четкое и краткое описание проблемы. Бывший. Я всегда расстраиваюсь, когда [...] + +**Опишите желаемое решение** +Четкое и краткое описание того, чего вы хотите. + +**Опишите альтернативы, которые вы рассматривали** +Четкое и краткое описание любых альтернативных решений или функций, которые вы рассматривали. + +**Дополнительный контекст** +Добавьте сюда любой другой контекст или снимки экрана о запросе функции. From 1e21d1caa72c6056e053fe66747ad06fddbbe574 Mon Sep 17 00:00:00 2001 From: Yaroslav Koval Date: Sat, 13 Jan 2024 18:11:54 +0200 Subject: [PATCH 03/29] =?UTF-8?q?Update=20=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F-?= =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit grammar correction --- .github/ISSUE_TEMPLATE/новая-фича.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/новая-фича.md b/.github/ISSUE_TEMPLATE/новая-фича.md index 25a823a7..f4b4b213 100644 --- a/.github/ISSUE_TEMPLATE/новая-фича.md +++ b/.github/ISSUE_TEMPLATE/новая-фича.md @@ -1,6 +1,6 @@ --- name: Новая фича -about: Новая идею для этого проекта +about: Новая идея для этого проекта title: 'ENHANCEMENT ' labels: enhancement assignees: '' From 10c12183a334da847e25f9ce741e8618092c548c Mon Sep 17 00:00:00 2001 From: Koval Yaroslav Date: Sat, 13 Jan 2024 18:16:23 +0200 Subject: [PATCH 04/29] update issue templates --- .github/ISSUE_TEMPLATE/{найден-баг.md => bug.md} | 0 .github/ISSUE_TEMPLATE/{новая-фича.md => enhancement.md} | 0 .github/ISSUE_TEMPLATE/{вопрос.md => question.md} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename .github/ISSUE_TEMPLATE/{найден-баг.md => bug.md} (100%) rename .github/ISSUE_TEMPLATE/{новая-фича.md => enhancement.md} (100%) rename .github/ISSUE_TEMPLATE/{вопрос.md => question.md} (100%) diff --git a/.github/ISSUE_TEMPLATE/найден-баг.md b/.github/ISSUE_TEMPLATE/bug.md similarity index 100% rename from .github/ISSUE_TEMPLATE/найден-баг.md rename to .github/ISSUE_TEMPLATE/bug.md diff --git a/.github/ISSUE_TEMPLATE/новая-фича.md b/.github/ISSUE_TEMPLATE/enhancement.md similarity index 100% rename from .github/ISSUE_TEMPLATE/новая-фича.md rename to .github/ISSUE_TEMPLATE/enhancement.md diff --git a/.github/ISSUE_TEMPLATE/вопрос.md b/.github/ISSUE_TEMPLATE/question.md similarity index 100% rename from .github/ISSUE_TEMPLATE/вопрос.md rename to .github/ISSUE_TEMPLATE/question.md From 2254d8e04b10e090e89b5779d13cb9b876254205 Mon Sep 17 00:00:00 2001 From: Koval Yaroslav Date: Sat, 13 Jan 2024 18:54:35 +0200 Subject: [PATCH 05/29] add fleet IDE conf dir to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 76b2d370..72bdacf6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ Debug/voxel_engine .settings .cproject .project +.fleet .git /Default/ AppDir From c6c5050ea1a79ab731d1afda4cb2af6faedb60bf Mon Sep 17 00:00:00 2001 From: A-lex-Ra Date: Sun, 14 Jan 2024 10:06:12 +0600 Subject: [PATCH 06/29] msvc preproc fix --- src/logic/scripting/api_lua.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/scripting/api_lua.cpp b/src/logic/scripting/api_lua.cpp index c48e4000..96beb20d 100644 --- a/src/logic/scripting/api_lua.cpp +++ b/src/logic/scripting/api_lua.cpp @@ -14,7 +14,7 @@ #include "../../lighting/Lighting.h" #include "../../logic/BlocksController.h" -#if (LUA_VERSION_NUM < 503 and not defined(LUAJIT_VERSION)) +#if (LUA_VERSION_NUM < 503 && !defined(LUAJIT_VERSION)) static void luaL_openlib(lua_State* L, const char* name, const luaL_Reg* libfuncs) { lua_newtable(L); luaL_setfuncs(L, libfuncs, 0); From f41362beb4668211f5f3b3caf2728a5710b0cf1a Mon Sep 17 00:00:00 2001 From: Alex Dolzhenkov Date: Sun, 14 Jan 2024 21:28:12 +1300 Subject: [PATCH 07/29] #108 Add docker container support --- Dockerfile | 47 +++++++++++++++++++++++++++++++++++++++++++++++ README.md | 26 +++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..3785e02c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,47 @@ +# Build docker container: docker build -t voxel-engine . +# Build project: docker run --rm -it -v$(pwd):/project voxel-engine bash -c "cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && cmake --build build" +# Run project in docker: docker run --rm -it -v$(pwd):/project -v/tmp/.X11-unix:/tmp/.X11-unix -v${XAUTHORITY}:/home/user/.Xauthority:ro -eDISPLAY --network=host voxel-engine ./build/VoxelEngine + +FROM debian:bullseye-slim +LABEL Description="Docker container for building VoxelEngine for Linux" + +# Install dependencies +RUN apt-get update && apt-get install --no-install-recommends -y \ + git \ + g++ \ + make \ + cmake \ + xauth \ + gdb \ + gdbserver \ + libglfw3-dev \ + libglfw3 \ + libglew-dev \ + libglm-dev \ + libpng-dev \ + libopenal-dev \ + libluajit-5.1-dev \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# CMake missing LUA_INCLUDE_DIR and LUA_LIBRARIES fix: +RUN ln -s /usr/lib/x86_64-linux-gnu/libluajit-5.1.a /usr/lib/x86_64-linux-gnu/liblua5.1.a \ + && ln -s /usr/include/luajit-2.1 /usr/include/lua + +# Install LuaJIT: +RUN git clone https://luajit.org/git/luajit.git \ + && cd luajit \ + && make && make install INSTALL_INC=/usr/include/lua \ + && cd .. && rm -rf luajit + +# Create default user, due to: +# - Build and test artifacts have user permissions and not root permissions +# - Don't give root privileges from host to containers (security) +ARG USER=user +ARG UID=1000 +ARG GID=1000 +RUN useradd -m ${USER} --uid=${UID} +USER ${UID}:${GID} + +# Project workspace +WORKDIR /project diff --git a/README.md b/README.md index f51329ed..097c7526 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - **Tab** - open inventory - **W** **A** **S** **D** - movement - **Space** - jump -- **LMB** - remove block +- **LMB** - remove block - **RMB** - place block - **F** - toggle flight mode - **N** - noclip mode @@ -74,3 +74,27 @@ brew install glfw3 glew glm libpng lua luajit openal-soft ``` If homebrew for some reason could not install the necessary packages: ```lua luajit openal-soft```, then download, install and compile them manually (Lua, LuaJIT and OpenAL). + +## Build using Docker + +### Step 0. Install docker on your system + +See https://docs.docker.com/engine/install + +### Step 1. Build docker container + +``` +docker build -t voxel-engine . +``` + +### Step 2. Build project using the docker container + +``` +docker run --rm -it -v$(pwd):/project voxel-engine bash -c "cmake -DCMAKE_BUILD_TYPE=Release -Bbuild && cmake --build build" +``` + +### Step 3. Run project using the docker container + +``` +docker run --rm -it -v$(pwd):/project -v/tmp/.X11-unix:/tmp/.X11-unix -v${XAUTHORITY}:/home/user/.Xauthority:ro -eDISPLAY --network=host voxel-engine ./build/VoxelEngine +``` From 3473aeb3091d9df258ec8b9dba80499fb336b84f Mon Sep 17 00:00:00 2001 From: A-lex-Ra Date: Wed, 17 Jan 2024 19:26:09 +0600 Subject: [PATCH 08/29] replace target fix --- src/logic/PlayerController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 253f5bda..7a84a96c 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -285,7 +285,7 @@ void PlayerController::updateInteraction(){ scripting::on_block_interact(player, target, x, y, z); return; } - if (target->model != BlockModel::xsprite){ + if (!target->replaceable){ x = (iend.x)+(norm.x); y = (iend.y)+(norm.y); z = (iend.z)+(norm.z); From cefc5f62c989e5735896673cd5c6e30c2661b65e Mon Sep 17 00:00:00 2001 From: A-lex-Ra Date: Wed, 17 Jan 2024 21:04:18 +0600 Subject: [PATCH 09/29] upd CMakeLists for proper linkage --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f9a4bed..11a262d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ endif() find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenAL REQUIRED) +find_package(ZLIB REQUIRED) # luajit has no CMakeLists.txt to use it as subdirectory, so install it find_package(Lua REQUIRED) @@ -75,7 +76,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() include_directories(${LUA_INCLUDE_DIR}) -target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW ${PNGLIB} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS}) +target_link_libraries(${PROJECT_NAME} ${LIBS} glfw OpenGL::GL ${OPENAL_LIBRARY} GLEW::GLEW ZLIB::ZLIB ${PNGLIB} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS}) file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/res DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) From 7d35356f9d71309ed06c049ad11524ce7be6a8a9 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Jan 2024 19:33:04 +0300 Subject: [PATCH 10/29] binary json: compressed documents support --- src/coders/binary_json.cpp | 24 +++++++++++++++++------- src/coders/gzip.h | 1 + 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/coders/binary_json.cpp b/src/coders/binary_json.cpp index c65012d3..c296dc16 100644 --- a/src/coders/binary_json.cpp +++ b/src/coders/binary_json.cpp @@ -2,6 +2,7 @@ #include +#include "gzip.h" #include "byte_utils.h" using namespace json; @@ -148,12 +149,21 @@ static Map* object_from_binary(ByteReader& reader) { } std::unique_ptr json::from_binary(const ubyte* src, size_t size) { - ByteReader reader(src, size); - std::unique_ptr value (value_from_binary(reader)); - if (value->type != valtype::map) { - throw std::runtime_error("root value is not an object"); + if (size < 2) { + throw std::runtime_error("bytes length is less than 2"); + } + if (src[0] == gzip::MAGIC[0] && src[1] == gzip::MAGIC[1]) { + // reading compressed document + auto data = gzip::decompress(src, size); + return from_binary(data.data(), data.size()); + } else { + ByteReader reader(src, size); + std::unique_ptr value (value_from_binary(reader)); + if (value->type != valtype::map) { + throw std::runtime_error("root value is not an object"); + } + std::unique_ptr obj (value->value.map); + value->value.map = nullptr; + return obj; } - std::unique_ptr obj (value->value.map); - value->value.map = nullptr; - return obj; } diff --git a/src/coders/gzip.h b/src/coders/gzip.h index 2bf6cba7..f83cdfe6 100644 --- a/src/coders/gzip.h +++ b/src/coders/gzip.h @@ -5,6 +5,7 @@ #include "../typedefs.h" namespace gzip { + const unsigned char MAGIC[] = "\x1F\x8B"; std::vector compress(const ubyte* src, size_t size); std::vector decompress(const ubyte* src, size_t size); } From d7f2771da4d03c27f22b62bdcb86775633257d74 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Jan 2024 23:10:06 +0300 Subject: [PATCH 11/29] lua: pack.get_folder(pack_name) + shader fix --- res/shaders/main.glslf | 2 +- src/engine.cpp | 2 +- src/logic/scripting/api_lua.cpp | 22 +++++++++++++++++++++- src/logic/scripting/scripting.cpp | 10 +++++----- src/logic/scripting/scripting.h | 5 +++-- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/res/shaders/main.glslf b/res/shaders/main.glslf index ab561063..498ef490 100644 --- a/res/shaders/main.glslf +++ b/res/shaders/main.glslf @@ -16,7 +16,7 @@ void main(){ float depth = (a_distance/256.0); float alpha = a_color.a * tex_color.a; // anyway it's any alpha-test alternative required - if (alpha < 0.1f) + if (alpha < 0.5f) discard; f_color = mix(a_color * tex_color, vec4(fogColor,1.0), min(1.0, pow(depth*u_fogFactor, u_fogCurve))); f_color.a = alpha; diff --git a/src/engine.cpp b/src/engine.cpp index ee3b4da1..2204945e 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -46,7 +46,7 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) } auto resdir = paths->getResources(); - scripting::initialize(paths); + scripting::initialize(this); std::cout << "-- loading assets" << std::endl; std::vector roots {resdir}; diff --git a/src/logic/scripting/api_lua.cpp b/src/logic/scripting/api_lua.cpp index 8403604c..75eacfdc 100644 --- a/src/logic/scripting/api_lua.cpp +++ b/src/logic/scripting/api_lua.cpp @@ -13,6 +13,7 @@ #include "../../voxels/voxel.h" #include "../../lighting/Lighting.h" #include "../../logic/BlocksController.h" +#include "../../engine.h" inline int lua_pushivec3(lua_State* L, int x, int y, int z) { lua_pushinteger(L, x); @@ -27,7 +28,25 @@ inline void luaL_openlib(lua_State* L, const char* name, const luaL_Reg* libfunc lua_setglobal(L, name); } -/* == world library ==*/ +/* == pack library == */ +static int l_pack_get_folder(lua_State* L) { + std::string packName = lua_tostring(L, 1); + for (auto& pack : scripting::engine->getContentPacks()) { + if (pack.id == packName) { + lua_pushstring(L, (pack.folder.u8string()+"/").c_str()); + return 1; + } + } + lua_pushstring(L, ""); + return 1; +} + +static const luaL_Reg packlib [] = { + {"get_folder", l_pack_get_folder}, + {NULL, NULL} +}; + +/* == world library == */ static int l_world_get_day_time(lua_State* L) { lua_pushnumber(L, scripting::level->world->daytime); return 1; @@ -266,6 +285,7 @@ static int l_is_replaceable_at(lua_State* L) { lua_setglobal(L, NAME)) void apilua::create_funcs(lua_State* L) { + luaL_openlib(L, "pack", packlib, 0); luaL_openlib(L, "world", worldlib, 0); luaL_openlib(L, "player", playerlib, 0); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 6564e216..4ab975f3 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -11,19 +11,19 @@ #include "../../voxels/Block.h" #include "../../items/ItemDef.h" #include "../../logic/BlocksController.h" +#include "../../engine.h" #include "api_lua.h" using namespace scripting; namespace scripting { extern lua_State* L; - extern EnginePaths* paths; } +Engine* scripting::engine = nullptr; lua_State* scripting::L = nullptr; Level* scripting::level = nullptr; const Content* scripting::content = nullptr; -EnginePaths* scripting::paths = nullptr; BlocksController* scripting::blocks = nullptr; inline int lua_pushivec3(lua_State* L, int x, int y, int z) { @@ -58,8 +58,8 @@ int call_func(lua_State* L, int argc, const std::string& name) { return 1; } -void scripting::initialize(EnginePaths* paths) { - scripting::paths = paths; +void scripting::initialize(Engine* engine) { + scripting::engine = engine; L = luaL_newstate(); if (L == nullptr) { @@ -87,7 +87,7 @@ void scripting::on_world_load(Level* level, BlocksController* blocks) { scripting::level = level; scripting::content = level->content; scripting::blocks = blocks; - + auto paths = scripting::engine->getPaths(); fs::path file = paths->getResources()/fs::path("scripts/world.lua"); std::string src = files::read_string(file); luaL_loadbuffer(L, src.c_str(), src.length(), file.string().c_str()); diff --git a/src/logic/scripting/scripting.h b/src/logic/scripting/scripting.h index ff4522bc..c4cd6b05 100644 --- a/src/logic/scripting/scripting.h +++ b/src/logic/scripting/scripting.h @@ -3,7 +3,7 @@ namespace fs = std::filesystem; -class EnginePaths; +class Engine; class Content; class Level; class Block; @@ -14,11 +14,12 @@ struct item_funcs_set; class BlocksController; namespace scripting { + extern Engine* engine; extern const Content* content; extern Level* level; extern BlocksController* blocks; - void initialize(EnginePaths* paths); + void initialize(Engine* engine); void on_world_load(Level* level, BlocksController* blocks); void on_world_quit(); void update_block(const Block* block, int x, int y, int z); From 6214e1a507cfb9922e90541dded8e6228a042b52 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 17 Jan 2024 23:41:11 +0300 Subject: [PATCH 12/29] randomTick sped up with faster rand implementation --- src/logic/BlocksController.cpp | 16 +++++++++------- src/maths/fastmaths.h | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 src/maths/fastmaths.h diff --git a/src/logic/BlocksController.cpp b/src/logic/BlocksController.cpp index ab308342..d41a822d 100644 --- a/src/logic/BlocksController.cpp +++ b/src/logic/BlocksController.cpp @@ -8,6 +8,7 @@ #include "../content/Content.h" #include "../lighting/Lighting.h" #include "../util/timeutil.h" +#include "../maths/fastmaths.h" #include "scripting/scripting.h" @@ -86,10 +87,13 @@ void BlocksController::update(float delta) { } void BlocksController::randomTick(int tickid, int parts) { - // timeutil::ScopeLogTimer timer(5000+tickid); + timeutil::ScopeLogTimer timer(5000+tickid); const int w = chunks->w; const int d = chunks->d; + int segments = 4; + int segheight = CHUNK_H / segments; auto indices = level->content->getIndices(); + for (uint z = padding; z < d-padding; z++){ for (uint x = padding; x < w-padding; x++){ int index = z * w + x; @@ -98,13 +102,11 @@ void BlocksController::randomTick(int tickid, int parts) { std::shared_ptr chunk = chunks->chunks[index]; if (chunk == nullptr || !chunk->isLighted()) continue; - int segments = 4; - int segheight = CHUNK_H / segments; for (int s = 0; s < segments; s++) { - for (int i = 0; i < 3; i++) { - int bx = rand() % CHUNK_W; - int by = rand() % segheight + s * segheight; - int bz = rand() % CHUNK_D; + for (int i = 0; i < 4; i++) { + int bx = fastmaths::rand() % CHUNK_W; + int by = fastmaths::rand() % segheight + s * segheight; + int bz = fastmaths::rand() % CHUNK_D; const voxel& vox = chunk->voxels[(by * CHUNK_D + bz) * CHUNK_W + bx]; Block* block = indices->getBlockDef(vox.id); if (block->rt.funcsset.randupdate) { diff --git a/src/maths/fastmaths.h b/src/maths/fastmaths.h new file mode 100644 index 00000000..73ea99e5 --- /dev/null +++ b/src/maths/fastmaths.h @@ -0,0 +1,17 @@ +#ifndef MATHS_FASTMATHS_H_ +#define MATHS_FASTMATHS_H_ + +namespace fastmaths { + static unsigned int g_seed; + + inline void srand(int seed) { + g_seed = seed; + } + + inline int rand(void) { + g_seed = (214013*g_seed+2531011); + return (g_seed>>16)&0x7FFF; + } +} + +#endif // MATHS_FASTMATHS_H_ From 097e6fde2f3974fedcebc2797933e5312c48b48e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Jan 2024 00:55:46 +0300 Subject: [PATCH 13/29] removed debug profiling --- src/logic/BlocksController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/BlocksController.cpp b/src/logic/BlocksController.cpp index d41a822d..4d2b3655 100644 --- a/src/logic/BlocksController.cpp +++ b/src/logic/BlocksController.cpp @@ -87,7 +87,7 @@ void BlocksController::update(float delta) { } void BlocksController::randomTick(int tickid, int parts) { - timeutil::ScopeLogTimer timer(5000+tickid); + // timeutil::ScopeLogTimer timer(5000+tickid); const int w = chunks->w; const int d = chunks->d; int segments = 4; From 01344a9d1d2c8b4b7e9b0a0067830693f1203424 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Jan 2024 01:56:41 +0300 Subject: [PATCH 14/29] added ItemDef.stackSize --- src/content/ContentLoader.cpp | 1 + src/items/ItemDef.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index d0cd7e90..20050e58 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -233,6 +233,7 @@ void ContentLoader::loadItem(ItemDef* def, std::string name, fs::path file) { } root->str("icon", def->icon); root->str("placing-block", def->placingBlock); + root->num("stack-size", def->stackSize); // item light emission [r, g, b] where r,g,b in range [0..15] auto emissionarr = root->list("emission"); diff --git a/src/items/ItemDef.h b/src/items/ItemDef.h index 5bfe4d9b..1bcb97df 100644 --- a/src/items/ItemDef.h +++ b/src/items/ItemDef.h @@ -22,6 +22,7 @@ class ItemDef { public: std::string const name; + itemcount_t stackSize = 64; bool generated = false; uint8_t emission[4] {0, 0, 0, 0}; From 9119caca658ec183356e0a5c52434f071f3a9058 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Jan 2024 04:06:27 +0300 Subject: [PATCH 15/29] Delete world feature --- res/texts/en_US.txt | 1 + res/texts/ru_RU.txt | 1 + res/textures/gui/delete_icon.png | Bin 0 -> 1140 bytes res/textures/{ => gui}/menubg.png | Bin src/assets/AssetsLoader.cpp | 3 +- src/frontend/gui/controls.cpp | 47 +++++++++++++++++++++++++++++- src/frontend/gui/controls.h | 29 +++++++++++++++++- src/frontend/gui/panels.cpp | 8 +++-- src/frontend/gui/panels.h | 1 + src/frontend/menu.cpp | 30 +++++++++++++++++-- src/frontend/screens.cpp | 2 +- 11 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 res/textures/gui/delete_icon.png rename res/textures/{ => gui}/menubg.png (100%) diff --git a/res/texts/en_US.txt b/res/texts/en_US.txt index 71db2ddc..f26803bd 100644 --- a/res/texts/en_US.txt +++ b/res/texts/en_US.txt @@ -2,6 +2,7 @@ menu.missing-content=Missing Content! world.convert-request=Content indices have changed! Convert world files? error.pack-not-found=Could not to find pack +world.delete-confirm=Do you want to delete world forever? # Bindings movement.forward=Forward diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index c3b4868a..61a33233 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -24,6 +24,7 @@ world.Name=Название menu.Create World=Создать Мир world.convert-request=Есть изменения в индексах! Конвертировать мир? +world.delete-confirm=Удалить мир безвозвратно? # Настройки settings.Load Distance=Дистанция Загрузки diff --git a/res/textures/gui/delete_icon.png b/res/textures/gui/delete_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d0584f0daeecc418efe69c61822911bd1842dc3b GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9B&p z8d2hwnUl(3Q<_(jS(1~QVmEd3^=UvU36PXaVo554k%5tkzJZ~>p@o8hk(G&om7!&b z^&~Z*8Uc`+kj&gv1_J{tC^CF=SnUwVKCsb6iC{^?gMp$-KtW!RpfgacD3Jj|W&D5t z5-7n9k_b*t%}ZqflTQ_6L5>gx2?wR-rKA=itkE+tSYRIK$iTpy?&;zf62ZB3ns5Hu zK!Ia-!}e~8dt}?iA}FME(IqK6Rb8>n%&uwahJ?&s{)EKj%%{u|opW2KdF*mrdChyv zy<0`L`>UU4p8valPPMnM(f^so&u11tJ2TVxyIGj-&{kOj7kFv!V zDcTE><_;6Y|^}#9$t9<{L;!)GmK2OX2@0+za z@uO#9{I1Sp%8!~?t`*-qkva3A^Q`@P_vSqCunhUKc2n~1g}WYPO>@8Xr{hQGkNB63 zVmHFJSFhtZf3oxE@zQg)x4v_hdph0;RC`waB{Fh`+4~jKOTIp`-S+Is2G3Kb9|O4l zdC#@I*O{-y{H5#N5(c&-=Z|Q+K8{-P$)MEKVaaCC74l1)pYmO9`XwR}*Lj&|8sAO@ zvu|tt{)avmy16ph>A`)Yp0J+^wu?9-LDVd05?lA6C1<)+p;ZDYQ)QZ-|h?y38ycvy0DRA$Uw zSU>rXT$R?HmI-<$n=-0%l~1uwaNBEJrp(|MxkNT`!K1&M%2ca%g|+AFG0f}BY@RA* zDN?rXtYi_Rk!xaDkRHRk>B7#{x061W80v7EmABR8iahETGUD0EaOr4_kMXD3>!N+i z=FNLwYf+GLlvQ?_>O}5@pbgg`<7$!8WUY`4^@d)_Lj~w}W!L&$AxzoZ}}h zIs1Q4=(RQ<*ZK42cNb*)_^3NBy)i9Lx?#?xG?Nvr;V0b!Lc<>H65IM1wn&~mBUw~dAzH_}{?PiM67B?@JvZj)aagYSwj#DfZ%?GO>fUcI zN!lyfrm7u!z_uwanf<}pRW);DjT-nvep??%+0JmM$BgT>_1Dt}_IvR0?O|S#>ts>R zec&v|9Puy4ZCO_UD(S_Ow4O&NtOq8q}vK`#ni3iO{rP_|e1SgOT6qV~TgmzOy_F zN!aA8VNkh{^?lbu){iyb(Z3AlMN3UH`2J~i`FVzaf6g|&$aB?7+tBe*TkDr@UpKdo sp9ITX@p`Oy4Q@<)_{U19K#Ur>mdKI;Vst06I_VLjV8( literal 0 HcmV?d00001 diff --git a/res/textures/menubg.png b/res/textures/gui/menubg.png similarity index 100% rename from res/textures/menubg.png rename to res/textures/gui/menubg.png diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 49328351..e5ab0d79 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -58,7 +58,8 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, bool allAssets) { loader.add(ASSET_SHADER, SHADERS_FOLDER"/ui3d", "ui3d"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/background", "background"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/skybox_gen", "skybox_gen"); - loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/menubg.png", "menubg"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/menubg.png", "gui/menubg"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/delete_icon.png", "gui/delete_icon"); loader.add(ASSET_FONT, FONTS_FOLDER"/font", "normal"); } loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks"); diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index 3315912d..65ce5246 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -62,8 +62,19 @@ void Label::size(vec2 sizenew) { UINode::size(vec2(UINode::size().x, sizenew.y)); } +// ================================= Image ==================================== +Image::Image(string texture, vec2 size) : UINode(vec2(), size), texture(texture) { +} + +void Image::draw(Batch2D* batch, Assets* assets) { + vec2 coord = calcCoord(); + batch->texture(assets->getTexture(texture)); + batch->color = color_; + batch->rect(coord.x, coord.y, size_.x, size_.y, 0, 0, 0, UVRegion(), false, true, color_); +} + // ================================= Button =================================== -Button::Button(shared_ptr content, glm::vec4 padding) : Panel(vec2(32,32), padding, 0) { +Button::Button(shared_ptr content, glm::vec4 padding) : Panel(vec2(34,32), padding, 0) { add(content); scrollable(false); } @@ -100,6 +111,11 @@ Button* Button::textSupplier(wstringsupplier supplier) { } return this; } + +void Button::setHoverColor(glm::vec4 color) { + hoverColor = color; +} + void Button::drawBackground(Batch2D* batch, Assets* assets) { vec2 coord = calcCoord(); batch->texture(nullptr); @@ -133,6 +149,35 @@ void Button::textAlign(Align align) { } } +// ============================== RichButton ================================== +RichButton::RichButton(vec2 size) : Container(vec2(), size) { +} + +void RichButton::mouseRelease(GUI* gui, int x, int y) { + UINode::mouseRelease(gui, x, y); + if (isInside(vec2(x, y))) { + for (auto callback : actions) { + callback(gui); + } + } +} + +RichButton* RichButton::listenAction(onaction action) { + actions.push_back(action); + return this; +} + +void RichButton::setHoverColor(glm::vec4 color) { + hoverColor = color; +} + +void RichButton::drawBackground(Batch2D* batch, Assets* assets) { + vec2 coord = calcCoord(); + batch->texture(nullptr); + batch->color = (ispressed() ? pressedColor : (hover_ ? hoverColor : color_)); + batch->rect(coord.x, coord.y, size_.x, size_.y); +} + // ================================ TextBox =================================== TextBox::TextBox(wstring placeholder, vec4 padding) : Panel(vec2(200,32), padding, 0, false), diff --git a/src/frontend/gui/controls.h b/src/frontend/gui/controls.h index a78bd587..60587248 100644 --- a/src/frontend/gui/controls.h +++ b/src/frontend/gui/controls.h @@ -43,6 +43,15 @@ namespace gui { virtual void size(glm::vec2 size) override; }; + class Image : public UINode { + protected: + std::string texture; + public: + Image(std::string texture, glm::vec2 size); + + virtual void draw(Batch2D* batch, Assets* assets) override; + }; + class Button : public Panel { protected: glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; @@ -55,7 +64,7 @@ namespace gui { glm::vec4 padding=glm::vec4(2.0f), glm::vec4 margin=glm::vec4(1.0f)); - virtual void drawBackground(Batch2D* batch, Assets* assets); + virtual void drawBackground(Batch2D* batch, Assets* assets) override; virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; @@ -68,6 +77,24 @@ namespace gui { virtual std::wstring text() const; virtual Button* textSupplier(wstringsupplier supplier); + + virtual void setHoverColor(glm::vec4 color); + }; + + class RichButton : public Container { + protected: + glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; + glm::vec4 pressedColor {0.0f, 0.0f, 0.0f, 0.95f}; + std::vector actions; + public: + RichButton(glm::vec2 size); + + virtual void drawBackground(Batch2D* batch, Assets* assets) override; + + virtual void mouseRelease(GUI*, int x, int y) override; + virtual RichButton* listenAction(onaction action); + + virtual void setHoverColor(glm::vec4 color); }; class TextBox : public Panel { diff --git a/src/frontend/gui/panels.cpp b/src/frontend/gui/panels.cpp index 338b7b6d..0fb87277 100644 --- a/src/frontend/gui/panels.cpp +++ b/src/frontend/gui/panels.cpp @@ -98,6 +98,11 @@ void Container::add(UINode* node) { add(shared_ptr(node)); } +void Container::add(shared_ptr node, glm::vec2 coord) { + node->setCoord(coord); + add(node); +} + void Container::remove(shared_ptr selected) { selected->setParent(nullptr); nodes.erase(std::remove_if(nodes.begin(), nodes.end(), @@ -190,15 +195,12 @@ void Panel::refresh() { node->refresh(); maxh = fmax(maxh, y+margin.y+node->size().y+margin.w+padding.w); } - bool increased = maxh > size.y; if (resizing_) { if (maxLength_) this->size(vec2(glm::min(maxLength_, (int)(x+padding.z)), size.y)); else this->size(vec2(x+padding.z, size.y)); } - if (increased) - refresh(); actualLength = size.y; } } diff --git a/src/frontend/gui/panels.h b/src/frontend/gui/panels.h index ab81bbe0..a93773ea 100644 --- a/src/frontend/gui/panels.h +++ b/src/frontend/gui/panels.h @@ -39,6 +39,7 @@ namespace gui { virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; virtual void add(std::shared_ptr node); virtual void add(UINode* node); + virtual void add(std::shared_ptr node, glm::vec2 coord); virtual void remove(std::shared_ptr node); virtual void scrolled(int value) override; virtual void scrollable(bool flag); diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index b7d395a9..2410b1ef 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -194,13 +194,37 @@ Panel* create_worlds_panel(Engine* engine) { if (!entry.is_directory()) { continue; } - auto name = entry.path().filename().u8string(); - auto btn = new Button(util::str2wstr_utf8(name), - vec4(10.0f, 8.0f, 10.0f, 8.0f)); + auto folder = entry.path(); + auto name = folder.filename().u8string(); + auto namews = util::str2wstr_utf8(name); + + auto btn = std::make_shared(vec2(390, 46)); btn->color(vec4(1.0f, 1.0f, 1.0f, 0.1f)); + btn->setHoverColor(vec4(1.0f, 1.0f, 1.0f, 0.17f)); + btn->add(std::make_shared