Add dry sand patches near beaches

This commit is contained in:
chelsea
2026-05-03 11:53:07 -05:00
parent 84a0435312
commit acd5eaa52f
2 changed files with 43 additions and 1 deletions

Binary file not shown.

View File

@@ -131,6 +131,7 @@ static inline double smoothstep01(double v) {
}
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 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,
@@ -937,6 +938,36 @@ static int generate_coal(worldgen_ctx *ctx, int x, int y, int z, int column_heig
// ---------------------------------------------------------------------------
// 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) {
if (data->has_water && data->water_surface >= data->height) {
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;
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) {
int slope = ground_slope(ctx, world_x, world_z);
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;
}
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) {
int water_top = cd.water_surface;