13 if (
strength <= 0.f ||
nx <= 0 ||
ny <= 0 ||
nz <= 0)
return result;
16 return size_t(
x) + size_t(
y) * size_t(
nx) + size_t(
z) * size_t(
nx) * size_t(
ny);
18 std::vector<uint8_t> anchored(density.size(), uint8_t(0));
19 std::deque<size_t> frontier;
22 if (density[voxel] <= 0.f || anchored[voxel] != 0)
return;
24 frontier.push_back(voxel);
26 for (
int z = 0;
z <
nz; ++
z) {
27 for (
int y = 0;
y <
ny; ++
y) {
32 for (
int z = 0;
z <
nz; ++
z) {
33 for (
int x = 0;
x <
nx; ++
x) {
38 for (
int y = 0;
y <
ny; ++
y) {
39 for (
int x = 0;
x <
nx; ++
x) {
45 while (!frontier.empty()) {
46 const size_t voxel = frontier.front();
48 const int z = int(voxel / (
size_t(
nx) *
size_t(
ny)));
49 const int y = int((voxel /
size_t(
nx)) %
size_t(
ny));
50 const int x = int(voxel %
size_t(
nx));
51 for (
int dz = -1;
dz <= 1; ++
dz) {
52 for (
int dy = -1;
dy <= 1; ++
dy) {
53 for (
int dx = -1;
dx <= 1; ++
dx) {
54 if ((
dx == 0 &&
dy == 0 &&
dz == 0) ||
x + dx < 0 || x + dx >=
nx ||
y + dy < 0 || y + dy >=
ny ||
55 z + dz < 0 || z + dz >=
nz)
63 for (
size_t voxel = 0; voxel < density.size(); ++voxel) {
64 if (density[voxel] <= 0.f || anchored[voxel] != 0)
continue;
66 const float detached = -std::fabs(density[voxel]) - 1e-4f;
67 density[voxel] += (detached - density[voxel]) *
strength;
CaveDetachmentResult detachUnsupportedCaveFragments(std::vector< float > &density, int nx, int ny, int nz, float strength)
Detaches unsupported cave fragments.