mirror of
https://github.com/bdnugget/freeminer.git
synced 2026-11-07 06:57:27 +00:00
farmesh: optimize tree size
This commit is contained in:
1 parent
a38e8e4690
commit
3be0078b2a
4 files changed
+71
-37
No files matched your search
@@ -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 : {
|
||||
|
||||
@@ -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
@@ -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 ¶m, 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
@@ -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);
|
||||
Reference in new issue
Block a user