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) { // <=