Merge pull request #852 from MihailRis/refactor-world-renderer

update world renderer (part 1)
This commit is contained in:
MihailRis 2026-08-11 19:32:41 +03:00 • committed by GitHub
commit 33053f07ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
45 changed files with 737 additions and 593 deletions

View file

@ -27,7 +27,7 @@ ChunksController::ChunksController(Level& level)
generator(std::make_unique<WorldGenerator>(
level.content.generators.require(level.environment.generator),
level.content,
level.getWorld()->getSeed()
level.getWorld().getSeed()
)) {}
ChunksController::~ChunksController() = default;

View file

@ -314,8 +314,8 @@ void EngineController::setLocalPlayer(int64_t player) {
localPlayer = player;
}
void EngineController::reopenWorld(World* world) {
std::string name = world->wfile->getFolder().name();
void EngineController::reopenWorld(World& world) {
std::string name = world.wfile->getFolder().name();
engine.onWorldClosed();
openWorld(name, true);
}
@ -384,16 +384,16 @@ void EngineController::reconfigPacks(
}
} else {
auto level = controller->getLevel();
auto world = level->getWorld();
auto& world = level->getWorld();
controller->processBeforeQuit();
controller->saveWorld();
auto names = PacksManager::getNames(world->getPacks());
auto names = PacksManager::getNames(world.getPacks());
auto& manager = contentControl.scan();
reconfig_packs_inside(manager, names, packsToAdd, packsToRemove);
const auto& settings = engine.getSettings();
auto& wfile = *world->wfile;
auto& wfile = *world.wfile;
if (!settings.debug.generatorTestMode.get()) {
wfile.removeIndices(packsToRemove);
}

View file

@ -41,5 +41,5 @@ public:
void setLocalPlayer(int64_t player);
void reopenWorld(World* world);
void reopenWorld(World& world);
};

View file

@ -140,16 +140,16 @@ void LevelController::processBeforeQuit() {
}
void LevelController::saveWorld() {
auto world = level->getWorld();
if (world->isNameless()) {
auto& world = level->getWorld();
if (world.isNameless()) {
logger.info() << "nameless world will not be saved";
return;
}
logger.info() << "writing world '" << world->getName() << "'";
world->wfile->createDirectories();
logger.info() << "writing world '" << world.getName() << "'";
world.wfile->createDirectories();
scripting::on_world_save();
level->onSave();
level->getWorld()->write(*level);
level->getWorld().write(*level);
}
void LevelController::onWorldQuit() {

View file

@ -2,6 +2,7 @@
#include "world/Level.hpp"
#include "world/World.hpp"
#include "world/Weather.hpp"
using namespace scripting;
@ -9,6 +10,11 @@ static Weather& require_weather() {
if (level == nullptr) {
throw std::runtime_error("world is not open");
}
if (renderer == nullptr) {
throw std::runtime_error(
"world frontend is not initialized yet (wait for on_hud_open event)"
);
}
return renderer->getWeather();
}

View file

@ -33,7 +33,7 @@ static Level& require_level() {
}
static WorldInfo& require_world_info() {
return require_level().getWorld()->getInfo();
return require_level().getWorld().getInfo();
}
static int l_is_open(lua::State* L) {
@ -139,7 +139,7 @@ static int l_get_chunk_data(lua::State* L) {
auto voxelData = std::make_unique<ubyte[]>(CHUNK_DATA_LEN);
std::vector<ubyte> chunkData;
if (chunk == nullptr) {
auto& regions = level->getWorld()->wfile->getRegions();
auto& regions = level->getWorld().wfile->getRegions();
if (!regions.getVoxels(x, z, voxelData.get())) {
return 0;
}
@ -218,7 +218,7 @@ static int l_save_chunk_data(lua::State* L) {
reinterpret_cast<const ubyte*>(buffer.data()),
reinterpret_cast<const ubyte*>(buffer.data()) + buffer.size()
),
level->getWorld()->wfile->getRegions()
level->getWorld().wfile->getRegions()
);
return 0;
}

View file

@ -310,7 +310,7 @@ void scripting::on_world_load(LevelController* controller) {
for (auto& pack : content_control->getAllContentPacks()) {
lua::emit_event(L, pack.id + ":.worldopen", [](auto L) {
return lua::pushboolean(
L, !scripting::level->getWorld()->getInfo().isLoaded
L, !scripting::level->getWorld().getInfo().isLoaded
);
});
}