bool column_is_open = false; // Is column open to overground
bool is_under_river = false; // Is column under river water
bool is_under_tunnel = false; // Is tunnel or is under tunnel
+ bool is_top_filler_above = false; // Is top or filler above node
// Indexes at column top
u32 vi = vm->m_area.index(x, nmax.Y, z);
u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride +
for (s16 y = nmax.Y; y >= nmin.Y - 1; y--,
index3d -= m_ystride,
vm->m_area.add_y(em, vi, -1)) {
-
content_t c = vm->m_data[vi].getContent();
+
if (c == CONTENT_AIR || c == biome->c_water_top ||
c == biome->c_water) {
column_is_open = true;
+ is_top_filler_above = false;
continue;
- } else if (c == biome->c_river_water) {
+ }
+
+ if (c == biome->c_river_water) {
column_is_open = true;
is_under_river = true;
+ is_top_filler_above = false;
continue;
}
+
// Ground
float d1 = contour(noise_cave1->result[index3d]);
float d2 = contour(noise_cave2->result[index3d]);
// In tunnel and ground content, excavate
vm->m_data[vi] = MapNode(CONTENT_AIR);
is_under_tunnel = true;
+ // If tunnel roof is top or filler, replace with stone
+ if (is_top_filler_above)
+ vm->m_data[vi + em.X] = MapNode(biome->c_stone);
+ is_top_filler_above = false;
} else if (column_is_open && is_under_tunnel &&
(c == biome->c_stone || c == biome->c_filler)) {
// Tunnel entrance floor, place biome surface nodes
if (is_under_river) {
if (nplaced < depth_riverbed) {
vm->m_data[vi] = MapNode(biome->c_riverbed);
+ is_top_filler_above = true;
nplaced++;
} else {
// Disable top/filler placement
}
} else if (nplaced < depth_top) {
vm->m_data[vi] = MapNode(biome->c_top);
+ is_top_filler_above = true;
nplaced++;
} else if (nplaced < base_filler) {
vm->m_data[vi] = MapNode(biome->c_filler);
+ is_top_filler_above = true;
nplaced++;
} else {
// Disable top/filler placement
}
} else {
// Not tunnel or tunnel entrance floor
+ // Check node for possible replacing with stone for tunnel roof
+ if (c == biome->c_top || c == biome->c_filler)
+ is_top_filler_above = true;
+
column_is_open = false;
}
}
v3s16 p(cp.X + x0, cp.Y + y0, cp.Z + z0);
p += of;
- if (vm->m_area.contains(p) == false)
+ if (!vm->m_area.contains(p))
continue;
u32 i = vm->m_area.index(p);
v3s16 p(cp.X + x0, cp.Y + y0, cp.Z + z0);
p += of;
- if (vm->m_area.contains(p) == false)
+ if (!vm->m_area.contains(p))
continue;
u32 i = vm->m_area.index(p);
p.X >= node_min.X && p.X <= node_max.X) {
u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
return heightmap[index];
- } else {
- return water_level;
}
+
+ return water_level;
+
}