mirror of
https://github.com/Cubitect/cubiomes.git
synced 2025-09-25 04:51:03 -04:00
Do special sampling for layered biome exclusions
This commit is contained in:
parent
20ce76677f
commit
469f4d144b
53
finders.c
53
finders.c
@ -2845,6 +2845,17 @@ void restoreMap(filter_data_t *fd, Layer *l)
|
|||||||
l->data = NULL;
|
l->data = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int testExclusion(Layer *layer, int *cache, int x, int z, const BiomeFilter *bf)
|
||||||
|
{
|
||||||
|
int err = layer->getMap(layer, cache, x, z, 1, 1);
|
||||||
|
if (err)
|
||||||
|
return 0; // skip, but don't treat error as valid
|
||||||
|
int id = cache[0];
|
||||||
|
if (id < 128)
|
||||||
|
return (bf->biomeToExcl & (1ULL << id)) != 0;
|
||||||
|
return (bf->biomeToExclM & (1ULL << (id-128))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
int checkForBiomesAtLayer(
|
int checkForBiomesAtLayer(
|
||||||
LayerStack * g,
|
LayerStack * g,
|
||||||
@ -2859,6 +2870,9 @@ int checkForBiomesAtLayer(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
Layer *l;
|
Layer *l;
|
||||||
|
int *ids;
|
||||||
|
int ret, err;
|
||||||
|
int memsiz, mem1x1;
|
||||||
|
|
||||||
if (filter->flags & CFB_APPROX) // TODO: protoCheck for 1.6-
|
if (filter->flags & CFB_APPROX) // TODO: protoCheck for 1.6-
|
||||||
{
|
{
|
||||||
@ -2960,11 +2974,42 @@ L_has_proto_mushroom:
|
|||||||
}
|
}
|
||||||
|
|
||||||
l = g->layers;
|
l = g->layers;
|
||||||
int *ids;
|
|
||||||
if (cache)
|
if (cache)
|
||||||
|
{
|
||||||
|
memsiz = 0;
|
||||||
ids = cache;
|
ids = cache;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
ids = (int*) calloc(getMinLayerCacheSize(entry, w, h), sizeof(int));
|
{
|
||||||
|
memsiz = getMinLayerCacheSize(entry, w, h);
|
||||||
|
ids = (int*) calloc(memsiz, sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((filter->biomeToExcl | filter->biomeToExclM) && w*h > 1)
|
||||||
|
{
|
||||||
|
err = 0;
|
||||||
|
if (memsiz == 0)
|
||||||
|
memsiz = getMinLayerCacheSize(entry, w, h);
|
||||||
|
mem1x1 = getMinLayerCacheSize(entry, 1, 1);
|
||||||
|
if (mem1x1 * 2 < memsiz)
|
||||||
|
{
|
||||||
|
setLayerSeed(entry, seed);
|
||||||
|
err = testExclusion(entry, ids, x+w/2, z+h/2, filter);
|
||||||
|
}
|
||||||
|
if (mem1x1 * 5 < memsiz)
|
||||||
|
{
|
||||||
|
if (!err) err = testExclusion(entry, ids, x, z, filter);
|
||||||
|
if (!err) err = testExclusion(entry, ids, x+w-1, z+h-1, filter);
|
||||||
|
if (!err) err = testExclusion(entry, ids, x, z+h-1, filter);
|
||||||
|
if (!err) err = testExclusion(entry, ids, x+w-1, z, filter);
|
||||||
|
}
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
if (cache == NULL)
|
||||||
|
free(ids);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
filter_data_t fd[9];
|
filter_data_t fd[9];
|
||||||
swapMap(fd+0, filter, l+L_OCEAN_MIX_4, mapFilterOceanMix);
|
swapMap(fd+0, filter, l+L_OCEAN_MIX_4, mapFilterOceanMix);
|
||||||
@ -2977,9 +3022,9 @@ L_has_proto_mushroom:
|
|||||||
swapMap(fd+7, filter, l+L_MUSHROOM_256, mapFilterMushroom);
|
swapMap(fd+7, filter, l+L_MUSHROOM_256, mapFilterMushroom);
|
||||||
swapMap(fd+8, filter, l+L_SPECIAL_1024, mapFilterSpecial);
|
swapMap(fd+8, filter, l+L_SPECIAL_1024, mapFilterSpecial);
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
setLayerSeed(entry, seed);
|
setLayerSeed(entry, seed);
|
||||||
int err = entry->getMap(entry, ids, x, z, w, h);
|
err = entry->getMap(entry, ids, x, z, w, h);
|
||||||
int ret = 0;
|
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
{
|
{
|
||||||
uint64_t b = 0, m = 0;
|
uint64_t b = 0, m = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user