Add dry sand patches near beaches
This commit is contained in:
Binary file not shown.
@@ -131,6 +131,7 @@ static inline double smoothstep01(double v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int ground_slope(worldgen_ctx *ctx, int x, int z);
|
static int ground_slope(worldgen_ctx *ctx, int x, int z);
|
||||||
|
static int is_dry_beach_sand_patch(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z);
|
||||||
static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z);
|
static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z);
|
||||||
static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out);
|
static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out);
|
||||||
static void generate_chunk_redwood_floor(worldgen_ctx *ctx, int chunk_x, int chunk_z,
|
static void generate_chunk_redwood_floor(worldgen_ctx *ctx, int chunk_x, int chunk_z,
|
||||||
@@ -937,6 +938,36 @@ static int generate_coal(worldgen_ctx *ctx, int x, int y, int z, int column_heig
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Terrain block generation
|
// Terrain block generation
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
static int is_dry_beach_sand_patch(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z) {
|
||||||
|
if (data->has_water && data->water_surface >= data->height) return 0;
|
||||||
|
if (ground_slope(ctx, world_x, world_z) > 2) return 0;
|
||||||
|
|
||||||
|
int nearest_water_dist2 = 9999;
|
||||||
|
int shore_level = ctx->sea_level;
|
||||||
|
for (int dx = -7; dx <= 7; ++dx) {
|
||||||
|
for (int dz = -7; dz <= 7; ++dz) {
|
||||||
|
int dist2 = dx * dx + dz * dz;
|
||||||
|
if (dist2 == 0 || dist2 > 49) continue;
|
||||||
|
column_data neighbor = get_column_data(ctx, world_x + dx, world_z + dz);
|
||||||
|
if (!neighbor.has_water || neighbor.water_surface < neighbor.height) continue;
|
||||||
|
if (data->height < neighbor.water_surface - 1 || data->height > neighbor.water_surface + 4) continue;
|
||||||
|
if (dist2 < nearest_water_dist2) {
|
||||||
|
nearest_water_dist2 = dist2;
|
||||||
|
shore_level = neighbor.water_surface;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nearest_water_dist2 == 9999) return 0;
|
||||||
|
if (data->height > shore_level + 4) return 0;
|
||||||
|
|
||||||
|
double broad = simplex_noise2(&ctx->noise, (world_x + 72000) * 0.045, (world_z - 72000) * 0.045) * 0.5 + 0.5;
|
||||||
|
double ragged = simplex_noise2(&ctx->noise, (world_x - 81000) * 0.16, (world_z + 81000) * 0.16) * 0.5 + 0.5;
|
||||||
|
double patch = broad * 0.7 + ragged * 0.3;
|
||||||
|
double near_bonus = clamp01((18.0 - (double)nearest_water_dist2) / 18.0) * 0.18;
|
||||||
|
double height_penalty = clamp01((double)(data->height - shore_level) / 4.0) * 0.16;
|
||||||
|
return patch + near_bonus - height_penalty > 0.56;
|
||||||
|
}
|
||||||
|
|
||||||
static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z) {
|
static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data, int world_x, int world_z) {
|
||||||
if (data->has_water && data->water_surface >= data->height) {
|
if (data->has_water && data->water_surface >= data->height) {
|
||||||
int slope = ground_slope(ctx, world_x, world_z);
|
int slope = ground_slope(ctx, world_x, world_z);
|
||||||
@@ -964,6 +995,9 @@ static uint16_t select_surface_block(worldgen_ctx *ctx, const column_data *data,
|
|||||||
double noise = simplex_noise2(&ctx->noise, world_x * 0.02, world_z * 0.02) * 0.5 + 0.5;
|
double noise = simplex_noise2(&ctx->noise, world_x * 0.02, world_z * 0.02) * 0.5 + 0.5;
|
||||||
if (noise < t) return BLOCK_SNOW;
|
if (noise < t) return BLOCK_SNOW;
|
||||||
}
|
}
|
||||||
|
if (is_dry_beach_sand_patch(ctx, data, world_x, world_z)) {
|
||||||
|
return BLOCK_SAND;
|
||||||
|
}
|
||||||
if (data->biome == BIOME_REDWOOD_FOREST) {
|
if (data->biome == BIOME_REDWOOD_FOREST) {
|
||||||
int slope = ground_slope(ctx, world_x, world_z);
|
int slope = ground_slope(ctx, world_x, world_z);
|
||||||
if (slope >= 5) return BLOCK_STONE;
|
if (slope >= 5) return BLOCK_STONE;
|
||||||
@@ -3973,7 +4007,15 @@ void worldgen_generate_chunk(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_
|
|||||||
out->blocks[y][dx][dz] = BLOCK_DIRT;
|
out->blocks[y][dx][dz] = BLOCK_DIRT;
|
||||||
}
|
}
|
||||||
if (cd.height >= 0 && cd.height < CHUNK_HEIGHT) {
|
if (cd.height >= 0 && cd.height < CHUNK_HEIGHT) {
|
||||||
out->blocks[cd.height][dx][dz] = select_surface_block(ctx, &cd, world_x, world_z);
|
uint16_t surface = select_surface_block(ctx, &cd, world_x, world_z);
|
||||||
|
if (surface == BLOCK_SAND) {
|
||||||
|
int sand_bottom = cd.height - 2;
|
||||||
|
if (sand_bottom < dirt_start) sand_bottom = dirt_start;
|
||||||
|
for (int y = sand_bottom; y < cd.height; ++y) {
|
||||||
|
if (y > 0 && y < CHUNK_HEIGHT) out->blocks[y][dx][dz] = BLOCK_SAND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out->blocks[cd.height][dx][dz] = surface;
|
||||||
}
|
}
|
||||||
if (cd.has_water) {
|
if (cd.has_water) {
|
||||||
int water_top = cd.water_surface;
|
int water_top = cd.water_surface;
|
||||||
|
|||||||
Reference in New Issue
Block a user