farmesh: optimize tree size

This commit is contained in:
proller committed 2025-11-18 00:07:44 +01:00
1 parent a38e8e4690
commit 3be0078b2a
4 files changed
+71 -37

No files matched your search

+4 -3
View File
@@ -277,7 +277,8 @@ int FarMesh::go_container()
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,
runFarAll(cbpos, draw_control.cell_size_pow, draw_control.farmesh,
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);
@@ -320,8 +321,8 @@ int FarMesh::go_flat()
// todo: maybe save blocks while cam pos not changed
std::array<std::unordered_set<v3bpos_t>, FARMESH_STEP_MAX> blocks;
runFarAll(cbpos, draw_control.cell_size_pow, draw_control.farmesh_quality,
cbpos.Y ?: 1,
runFarAll(cbpos, draw_control.cell_size_pow, draw_control.farmesh,
draw_control.farmesh_quality, cbpos.Y ?: 1,
[this, &draw_control, &blocks](
const v3bpos_t &bpos, const bpos_t &size) -> bool {
for (const auto &add : {
+1 -1
View File
@@ -627,7 +627,7 @@ uint32_t RemoteClient::SendFarBlocks(const int32_t uptime)
g_settings->getU32("farmesh_all_changed");
const auto &use_farmesh_all_changed =
std::min(setting_farmesh_all_changed, farmesh_all_changed);
runFarAll(cbpos, cell_size_pow, farmesh_quality, false,
runFarAll(cbpos, cell_size_pow, farmesh, farmesh_quality, false,
[this, &ordered, &cbpos, &use_farmesh_all_changed](
const v3bpos_t &bpos, const bpos_t &size) -> bool {
if (!size) {
+63 -31
View File
@@ -199,30 +199,53 @@ std::optional<child_t> find(const v3tpos_t &block_pos, const v3tpos_t &player_po
return {};
}
const auto nearest_pow2 = [](const int v) -> int8_t {
if (v == 0)
return 0;
int p = 1;
int8_t n = 0;
while (p < v) {
p <<= 1;
++n;
}
return n;
};
const auto farmesh_to_tree_pow = [](const int farmesh) -> int8_t {
return nearest_pow2(farmesh) - 1; // -2 ? TODO: test and tune
};
struct tree_params_t
{
#if USE_POS32
const auto tree_pow = FARMESH_STEP_MAX;
const int16_t tree_pow = FARMESH_STEP_MAX;
#else
const auto tree_pow = 12;
const auto tree_pow = 12;
#endif
const auto tree_size = 1 << tree_pow;
const auto tree_align = tree_pow - 1;
const auto tree_align_size = 1 << (tree_align);
const auto external_pow = tree_pow - 2;
const int tree_size = 1 << tree_pow;
const int16_t tree_align = tree_pow - 1;
const int tree_align_size = 1 << (tree_align);
const int16_t external_pow = tree_pow - 2;
};
block_step_t getFarStepCellSize(const MapDrawControl &draw_control, const v3bpos_t &ppos,
const v3bpos_t &blockpos, uint8_t cell_size_pow)
{
const auto blockpos_aligned_cell = align_shift(blockpos, cell_size_pow);
const tree_params_t tree_params{.tree_pow{farmesh_to_tree_pow(draw_control.farmesh)}};
const auto start = child_t{.pos = v3tpos_t(
// TODO: cast to type larger than pos_t_type
(((tpos_t)ppos.X >> tree_align) << tree_align) -
(tree_align_size >> 1),
(((tpos_t)ppos.Y >> tree_align) << tree_align) -
(tree_align_size >> 1),
(((tpos_t)ppos.Z >> tree_align) << tree_align) -
(tree_align_size >> 1)),
.size = tree_size};
(((tpos_t)ppos.X >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
(((tpos_t)ppos.Y >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
(((tpos_t)ppos.Z >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1)),
.size = tree_params.tree_size};
const auto res = find(
{blockpos_aligned_cell.X, blockpos_aligned_cell.Y, blockpos_aligned_cell.Z},
{ppos.X, ppos.Y, ppos.Z}, start, cell_size_pow, draw_control.farmesh_quality);
@@ -260,14 +283,18 @@ v3bpos_t getFarActual(const v3bpos_t &blockpos, const v3bpos_t &ppos, block_step
{
const auto blockpos_aligned_cell =
align_shift(blockpos, cell_size_pow.value_or(draw_control.cell_size_pow));
const auto start =
child_t{.pos = v3tpos_t((((tpos_t)ppos.X >> tree_align) << tree_align) -
(tree_align_size >> 1),
(((tpos_t)ppos.Y >> tree_align) << tree_align) -
(tree_align_size >> 1),
(((tpos_t)ppos.Z >> tree_align) << tree_align) -
(tree_align_size >> 1)),
.size = tree_size};
tree_params_t tree_params{.tree_pow{farmesh_to_tree_pow(draw_control.farmesh)}};
const auto start = child_t{.pos = v3tpos_t((((tpos_t)ppos.X >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
(((tpos_t)ppos.Y >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
(((tpos_t)ppos.Z >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1)),
.size = tree_params.tree_size};
const auto res = find(
{blockpos_aligned_cell.X, blockpos_aligned_cell.Y, blockpos_aligned_cell.Z},
{ppos.X, ppos.Y, ppos.Z}, start,
@@ -291,7 +318,7 @@ v3bpos_t getFarActual(const v3bpos_t &blockpos, const v3bpos_t &ppos, block_step
return v3bpos_t(res->pos.X, res->pos.Y, res->pos.Z);
#endif
}
const auto ext_align = external_pow; // + cell_size_pow;
const auto ext_align = tree_params.external_pow; // + cell_size_pow;
return v3bpos_t((blockpos.X >> ext_align) << ext_align,
(blockpos.Y >> ext_align) << ext_align,
(blockpos.Z >> ext_align) << ext_align);
@@ -368,19 +395,24 @@ void each(const each_param_t &param, const child_t &child)
}
}
void runFarAll(const v3bpos_t &ppos, uint8_t cell_size_pow, uint8_t farmesh_quality,
pos_t two_d, const std::function<bool(const v3bpos_t &, const bpos_t &)> &func)
void runFarAll(const v3bpos_t &ppos, uint8_t cell_size_pow, int farmesh,
uint8_t farmesh_quality, pos_t two_d,
const std::function<bool(const v3bpos_t &, const bpos_t &)> &func)
{
tree_params_t tree_params{.tree_pow{farmesh_to_tree_pow(farmesh)}};
const auto start =
child_t{.pos = v3tpos_t((((tpos_t)ppos.X >> tree_align) << tree_align) -
(tree_align_size >> 1),
child_t{.pos = v3tpos_t((((tpos_t)ppos.X >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
two_d
?: (((tpos_t)(ppos.Y) >> tree_align) << tree_align) -
(tree_align_size >> 1),
(((tpos_t)(ppos.Z) >> tree_align) << tree_align) -
(tree_align_size >> 1)),
.size{tree_size}};
?: (((tpos_t)(ppos.Y) >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1),
(((tpos_t)(ppos.Z) >> tree_params.tree_align)
<< tree_params.tree_align) -
(tree_params.tree_align_size >> 1)),
.size{tree_params.tree_size}};
const auto func_convert = [&func](const child_t &child) {
return func(v3bpos_t(child.pos.X, child.pos.Y, child.pos.Z), child.size);
+3 -2
View File
@@ -57,5 +57,6 @@ v3bpos_t getFarActual(const v3bpos_t &blockpos, const v3bpos_t &playerblockpos,
const std::optional<uint8_t> &cell_size_pow = {});
v3bpos_t playerBlockAlign(
const MapDrawControl &draw_control, const v3bpos_t &playerblockpos);
void runFarAll(const v3bpos_t &ppos, uint8_t cell_size_pow, uint8_t farmesh_quality,
pos_t two_d, const std::function<bool(const v3bpos_t &, const bpos_t &)> &func);
void runFarAll(const v3bpos_t &ppos, uint8_t cell_size_pow, int farmesh,
uint8_t farmesh_quality, pos_t two_d,
const std::function<bool(const v3bpos_t &, const bpos_t &)> &func);