From 4a4b80bef3d262fe710bfafc97d197e5c937e9c5 Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Tue, 30 Jan 2024 23:44:07 +0300 Subject: [PATCH 01/12] Spawn different objects withing level --- src/interfaces/Serializable.h | 5 ++--- src/logic/LevelController.cpp | 14 ++++++++++++++ src/logic/PlayerController.cpp | 2 +- src/objects/Object.h | 30 ++++++++++++++++++++++++++++++ src/objects/Player.cpp | 2 +- src/objects/Player.h | 5 +++-- src/world/Level.cpp | 27 +++++++++++++++++++++++++-- src/world/Level.h | 7 ++++++- src/world/World.cpp | 11 +++-------- 9 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 src/objects/Object.h diff --git a/src/interfaces/Serializable.h b/src/interfaces/Serializable.h index a1c0d4e2..ee75498b 100644 --- a/src/interfaces/Serializable.h +++ b/src/interfaces/Serializable.h @@ -4,12 +4,11 @@ #include #include "../coders/json.h" -class Serializable -{ +class Serializable { public: virtual ~Serializable() { } virtual std::unique_ptr serialize() const = 0; virtual void deserialize(dynamic::Map* src) = 0; }; -#endif \ No newline at end of file +#endif /* SERIALIZABLE_H */ \ No newline at end of file diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 84b9ad27..138046d6 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -6,6 +6,7 @@ #include "ChunksController.h" #include "scripting/scripting.h" +#include "../objects/Object.h" LevelController::LevelController(EngineSettings& settings, Level* level) : settings(settings), level(level) { @@ -24,6 +25,19 @@ void LevelController::update(float delta, bool input, bool pause) { level->update(); chunks->update(settings.chunks.loadSpeed); blocks->update(delta); + + // erease null pointers + level->objects.remove_if([](Object* obj) { return obj == nullptr; }); + + // update all objects that needed + for(Object *obj : level->objects) + { + if(obj) { + if(obj->shouldUpdate) { + obj->update(delta); + } + } + } } void LevelController::onWorldSave() { diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 14d6d06c..7a953f15 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -202,7 +202,7 @@ void PlayerController::resetKeyboard() { } void PlayerController::updateControls(float delta){ - player->update(level, input, delta); + player->updateInput(level, input, delta); } void PlayerController::updateInteraction(){ diff --git a/src/objects/Object.h b/src/objects/Object.h new file mode 100644 index 00000000..47be7165 --- /dev/null +++ b/src/objects/Object.h @@ -0,0 +1,30 @@ +#ifndef OBJECT_H +#define OBJECT_H + +#include "stdlib.h" +#include + +class Level; + +class Object { +private: + Level* level; + +public: + int64_t objectUID; + bool shouldUpdate = true; + +public: + virtual ~Object() { destroyed(); } + +public: + virtual void spawned() { } + virtual void update(float delta) { } + virtual void destroyed() { } + +public: + Level* getLevel() { return level; } + void setLevel(Level* lvl) { level = lvl; } +}; + +#endif /* OBJECT_H */ \ No newline at end of file diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 3a5299fa..2a84f8b8 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -33,7 +33,7 @@ Player::Player(glm::vec3 position, float speed) : Player::~Player() { } -void Player::update( +void Player::updateInput( Level* level, PlayerInput& input, float delta) { diff --git a/src/objects/Player.h b/src/objects/Player.h index 390a2147..27bc3e1c 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -8,6 +8,7 @@ #include "../voxels/voxel.h" #include "../settings.h" #include "../interfaces/Serializable.h" +#include "../objects/Object.h" class Camera; class Hitbox; @@ -32,7 +33,7 @@ struct PlayerInput { bool flight; }; -class Player : Serializable { +class Player : Object, Serializable { float speed; int chosenSlot; glm::vec3 spawnpoint {}; @@ -52,7 +53,7 @@ public: ~Player(); void teleport(glm::vec3 position); - void update(Level* level, PlayerInput& input, float delta); + void updateInput(Level* level, PlayerInput& input, float delta); void attemptToFindSpawnpoint(Level* level); diff --git a/src/world/Level.cpp b/src/world/Level.cpp index f49d4ad6..acd550fb 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -8,17 +8,24 @@ #include "../voxels/ChunksStorage.h" #include "../physics/Hitbox.h" #include "../physics/PhysicsSolver.h" +#include "../objects/Object.h" #include "../objects/Player.h" -Level::Level(World* world, const Content* content, Player* player, EngineSettings& settings) + +const float DEF_PLAYER_Y = 100.0f; +const float DEF_PLAYER_SPEED = 4.0f; + +Level::Level(World* world, const Content* content, EngineSettings& settings) : world(world), content(content), - player(player), chunksStorage(new ChunksStorage(this)), events(new LevelEvents()) , settings(settings) { physics = new PhysicsSolver(glm::vec3(0, -22.6f, 0)); + player = spawnObjectOfClass(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED); + + uint matrixSize = (settings.chunks.loadDistance+ settings.chunks.padding) * 2; chunks = new Chunks(matrixSize, matrixSize, 0, 0, @@ -53,3 +60,19 @@ void Level::update() { World* Level::getWorld() { return world.get(); } + +// Spawns object of class T and returns pointer to it. +// @param T class that derives the Object class +// @param args pass arguments needed for T class constructor +template +T* Level::spawnObjectOfClass(Args&&... args) +{ + static_assert(std::is_base_of::value, "T must be a derived of Object class"); + T* tObj = new T(args...); + Object* obj = reinterpret_cast(tObj); + objects.push_back(obj); + obj->objectUID = std::rand(); + obj->setLevel(this); + obj->spawned(); + return tObj; +} diff --git a/src/world/Level.h b/src/world/Level.h index 0e2df5cc..7550005c 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -5,10 +5,12 @@ #include "../typedefs.h" #include "../settings.h" +#include class Content; class World; class Player; +class Object; class Chunks; class LevelEvents; class Lighting; @@ -19,6 +21,7 @@ class Level { public: std::unique_ptr world; const Content* const content; + std::list objects; Player* player; Chunks* chunks; ChunksStorage* chunksStorage; @@ -31,13 +34,15 @@ public: Level(World* world, const Content* content, - Player* player, EngineSettings& settings); ~Level(); void update(); World* getWorld(); + + template + T* spawnObjectOfClass(Args&&... args); }; #endif /* WORLD_LEVEL_H_ */ diff --git a/src/world/World.cpp b/src/world/World.cpp index 29997e61..1e0520c0 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -62,9 +62,6 @@ void World::write(Level* level) { wfile->writePlayer(level->player); } -const float DEF_PLAYER_Y = 100.0f; -const float DEF_PLAYER_SPEED = 4.0f; - Level* World::create(std::string name, fs::path directory, uint64_t seed, @@ -72,8 +69,7 @@ Level* World::create(std::string name, const Content* content, const std::vector& packs) { World* world = new World(name, directory, seed, settings, content, packs); - Player* player = new Player(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED); - return new Level(world, content, player, settings); + return new Level(world, content, settings); } ContentLUT* World::checkIndices(const fs::path& directory, @@ -98,9 +94,8 @@ Level* World::load(fs::path directory, throw world_load_error("could not to find world.json"); } - Player* player = new Player(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED); - Level* level = new Level(world.get(), content, player, settings); - wfile->readPlayer(player); + Level* level = new Level(world.get(), content, settings); + wfile->readPlayer(level->player); world.release(); return level; From 102ec6d865ec9fbfd5de8e5e39e5be989ce88734 Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Mon, 19 Feb 2024 10:26:48 +0300 Subject: [PATCH 02/12] public inheritance --- src/items/Inventory.h | 2 +- src/objects/Player.h | 2 +- src/world/World.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/items/Inventory.h b/src/items/Inventory.h index 68226598..4a14f990 100644 --- a/src/items/Inventory.h +++ b/src/items/Inventory.h @@ -13,7 +13,7 @@ class ContentLUT; class ContentIndices; -class Inventory : Serializable { +class Inventory : public Serializable { int64_t id; std::vector slots; public: diff --git a/src/objects/Player.h b/src/objects/Player.h index 8ebcac54..22b1d859 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -33,7 +33,7 @@ struct PlayerInput { bool flight; }; -class Player : Object, Serializable { +class Player : public Object, public Serializable { float speed; int chosenSlot; glm::vec3 spawnpoint {}; diff --git a/src/world/World.h b/src/world/World.h index ca242d60..faf142e7 100644 --- a/src/world/World.h +++ b/src/world/World.h @@ -26,7 +26,7 @@ public: world_load_error(std::string message); }; -class World : Serializable { +class World : public Serializable { std::string name; uint64_t seed; EngineSettings& settings; From c6e3869176d592fb90d2c6c8f21ffbdc17556129 Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Tue, 30 Jan 2024 23:48:39 +0300 Subject: [PATCH 03/12] Spawn different objects withing level --- src/objects/Object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objects/Object.h b/src/objects/Object.h index 47be7165..b0ff7e49 100644 --- a/src/objects/Object.h +++ b/src/objects/Object.h @@ -15,7 +15,7 @@ public: bool shouldUpdate = true; public: - virtual ~Object() { destroyed(); } + ~Object() { destroyed(); } public: virtual void spawned() { } From f717e1c10969223901ad2a67523fbd8d0ac0cd2d Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Mon, 19 Feb 2024 11:43:53 +0300 Subject: [PATCH 04/12] spawning objects --- src/frontend/hud.cpp | 2 +- src/{objects => interfaces}/Object.h | 7 +------ src/logic/LevelController.cpp | 8 +++---- src/logic/PlayerController.cpp | 4 ++-- src/logic/PlayerController.h | 6 +++--- src/logic/scripting/lua/api_lua.cpp | 2 +- src/objects/Player.h | 2 +- src/world/Level.cpp | 31 +++++++++++++++------------- src/world/Level.h | 10 ++++++--- src/world/World.cpp | 10 +++------ 10 files changed, 40 insertions(+), 42 deletions(-) rename src/{objects => interfaces}/Object.h (70%) diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index cd94dd65..a4014bf7 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -630,5 +630,5 @@ void Hud::setPause(bool pause) { } Player* Hud::getPlayer() const { - return frontend->getLevel()->player; + return frontend->getLevel()->player.get(); } diff --git a/src/objects/Object.h b/src/interfaces/Object.h similarity index 70% rename from src/objects/Object.h rename to src/interfaces/Object.h index b0ff7e49..5f9aae83 100644 --- a/src/objects/Object.h +++ b/src/interfaces/Object.h @@ -8,10 +8,9 @@ class Level; class Object { private: - Level* level; public: - int64_t objectUID; + uint64_t objectUID; bool shouldUpdate = true; public: @@ -21,10 +20,6 @@ public: virtual void spawned() { } virtual void update(float delta) { } virtual void destroyed() { } - -public: - Level* getLevel() { return level; } - void setLevel(Level* lvl) { level = lvl; } }; #endif /* OBJECT_H */ \ No newline at end of file diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp index 63a56901..94a82062 100644 --- a/src/logic/LevelController.cpp +++ b/src/logic/LevelController.cpp @@ -6,7 +6,7 @@ #include "ChunksController.h" #include "scripting/scripting.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" LevelController::LevelController(EngineSettings& settings, Level* level) : settings(settings), level(level) { @@ -26,11 +26,11 @@ void LevelController::update(float delta, bool input, bool pause) { chunks->update(settings.chunks.loadSpeed); // erease null pointers - level->objects.remove_if([](Object* obj) { return obj == nullptr; }); - + level->objects.remove_if([](auto obj) { return obj == nullptr; }); + if (!pause) { // update all objects that needed - for(Object *obj : level->objects) + for(auto obj : level->objects) { if(obj) { if(obj->shouldUpdate) { diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index b9d822ab..ab44336e 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -31,7 +31,7 @@ const float C_ZOOM = 0.1f; const float CROUCH_SHIFT_Y = -0.2f; -CameraControl::CameraControl(Player* player, const CameraSettings& settings) +CameraControl::CameraControl(std::shared_ptr player, const CameraSettings& settings) : player(player), camera(player->camera), currentViewCamera(player->currentCamera), @@ -208,7 +208,7 @@ void PlayerController::updateControls(float delta){ void PlayerController::updateInteraction(){ auto indices = level->content->getIndices(); Chunks* chunks = level->chunks; - Player* player = level->player; + Player* player = level->player.get(); Lighting* lighting = level->lighting; Camera* camera = player->camera.get(); glm::vec3 end; diff --git a/src/logic/PlayerController.h b/src/logic/PlayerController.h index d9d002d6..a1479820 100644 --- a/src/logic/PlayerController.h +++ b/src/logic/PlayerController.h @@ -12,7 +12,7 @@ class Level; class BlocksController; class CameraControl { - Player* player; + std::shared_ptr player; std::shared_ptr camera, currentViewCamera; const CameraSettings& settings; glm::vec3 offset; @@ -20,7 +20,7 @@ class CameraControl { float shakeTimer = 0.0f; glm::vec3 interpVel {0.0f}; public: - CameraControl(Player* player, const CameraSettings& settings); + CameraControl(std::shared_ptr player, const CameraSettings& settings); void updateMouse(PlayerInput& input); void update(PlayerInput& input, float delta, Chunks* chunks); void refresh(); @@ -28,7 +28,7 @@ public: class PlayerController { Level* level; - Player* player; + std::shared_ptr player; PlayerInput input; CameraControl camControl; BlocksController* blocksController; diff --git a/src/logic/scripting/lua/api_lua.cpp b/src/logic/scripting/lua/api_lua.cpp index 88835056..ea738e85 100644 --- a/src/logic/scripting/lua/api_lua.cpp +++ b/src/logic/scripting/lua/api_lua.cpp @@ -191,7 +191,7 @@ int l_player_get_inv(lua_State* L) { int playerid = lua_tointeger(L, 1); if (playerid != 1) return 0; - Player* player = scripting::level->player; + auto player = scripting::level->player; lua_pushinteger(L, player->getInventory()->getId()); lua_pushinteger(L, player->getChosenSlot()); return 2; diff --git a/src/objects/Player.h b/src/objects/Player.h index 22b1d859..bea94c2b 100644 --- a/src/objects/Player.h +++ b/src/objects/Player.h @@ -8,7 +8,7 @@ #include "../voxels/voxel.h" #include "../settings.h" #include "../interfaces/Serializable.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" class Camera; class Hitbox; diff --git a/src/world/Level.cpp b/src/world/Level.cpp index 58ca2236..287607ed 100644 --- a/src/world/Level.cpp +++ b/src/world/Level.cpp @@ -8,7 +8,7 @@ #include "../voxels/ChunksStorage.h" #include "../physics/Hitbox.h" #include "../physics/PhysicsSolver.h" -#include "../objects/Object.h" +#include "../interfaces/Object.h" #include "../objects/Player.h" #include "../items/Inventory.h" #include "../items/Inventories.h" @@ -25,11 +25,10 @@ Level::Level(World* world, const Content* content, EngineSettings& settings) events(new LevelEvents()) , settings(settings) { + objCounter = 0; physics = new PhysicsSolver(glm::vec3(0, -22.6f, 0)); - - auto inv = std::make_shared(0, DEF_PLAYER_INVENTORY_SIZE); - player = spawnObjectOfClass(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED, inv); - + auto inv = std::make_shared(world->getNextInventoryId(), DEF_PLAYER_INVENTORY_SIZE); + player = spawnObject(glm::vec3(0, DEF_PLAYER_Y, 0), DEF_PLAYER_SPEED, inv); uint matrixSize = (settings.chunks.loadDistance+ settings.chunks.padding) * 2; @@ -42,15 +41,20 @@ Level::Level(World* world, const Content* content, EngineSettings& settings) }); inventories = std::make_unique(*this); + inventories->store(player->getInventory()); } Level::~Level(){ delete chunks; delete events; delete physics; - delete player; delete lighting; delete chunksStorage; + + for(auto obj : objects) + { + obj.reset(); + } } void Level::update() { @@ -68,18 +72,17 @@ World* Level::getWorld() { return world.get(); } -// Spawns object of class T and returns pointer to it. -// @param T class that derives the Object class -// @param args pass arguments needed for T class constructor + template -T* Level::spawnObjectOfClass(Args&&... args) +std::shared_ptr Level::spawnObject(Args&&... args) { static_assert(std::is_base_of::value, "T must be a derived of Object class"); - T* tObj = new T(args...); - Object* obj = reinterpret_cast(tObj); + std::shared_ptr tObj = std::make_shared(args...); + + std::shared_ptr obj = std::dynamic_pointer_cast(tObj); objects.push_back(obj); - obj->objectUID = std::rand(); - obj->setLevel(this); + obj->objectUID = objCounter; obj->spawned(); + objCounter += 1; return tObj; } diff --git a/src/world/Level.h b/src/world/Level.h index 01b74b17..da7f4ce1 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -6,6 +6,8 @@ #include "../typedefs.h" #include "../settings.h" #include +#include +#include class Content; class World; @@ -20,11 +22,13 @@ class PhysicsSolver; class ChunksStorage; class Level { +private: + int objCounter; public: std::unique_ptr world; const Content* const content; - std::list objects; - Player* player; + std::list> objects; + std::shared_ptr player; Chunks* chunks; ChunksStorage* chunksStorage; std::unique_ptr inventories; @@ -45,7 +49,7 @@ public: World* getWorld(); template - T* spawnObjectOfClass(Args&&... args); + std::shared_ptr spawnObject(Args&&... args); }; #endif /* WORLD_LEVEL_H_ */ diff --git a/src/world/World.cpp b/src/world/World.cpp index 1df6283f..14985b39 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -61,20 +61,17 @@ void World::write(Level* level) { } wfile->write(this, content); - wfile->writePlayer(level->player); + wfile->writePlayer(level->player.get()); } - Level* World::create(std::string name, fs::path directory, uint64_t seed, EngineSettings& settings, const Content* content, const std::vector& packs) { - auto world = new World(name, directory, seed, settings, content, packs); auto level = new Level(world, content, settings); - level->inventories->store(level->player->getInventory()); return level; } @@ -91,9 +88,8 @@ Level* World::load(fs::path directory, throw world_load_error("could not to find world.json"); } - Level* level = new Level(world.get(), content, settings); - wfile->readPlayer(level->player); - level->inventories->store(level->player->getInventory()); + auto level = new Level(world.get(), content, settings); + wfile->readPlayer(level->player.get()); world.release(); return level; } From cce4bfb63719cdce04844efab623ab63a72df43e Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Mon, 19 Feb 2024 10:10:53 +0300 Subject: [PATCH 05/12] spawning objects --- src/interfaces/Object.h | 4 ++-- src/world/Level.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/interfaces/Object.h b/src/interfaces/Object.h index 5f9aae83..5ffe1cb6 100644 --- a/src/interfaces/Object.h +++ b/src/interfaces/Object.h @@ -17,9 +17,9 @@ public: ~Object() { destroyed(); } public: - virtual void spawned() { } + virtual void spawned() { } virtual void update(float delta) { } - virtual void destroyed() { } + virtual void destroyed() { } }; #endif /* OBJECT_H */ \ No newline at end of file diff --git a/src/world/Level.h b/src/world/Level.h index da7f4ce1..fbf9d283 100644 --- a/src/world/Level.h +++ b/src/world/Level.h @@ -48,6 +48,9 @@ public: World* getWorld(); + // Spawns object of class T and returns pointer to it. + // @param T class that derives the Object class + // @param args pass arguments needed for T class constructor template std::shared_ptr spawnObject(Args&&... args); }; From 27da72973ee68da8e0b34555cdb0a6f2c954ae73 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 09:05:25 +0300 Subject: [PATCH 06/12] small optimization --- src/graphics/BlocksRenderer.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/graphics/BlocksRenderer.cpp b/src/graphics/BlocksRenderer.cpp index 70271c31..14bdf0cd 100644 --- a/src/graphics/BlocksRenderer.cpp +++ b/src/graphics/BlocksRenderer.cpp @@ -102,13 +102,9 @@ void BlocksRenderer::face(const vec3& coord, void BlocksRenderer::vertex(const vec3& coord, float u, float v, const vec4& tint, - const vec3& X, - const vec3& Y, - const vec3& Z) { - // TODO: optimize - vec3 axisX = glm::normalize(X); - vec3 axisY = glm::normalize(Y); - vec3 axisZ = glm::normalize(Z); + const vec3& axisX, + const vec3& axisY, + const vec3& axisZ) { vec3 pos = coord+axisZ*0.5f+(axisX+axisY)*0.5f; vec4 light = pickSoftLight(ivec3(round(pos.x), round(pos.y), round(pos.z)), axisX, axisY); vertex(coord, u, v, light * tint); @@ -130,11 +126,15 @@ void BlocksRenderer::face(const vec3& coord, float d = glm::dot(Z, SUN_VECTOR); d = 0.8f + d * 0.2f; + vec3 axisX = glm::normalize(X); + vec3 axisY = glm::normalize(Y); + vec3 axisZ = glm::normalize(Z); + vec4 tint(d); - vertex(coord + (-X - Y + Z) * s, region.u1, region.v1, tint, X, Y, Z); - vertex(coord + ( X - Y + Z) * s, region.u2, region.v1, tint, X, Y, Z); - vertex(coord + ( X + Y + Z) * s, region.u2, region.v2, tint, X, Y, Z); - vertex(coord + (-X + Y + Z) * s, region.u1, region.v2, tint, X, Y, Z); + vertex(coord + (-X - Y + Z) * s, region.u1, region.v1, tint, axisX, axisY, axisZ); + vertex(coord + ( X - Y + Z) * s, region.u2, region.v1, tint, axisX, axisY, axisZ); + vertex(coord + ( X + Y + Z) * s, region.u2, region.v2, tint, axisX, axisY, axisZ); + vertex(coord + (-X + Y + Z) * s, region.u1, region.v2, tint, axisX, axisY, axisZ); } else { vec4 tint(1.0f); vertex(coord + (-X - Y + Z) * s, region.u1, region.v1, tint); @@ -142,7 +142,7 @@ void BlocksRenderer::face(const vec3& coord, vertex(coord + ( X + Y + Z) * s, region.u2, region.v2, tint); vertex(coord + (-X + Y + Z) * s, region.u1, region.v2, tint); } - index(0, 1, 2, 0, 2, 3); + index(0, 1, 2, 0, 2, 3); } void BlocksRenderer::tetragonicFace(const vec3& coord, const vec3& p1, From a44a9be28e14529e1393d209a08e9402a53cf02c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 09:08:24 +0300 Subject: [PATCH 07/12] fix --- src/logic/scripting/lua/libplayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logic/scripting/lua/libplayer.cpp b/src/logic/scripting/lua/libplayer.cpp index cbf1fe47..dfb8fc16 100644 --- a/src/logic/scripting/lua/libplayer.cpp +++ b/src/logic/scripting/lua/libplayer.cpp @@ -57,7 +57,7 @@ int l_player_get_inv(lua_State* L) { int playerid = lua_tointeger(L, 1); if (playerid != 1) return 0; - Player* player = scripting::level->player; + auto player = scripting::level->player; lua_pushinteger(L, player->getInventory()->getId()); lua_pushinteger(L, player->getChosenSlot()); return 2; From 241570ac82d4a25d226912cba66aaa191cbf59f4 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 09:09:17 +0300 Subject: [PATCH 08/12] removed extra workflow --- .github/workflows/appimage-wayland.yml | 42 -------------------------- 1 file changed, 42 deletions(-) delete mode 100644 .github/workflows/appimage-wayland.yml diff --git a/.github/workflows/appimage-wayland.yml b/.github/workflows/appimage-wayland.yml deleted file mode 100644 index f59902f7..00000000 --- a/.github/workflows/appimage-wayland.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: C/C++ AppImage (wayland) - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build-appimage: - - strategy: - matrix: - include: - - os: ubuntu-latest - - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v2 - with: - submodules: 'true' - - name: install dependencies - run: | - sudo apt-get update - sudo apt-get install -y build-essential libglfw3-wayland libglfw3-dev libglew-dev libglm-dev libpng-dev libopenal-dev libluajit-5.1-dev cmake squashfs-tools - sudo ln -s /usr/lib/x86_64-linux-gnu/libluajit-5.1.a /usr/lib/x86_64-linux-gnu/liblua5.1.a - sudo ln -s /usr/include/luajit-2.1 /usr/include/lua - - name: configure - run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DVOXELENGINE_BUILD_APPDIR=1 - - name: build - run: cmake --build build -t install - - name: Build AppImage - uses: AppImageCrafters/build-appimage-action@fe2205a4d6056be47051f7b1b3811106e9814910 - env: - UPDATE_INFO: gh-releases-zsync|MihailRis|VoxelEngine-Cpp|latest|*x86_64.AppImage.zsync - with: - recipe: dev/AppImageBuilder.yml - - uses: actions/upload-artifact@v2 - with: - name: AppImage - path: './*.AppImage*' From fcb396344c8c4334c824a6826037f78eec241332 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 11:20:53 +0300 Subject: [PATCH 09/12] auto lua modules removal on quit --- res/scripts/stdlib.lua | 32 +++++++++++++++++++------------ src/logic/scripting/scripting.cpp | 3 +++ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 370d4eef..44e6e3f4 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -20,8 +20,10 @@ function parse_path(path) return string.sub(path, 1, index-1), string.sub(path, index+1, -1) end +package = { + loaded={} +} local __cached_scripts = {} -local __cached_results = {} -- Load script with caching -- @@ -31,38 +33,44 @@ local __cached_results = {} -- nocache - ignore cached script, load anyway function load_script(path, nocache) local packname, filename = parse_path(path) - local fullpath = file.resolve(path); -- __cached_scripts used in condition because cached result may be nil - if not nocache and __cached_scripts[fullpath] ~= nil then - return __cached_results[fullpath] + if not nocache and __cached_scripts[path] ~= nil then + return package.loaded[path] end if not file.isfile(path) then error("script '"..filename.."' not found in '"..packname.."'") end - local script, err = loadfile(fullpath) + local script, err = loadfile(file.resolve(path)) if script == nil then error(err) end local result = script() if not nocache then - __cached_scripts[fullpath] = script - __cached_results[fullpath] = result + __cached_scripts[path] = script + package.loaded[path] = result end return result end +function __scripts_cleanup() + print("cleaning scripts cache") + for k, v in pairs(__cached_scripts) do + local packname, _ = parse_path(k) + if packname ~= "core" then + print("unloaded "..k) + __cached_scripts[k] = nil + package.loaded[k] = nil + end + end +end + function require(path) local prefix, file = parse_path(path) return load_script(prefix..":modules/"..file..".lua") end -function __reset_scripts_cache() - __cached_scripts = {} - __cached_results = {} -end - function sleep(timesec) local start = time.uptime() while time.uptime() - start < timesec do diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 26d55047..6ea8da5b 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -124,6 +124,9 @@ void scripting::on_world_quit() { state->callNoThrow(0); } } + if (state->getglobal("__scripts_cleanup")) { + state->callNoThrow(0); + } scripting::level = nullptr; scripting::content = nullptr; scripting::indices = nullptr; From 34815cfd9c2b77595d482044894a881d49b8756f Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 14:18:25 +0300 Subject: [PATCH 10/12] minor refactor --- src/lighting/Lightmap.h | 4 ++-- src/window/Window.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lighting/Lightmap.h b/src/lighting/Lightmap.h index 16a273dd..12d2b586 100644 --- a/src/lighting/Lightmap.h +++ b/src/lighting/Lightmap.h @@ -73,11 +73,11 @@ public: return map; } - static inline light_t combine(int r, int g, int b, int s) { + static constexpr light_t combine(int r, int g, int b, int s) { return r | (g << 4) | (b << 8) | (s << 12); } - static inline light_t extract(light_t light, ubyte channel) { + static constexpr light_t extract(light_t light, ubyte channel) { return (light >> (channel << 2)) & 0xF; } diff --git a/src/window/Window.h b/src/window/Window.h index 751c2058..9712c588 100644 --- a/src/window/Window.h +++ b/src/window/Window.h @@ -9,9 +9,9 @@ #include -class GLFWwindow; class ImageData; struct DisplaySettings; +struct GLFWwindow; struct GLFWmonitor; enum class blendmode { From a5925135a4069a7a55b1599ef5f802d4e6544212 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 21 Feb 2024 15:21:26 +0300 Subject: [PATCH 11/12] lua: textbox.text, placeholder properties --- src/frontend/gui/controls.cpp | 10 ++++++++- src/frontend/gui/controls.h | 2 ++ src/logic/scripting/lua/libgui.cpp | 36 +++++++++++++++++++++++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index 3e68f392..1328b4dc 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -361,10 +361,18 @@ std::wstring TextBox::getText() const { return input; } -void TextBox::setText(std::wstring value) { +void TextBox::setText(const std::wstring value) { this->input = value; } +std::wstring TextBox::getPlaceholder() const { + return placeholder; +} + +void TextBox::setPlaceholder(const std::wstring& placeholder) { + this->placeholder = placeholder; +} + // ============================== InputBindBox ================================ InputBindBox::InputBindBox(Binding& binding, glm::vec4 padding) : Panel(glm::vec2(100,32), padding, 0), diff --git a/src/frontend/gui/controls.h b/src/frontend/gui/controls.h index fd62f0db..1d0cb1ea 100644 --- a/src/frontend/gui/controls.h +++ b/src/frontend/gui/controls.h @@ -122,6 +122,8 @@ namespace gui { virtual std::wstring getText() const; /* Set TextBox content text */ virtual void setText(std::wstring value); + virtual std::wstring getPlaceholder() const; + virtual void setPlaceholder(const std::wstring&); virtual bool validate(); virtual void setValid(bool valid); virtual bool isValid() const; diff --git a/src/logic/scripting/lua/libgui.cpp b/src/logic/scripting/lua/libgui.cpp index cdcc6561..d83c57f9 100644 --- a/src/logic/scripting/lua/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -103,6 +103,29 @@ static bool getattr(lua_State* L, gui::FullCheckBox* box, const std::string& att return false; } +static bool getattr(lua_State* L, gui::TextBox* box, const std::string& attr) { + if (box == nullptr) + return false; + if (attr == "text") { + lua_pushstring(L, util::wstr2str_utf8(box->getText()).c_str()); + return true; + } else if (attr == "placeholder") { + lua_pushstring(L, util::wstr2str_utf8(box->getPlaceholder()).c_str()); + return true; + } + return false; +} + +static bool setattr(lua_State* L, gui::FullCheckBox* box, const std::string& attr) { + if (box == nullptr) + return false; + if (attr == "checked") { + box->setChecked(lua_toboolean(L, 4)); + return true; + } + return false; +} + static bool setattr(lua_State* L, gui::Button* button, const std::string& attr) { if (button == nullptr) return false; @@ -115,11 +138,14 @@ static bool setattr(lua_State* L, gui::Button* button, const std::string& attr) return false; } -static bool setattr(lua_State* L, gui::FullCheckBox* box, const std::string& attr) { +static bool setattr(lua_State* L, gui::TextBox* box, const std::string& attr) { if (box == nullptr) return false; - if (attr == "checked") { - box->setChecked(lua_toboolean(L, 4)); + if (attr == "text") { + box->setText(util::str2wstr_utf8(lua_tostring(L, 4))); + return true; + } else if (attr == "placeholder") { + box->setPlaceholder(util::str2wstr_utf8(lua_tostring(L, 4))); return true; } return false; @@ -161,6 +187,8 @@ int l_gui_getattr(lua_State* L) { return 1; if (getattr(L, dynamic_cast(node), attr)) return 1; + if (getattr(L, dynamic_cast(node), attr)) + return 1; if (getattr(L, dynamic_cast(node), attr)) return 1; if (getattr(L, dynamic_cast(node), attr)) @@ -197,6 +225,8 @@ int l_gui_setattr(lua_State* L) { return 0; if (setattr(L, dynamic_cast(node), attr)) return 0; + if (setattr(L, dynamic_cast(node), attr)) + return 0; if (setattr(L, dynamic_cast(node), attr)) return 0; if (setattr(L, dynamic_cast(node), attr)) From 0b31a19f470a42baa8d1e03cbf81bb0ddc83fb7a Mon Sep 17 00:00:00 2001 From: DanielProl1xy Date: Wed, 21 Feb 2024 15:27:00 +0300 Subject: [PATCH 12/12] propogate player smart-pointer usage --- src/files/WorldFiles.cpp | 4 ++-- src/files/WorldFiles.h | 4 ++-- src/frontend/hud.cpp | 4 ++-- src/frontend/hud.h | 2 +- src/world/World.cpp | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/files/WorldFiles.cpp b/src/files/WorldFiles.cpp index 62b79a41..24c3dfe4 100644 --- a/src/files/WorldFiles.cpp +++ b/src/files/WorldFiles.cpp @@ -559,11 +559,11 @@ bool WorldFiles::readWorldInfo(World* world) { return true; } -void WorldFiles::writePlayer(Player* player) { +void WorldFiles::writePlayer(std::shared_ptr player) { files::write_json(getPlayerFile(), player->serialize().release()); } -bool WorldFiles::readPlayer(Player* player) { +bool WorldFiles::readPlayer(std::shared_ptr player) { fs::path file = getPlayerFile(); if (!fs::is_regular_file(file)) { std::cerr << "warning: player.json does not exists" << std::endl; diff --git a/src/files/WorldFiles.h b/src/files/WorldFiles.h index 34203b97..a3a9a483 100644 --- a/src/files/WorldFiles.h +++ b/src/files/WorldFiles.h @@ -143,13 +143,13 @@ public: chunk_inventories_map fetchInventories(int x, int z); bool readWorldInfo(World* world); - bool readPlayer(Player* player); + bool readPlayer(std::shared_ptr player); void writeRegion(int x, int y, WorldRegion* entry, fs::path file, int layer); - void writePlayer(Player* player); + void writePlayer(std::shared_ptr player); /* @param world world info to save (nullable) */ void write(const World* world, const Content* content); void writePacks(const World* world); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 0d93f404..c2fec154 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -645,6 +645,6 @@ void Hud::setPause(bool pause) { menu->setVisible(pause); } -Player* Hud::getPlayer() const { - return frontend->getLevel()->player.get(); +std::shared_ptr Hud::getPlayer() const { + return frontend->getLevel()->player; } diff --git a/src/frontend/hud.h b/src/frontend/hud.h index 7e9e2153..5a5b8914 100644 --- a/src/frontend/hud.h +++ b/src/frontend/hud.h @@ -118,7 +118,7 @@ public: void remove(HudElement& element); void remove(std::shared_ptr node); - Player* getPlayer() const; + std::shared_ptr getPlayer() const; }; #endif /* SRC_HUD_H_ */ diff --git a/src/world/World.cpp b/src/world/World.cpp index 14985b39..fce0b05c 100644 --- a/src/world/World.cpp +++ b/src/world/World.cpp @@ -61,7 +61,7 @@ void World::write(Level* level) { } wfile->write(this, content); - wfile->writePlayer(level->player.get()); + wfile->writePlayer(level->player); } Level* World::create(std::string name, @@ -89,7 +89,7 @@ Level* World::load(fs::path directory, } auto level = new Level(world.get(), content, settings); - wfile->readPlayer(level->player.get()); + wfile->readPlayer(level->player); world.release(); return level; }