forked from Mirrorlandia_minetest/minetest
Mapgen v6: Fix mudflow iteration and iterate twice (#8795)
In MapgenV6::flowMud(), the previous implementation of coordinate inversion caused the 2 inverted mudflow iterations (out of the 3 iterations) to not loop over the area, so only 1 non-inverted iteration occurred. Fix this bug but only iterate mudflow twice, as mapgen v6 has only had 1 iteration for many years. There is now a good balance of 1 non-inverted iteration and 1 inverted iteration.
This commit is contained in:
parent
2db0e93f73
commit
d7c10b66d3
@ -773,22 +773,22 @@ void MapgenV6::addMud()
|
|||||||
|
|
||||||
void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
|
void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
|
||||||
{
|
{
|
||||||
// 340ms @cs=8
|
// Iterate twice
|
||||||
//TimeTaker timer1("flow mud");
|
for (s16 k = 0; k < 2; k++) {
|
||||||
|
|
||||||
// Iterate a few times
|
|
||||||
for (s16 k = 0; k < 3; k++) {
|
|
||||||
for (s16 z = mudflow_minpos; z <= mudflow_maxpos; z++)
|
for (s16 z = mudflow_minpos; z <= mudflow_maxpos; z++)
|
||||||
for (s16 x = mudflow_minpos; x <= mudflow_maxpos; x++) {
|
for (s16 x = mudflow_minpos; x <= mudflow_maxpos; x++) {
|
||||||
// Invert coordinates every 2nd iteration
|
// Node column position
|
||||||
if (k % 2 == 0) {
|
v2s16 p2d;
|
||||||
x = mudflow_maxpos - (x - mudflow_minpos);
|
// Invert coordinates on second iteration to process columns in
|
||||||
z = mudflow_maxpos - (z - mudflow_minpos);
|
// opposite order, to avoid a directional bias.
|
||||||
|
if (k == 1) {
|
||||||
|
p2d = v2s16(node_min.X, node_min.Z) + v2s16(
|
||||||
|
mudflow_maxpos - (x - mudflow_minpos),
|
||||||
|
mudflow_maxpos - (z - mudflow_minpos));
|
||||||
|
} else {
|
||||||
|
p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Node position in 2d
|
|
||||||
v2s16 p2d = v2s16(node_min.X, node_min.Z) + v2s16(x, z);
|
|
||||||
|
|
||||||
const v3s16 &em = vm->m_area.getExtent();
|
const v3s16 &em = vm->m_area.getExtent();
|
||||||
u32 i = vm->m_area.index(p2d.X, node_max.Y, p2d.Y);
|
u32 i = vm->m_area.index(p2d.X, node_max.Y, p2d.Y);
|
||||||
s16 y = node_max.Y;
|
s16 y = node_max.Y;
|
||||||
|
Loading…
Reference in New Issue
Block a user