mirror of
https://github.com/Cubitect/cubiomes.git
synced 2025-09-23 19:55:34 -04:00
Perform 1.18 biome tests in a stochastic order + added termination flag
This commit is contained in:
parent
1d13c09d25
commit
0cd6e8134a
94
finders.c
94
finders.c
@ -1830,6 +1830,7 @@ int isViableStructurePos(int structureType, Generator *g, int x, int z, uint32_t
|
|||||||
case 1: sampleX = +1-sv.sz; sampleZ = -1+sv.sx; break;
|
case 1: sampleX = +1-sv.sz; sampleZ = -1+sv.sx; break;
|
||||||
case 2: sampleX = +1-sv.sx; sampleZ = +1-sv.sz; break;
|
case 2: sampleX = +1-sv.sx; sampleZ = +1-sv.sz; break;
|
||||||
case 3: sampleX = -1+sv.sz; sampleZ = +1-sv.sx; break;
|
case 3: sampleX = -1+sv.sz; sampleZ = +1-sv.sx; break;
|
||||||
|
default: return 0; // unreachable
|
||||||
}
|
}
|
||||||
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
||||||
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
||||||
@ -1938,6 +1939,7 @@ L_feature:
|
|||||||
case 1: sampleX = +1-vt.sz; sampleZ = -1+vt.sx; break;
|
case 1: sampleX = +1-vt.sz; sampleZ = -1+vt.sx; break;
|
||||||
case 2: sampleX = +1-vt.sx; sampleZ = +1-vt.sz; break;
|
case 2: sampleX = +1-vt.sx; sampleZ = +1-vt.sz; break;
|
||||||
case 3: sampleX = -1+vt.sz; sampleZ = +1-vt.sx; break;
|
case 3: sampleX = -1+vt.sz; sampleZ = +1-vt.sx; break;
|
||||||
|
default: return 0; // unreachable
|
||||||
}
|
}
|
||||||
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
||||||
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
||||||
@ -1993,6 +1995,7 @@ L_feature:
|
|||||||
case 1: sampleX = -15; sampleZ = +15; break;
|
case 1: sampleX = -15; sampleZ = +15; break;
|
||||||
case 2: sampleX = -15; sampleZ = -15; break;
|
case 2: sampleX = -15; sampleZ = -15; break;
|
||||||
case 3: sampleX = +15; sampleZ = -15; break;
|
case 3: sampleX = +15; sampleZ = -15; break;
|
||||||
|
default: return 0; // unreachable
|
||||||
}
|
}
|
||||||
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
sampleX = ((chunkX << 5) + sampleX) / 2 >> 2;
|
||||||
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
sampleZ = ((chunkZ << 5) + sampleZ) / 2 >> 2;
|
||||||
@ -2652,11 +2655,12 @@ int checkForBiomes(
|
|||||||
uint64_t seed,
|
uint64_t seed,
|
||||||
BiomeFilter filter,
|
BiomeFilter filter,
|
||||||
int approx,
|
int approx,
|
||||||
int (*timeout)()
|
volatile char * stop
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
(void) timeout;
|
if (stop && *stop)
|
||||||
int i, j, ret;
|
return 0;
|
||||||
|
int i, j, k, ret;
|
||||||
|
|
||||||
if (g->mc <= MC_1_17 && dim == 0)
|
if (g->mc <= MC_1_17 && dim == 0)
|
||||||
{
|
{
|
||||||
@ -2680,7 +2684,7 @@ int checkForBiomes(
|
|||||||
// 3) each biome in the 1.18 noise generator might have min.max biome
|
// 3) each biome in the 1.18 noise generator might have min.max biome
|
||||||
// parameter ranged
|
// parameter ranged
|
||||||
|
|
||||||
int *ids;
|
int *ids, id;
|
||||||
if (cache)
|
if (cache)
|
||||||
ids = cache;
|
ids = cache;
|
||||||
else
|
else
|
||||||
@ -2691,23 +2695,83 @@ int checkForBiomes(
|
|||||||
applySeed(g, dim, seed);
|
applySeed(g, dim, seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = !genBiomes(g, ids, r);
|
// Biome checks are very expensive now, so we should sample the area one
|
||||||
|
// voxel at a time in a 'random' order and constantly check the conditions.
|
||||||
|
// This is not very efficient for scale 1:1 biome filters, but those
|
||||||
|
// should be avoided here anyway.
|
||||||
|
uint64_t b = 0, m = 0;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
if (ret)
|
// shuffle indeces
|
||||||
|
struct touple { int i, x, y, z; } *buf;
|
||||||
|
buf = (struct touple*) malloc(r.sx * r.sy * r.sz * sizeof(*buf));
|
||||||
|
|
||||||
|
id = 0;
|
||||||
|
for (k = 0; k < r.sy; k++)
|
||||||
{
|
{
|
||||||
uint64_t b = 0, bm = 0;
|
for (j = 0; j < r.sz; j++)
|
||||||
for (i = 0; i < r.sx*r.sy*r.sz; i++)
|
|
||||||
{
|
{
|
||||||
int id = ids[i];
|
for (i = 0; i < r.sx; i++)
|
||||||
if (id < 128) b |= (1ULL << id);
|
{
|
||||||
else bm |= (1ULL << (id-128));
|
buf[id].i = id;
|
||||||
|
buf[id].x = i;
|
||||||
|
buf[id].y = k;
|
||||||
|
buf[id].z = j;
|
||||||
|
id++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = !(((b & filter.riverToFind) ^ filter.riverToFind) ||
|
|
||||||
((bm & filter.riverToFindM) ^ filter.riverToFindM) ||
|
|
||||||
(b & filter.biomeToExcl) ||
|
|
||||||
(bm & filter.biomeToExclM));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = r.sx*r.sy*r.sz-1; i > 1; i--)
|
||||||
|
{
|
||||||
|
int idx = rand() % (i - 1);
|
||||||
|
struct touple t = buf[idx];
|
||||||
|
buf[idx] = buf[i];
|
||||||
|
buf[i] = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = r.sx*r.sy*r.sz-1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (stop && *stop)
|
||||||
|
break;
|
||||||
|
|
||||||
|
int x = buf[i].x, y = buf[i].y, z = buf[i].z;
|
||||||
|
id = getBiomeAt(g, r.scale, r.x+x, r.y+y, r.z+z);
|
||||||
|
ids[buf[i].i] = id;
|
||||||
|
if (id < 128) b |= (1ULL << id);
|
||||||
|
else m |= (1ULL << (id-128));
|
||||||
|
|
||||||
|
if (filter.biomeToExcl || filter.biomeToExclM)
|
||||||
|
{
|
||||||
|
if ((b & filter.biomeToExcl) ||
|
||||||
|
(m & filter.biomeToExclM))
|
||||||
|
{ // found an excluded biome
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // no excluded: do the current biomes satisfy the condition?
|
||||||
|
if (((b & filter.riverToFind) ^ filter.riverToFind) == 0 &&
|
||||||
|
((m & filter.riverToFindM) ^ filter.riverToFindM) == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stop && *stop)
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = !(((b & filter.riverToFind) ^ filter.riverToFind) ||
|
||||||
|
((m & filter.riverToFindM) ^ filter.riverToFindM) ||
|
||||||
|
(b & filter.biomeToExcl) ||
|
||||||
|
(m & filter.biomeToExclM));
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
if (ids != cache)
|
if (ids != cache)
|
||||||
free(ids);
|
free(ids);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -667,7 +667,7 @@ BiomeFilter setupBiomeFilter(
|
|||||||
* @seed : world seed
|
* @seed : world seed
|
||||||
* @filter : biome requirements to be met
|
* @filter : biome requirements to be met
|
||||||
* @approx : enables approximations with more aggressive filtering
|
* @approx : enables approximations with more aggressive filtering
|
||||||
* @timeout : occasional check for abort (nullable)
|
* @stop : occasional check for abort (nullable)
|
||||||
*/
|
*/
|
||||||
int checkForBiomes(
|
int checkForBiomes(
|
||||||
Generator * g,
|
Generator * g,
|
||||||
@ -677,7 +677,7 @@ int checkForBiomes(
|
|||||||
uint64_t seed,
|
uint64_t seed,
|
||||||
BiomeFilter filter,
|
BiomeFilter filter,
|
||||||
int approx,
|
int approx,
|
||||||
int (*timeout)()
|
volatile char * stop // should be atomic, but is fine as stop flag
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Specialization of checkForBiomes() for a LayerStack, i.e. the Overworld up
|
/* Specialization of checkForBiomes() for a LayerStack, i.e. the Overworld up
|
||||||
|
Loading…
x
Reference in New Issue
Block a user