From 903d37e5352b214de0fa74645c53eed027ca47db Mon Sep 17 00:00:00 2001 From: proller Date: Sun, 15 Dec 2024 23:00:05 +0100 Subject: [PATCH] wip --- builtin/settingtypes.txt | 3 +++ src/client/fm_far_calc.cpp | 8 +++----- src/client/fm_far_calc.h | 4 ++-- src/client/fm_farmesh.cpp | 17 ++++++++++++++--- src/defaultsettings.cpp | 2 ++ src/fm_clientiface.cpp | 24 +++++++++++++++++------- 6 files changed, 41 insertions(+), 17 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index d0132484b..35311576f 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -114,6 +114,9 @@ farmesh_quality () int 2 # Farmesh map data from server farmesh_server () bool true +# Use all changed blocks in radius +farmesh_all_changed () int 10000 + # Set to true to disable wield light (enabled by default, requires shaders) disable_wieldlight () bool false diff --git a/src/client/fm_far_calc.cpp b/src/client/fm_far_calc.cpp index 5247c570a..ecd1bfaae 100644 --- a/src/client/fm_far_calc.cpp +++ b/src/client/fm_far_calc.cpp @@ -23,7 +23,6 @@ along with Freeminer. If not, see . #include #include "client/clientmap.h" -#include "constants.h" #include "irr_v3d.h" #include "irrlichttypes.h" @@ -359,9 +358,8 @@ void each(const each_param_t ¶m, const child_t &child) } } -void runFarAll(const MapDrawControl &draw_control, const v3bpos_t &ppos, - uint8_t cell_size_pow, pos_t two_d, - const std::function &func) +void runFarAll(const v3bpos_t &ppos, uint8_t cell_size_pow, uint8_t farmesh_quality, + pos_t two_d, const std::function &func) { const auto start = @@ -382,7 +380,7 @@ void runFarAll(const MapDrawControl &draw_control, const v3bpos_t &ppos, each({.player_pos{ppos.X, ppos.Y, ppos.Z}, .cell_size_pow{cell_size_pow}, - .farmesh_quality{draw_control.farmesh_quality}, + .farmesh_quality{farmesh_quality}, .func{func_convert}, .two_d{static_cast(two_d)}}, start); diff --git a/src/client/fm_far_calc.h b/src/client/fm_far_calc.h index ee5b1fd53..51add1a62 100644 --- a/src/client/fm_far_calc.h +++ b/src/client/fm_far_calc.h @@ -55,6 +55,6 @@ v3bpos_t getFarActual(const v3bpos_t &blockpos, const v3bpos_t &playerblockpos, block_step_t step, const MapDrawControl &draw_control); v3bpos_t playerBlockAlign( const MapDrawControl &draw_control, const v3bpos_t &playerblockpos); -void runFarAll(const MapDrawControl &draw_control, const v3bpos_t &ppos, - uint8_t cell_size_pow, pos_t two_d, +void runFarAll(const v3bpos_t &ppos, + uint8_t cell_size_pow, uint8_t farmesh_quality, pos_t two_d, const std::function &func); diff --git a/src/client/fm_farmesh.cpp b/src/client/fm_farmesh.cpp index e30b7ad88..1855beac9 100644 --- a/src/client/fm_farmesh.cpp +++ b/src/client/fm_farmesh.cpp @@ -271,9 +271,19 @@ int FarMesh::go_container() const auto &draw_control = m_client->getEnv().getClientMap().getControl(); const auto cbpos = getNodeBlockPos(m_camera_pos_aligned); - runFarAll(draw_control, cbpos, draw_control.cell_size_pow, false, - [this](const v3bpos_t &bpos, const bpos_t &size) -> bool { + thread_local static const s16 farmesh_all_changed = + g_settings->getU32("farmesh_all_changed"); + + runFarAll(cbpos, draw_control.cell_size_pow, draw_control.farmesh_quality, 0, + [this, &cbpos](const v3bpos_t &bpos, const bpos_t &size) -> bool { const block_step_t step = log(size) / log(2); + + // TODO: use block center + const auto bdist = radius_box(cbpos, bpos); + if ((bdist << MAP_BLOCKP) > farmesh_all_changed) { + return false; + } + const auto contains = m_client->getEnv() .getClientMap() .far_blocks_storage[step] @@ -303,7 +313,8 @@ int FarMesh::go_flat() // todo: maybe save blocks while cam pos not changed std::array, FARMESH_STEP_MAX> blocks; - runFarAll(draw_control, cbpos, draw_control.cell_size_pow, cbpos.Y ?: 1, + runFarAll(cbpos, draw_control.cell_size_pow, draw_control.farmesh_quality, + cbpos.Y ?: 1, [this, &draw_control, &blocks]( const v3bpos_t &bpos, const bpos_t &size) -> bool { for (const auto &add : { diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8f7a5a13e..7f171244d 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -166,6 +166,8 @@ void fm_set_default_settings(Settings *settings) { settings->setDefault("farmesh_quality", slow ? "1" : "2"); //depends on client_mesh_chunk settings->setDefault("farmesh_stable", "0"); settings->setDefault("farmesh_server", "1"); + settings->setDefault("farmesh_all_changed", "10000"); + settings->setDefault("headless_optimize", "false"); //settings->setDefault("node_highlighting", "halo"); //settings->setDefault("enable_vbo", win ? "false" : "true"); diff --git a/src/fm_clientiface.cpp b/src/fm_clientiface.cpp index 2c76c38f8..0fa10b19c 100644 --- a/src/fm_clientiface.cpp +++ b/src/fm_clientiface.cpp @@ -1,4 +1,3 @@ -#include "client/clientmap.h" #include "client/fm_far_calc.h" #include "constants.h" #include "server/clientiface.h" @@ -18,7 +17,6 @@ #include "util/numeric.h" #include "util/unordered_map_hash.h" - int RemoteClient::GetNextBlocksFm(ServerEnvironment *env, EmergeManager *emerge, float dtime, std::vector &dest, double m_uptime, u64 max_ms) @@ -120,7 +118,7 @@ int RemoteClient::GetNextBlocksFm(ServerEnvironment *env, EmergeManager *emerge, } // s16 last_nearest_unsent_d = m_nearest_unsent_d; - short d_start = m_nearest_unsent_d;//.load(); + short d_start = m_nearest_unsent_d; //.load(); // infostream<<"d_start="<getBasePosition(); auto cbpos = floatToInt(playerpos, BS * MAP_BLOCKSIZE); - runFarAll(draw_control, cbpos, draw_control.cell_size_pow, false, - [this, &ordered](const v3bpos_t &bpos, const bpos_t &size) -> bool { + + const auto cell_size = 1; // FMTODO from remoteclient + const auto cell_size_pow = log(cell_size) / log(2); + + thread_local static const s16 farmesh_all_changed = + g_settings->getU32("farmesh_all_changed"); + + runFarAll(cbpos, cell_size_pow, farmesh_quality, false, + [this, &ordered, &cbpos]( + const v3bpos_t &bpos, const bpos_t &size) -> bool { + // TODO: use block center + const auto bdist = radius_box(cbpos, bpos); + if (bdist << MAP_BLOCKP > farmesh_all_changed) { + return false; + } + block_step_t step = log(size) / log(2); auto &[stepp, sent_ts] = far_blocks_requested[step][bpos]; if (sent_ts < 0) { // <=