Fix find vulcano algorithm
parent
639fa5993f
commit
cae80cd927
|
@ -63,7 +63,7 @@ typedef struct {
|
||||||
} OceanRowData;
|
} OceanRowData;
|
||||||
|
|
||||||
static const f64 vulcano_radius = 256.0;
|
static const f64 vulcano_radius = 256.0;
|
||||||
static const f64 vulcano_chunk_offset = vulcano_radius * 2.0 / CHUNK_SIZE;
|
static const f64 vulcano_diameter = vulcano_radius * 2.0;
|
||||||
|
|
||||||
static OceanLevel get_ocean_level(f64 factor)
|
static OceanLevel get_ocean_level(f64 factor)
|
||||||
{
|
{
|
||||||
|
@ -86,42 +86,6 @@ static f64 get_ocean_level_factor(f64 factor, OceanLevel level)
|
||||||
return (factor - start) / (end - start);
|
return (factor - start) / (end - start);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_vulcano(v2s32 pos)
|
|
||||||
{
|
|
||||||
f64 factor;
|
|
||||||
|
|
||||||
return noise2d(pos.x, pos.y, 0, seed + SO_VULCANO) > 0.0
|
|
||||||
&& get_biome((v2s32) {pos.x * CHUNK_SIZE, pos.y * CHUNK_SIZE}, &factor) == BIOME_OCEAN
|
|
||||||
&& get_ocean_level(factor) == OCEAN_DEEP;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool find_near_vulcano(v2s32 pos, v2s32 *result)
|
|
||||||
{
|
|
||||||
f64 x = pos.x / vulcano_chunk_offset;
|
|
||||||
f64 z = pos.y / vulcano_chunk_offset;
|
|
||||||
|
|
||||||
s32 lx, lz;
|
|
||||||
lx = floor(x);
|
|
||||||
lz = floor(z);
|
|
||||||
|
|
||||||
s32 hx, hz;
|
|
||||||
hx = ceil(x);
|
|
||||||
hz = ceil(z);
|
|
||||||
|
|
||||||
for (s32 ix = lx; ix <= hx; ix++) {
|
|
||||||
for (s32 iz = lz; iz <= hz; iz++) {
|
|
||||||
v2s32 vulcano_pos = {ix * 32, iz * 32};
|
|
||||||
|
|
||||||
if (is_vulcano(vulcano_pos)) {
|
|
||||||
*result = vulcano_pos;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static f64 distance(v2s32 a, v2s32 b)
|
static f64 distance(v2s32 a, v2s32 b)
|
||||||
{
|
{
|
||||||
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
|
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
|
||||||
|
@ -152,10 +116,16 @@ static s32 calculate_ocean_floor(f64 factor, s32 height)
|
||||||
static void chunk_ocean(BiomeArgsChunk *args)
|
static void chunk_ocean(BiomeArgsChunk *args)
|
||||||
{
|
{
|
||||||
OceanChunkData *chunk_data = args->chunk_data;
|
OceanChunkData *chunk_data = args->chunk_data;
|
||||||
v2s32 vulcano_pos;
|
|
||||||
|
|
||||||
if ((chunk_data->has_vulcano = find_near_vulcano((v2s32) {args->chunk->pos.x, args->chunk->pos.z}, &vulcano_pos)))
|
chunk_data->vulcano_pos = (v2s32) {
|
||||||
chunk_data->vulcano_pos = (v2s32) {vulcano_pos.x * CHUNK_SIZE, vulcano_pos.y * CHUNK_SIZE};
|
floor((f64) args->chunk->pos.x * CHUNK_SIZE / vulcano_diameter + 0.5) * vulcano_diameter,
|
||||||
|
floor((f64) args->chunk->pos.z * CHUNK_SIZE / vulcano_diameter + 0.5) * vulcano_diameter
|
||||||
|
};
|
||||||
|
|
||||||
|
f64 factor;
|
||||||
|
chunk_data->has_vulcano = noise2d(chunk_data->vulcano_pos.x, chunk_data->vulcano_pos.y, 0, seed + SO_VULCANO) > 0.0
|
||||||
|
&& get_biome((v2s32) {chunk_data->vulcano_pos.x, chunk_data->vulcano_pos.y}, &factor) == BIOME_OCEAN
|
||||||
|
&& get_ocean_level(factor) == OCEAN_DEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void row_ocean(BiomeArgsRow *args)
|
static void row_ocean(BiomeArgsRow *args)
|
||||||
|
|
Loading…
Reference in New Issue