Add broad buildable flatlands
This commit is contained in:
@@ -125,6 +125,11 @@ static inline int clamp_int(int v, int min_v, int max_v) {
|
|||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline double smoothstep01(double v) {
|
||||||
|
v = clamp01(v);
|
||||||
|
return v * v * (3.0 - 2.0 * v);
|
||||||
|
}
|
||||||
|
|
||||||
static int ground_slope(worldgen_ctx *ctx, int x, int z);
|
static int ground_slope(worldgen_ctx *ctx, int x, int 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);
|
||||||
@@ -519,6 +524,15 @@ static double redwood_tree_presence(worldgen_ctx *ctx, int x, int z) {
|
|||||||
return clamp01(presence);
|
return clamp01(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double buildable_flatland_mask(worldgen_ctx *ctx, int x, int z, double mountain_factor) {
|
||||||
|
double cell = worley_distance(x + 71000, z - 71000, 0.00082, 0xB17D4B11u);
|
||||||
|
double broad_patch = smoothstep01((0.66 - cell) / 0.28);
|
||||||
|
double gate = simplex_noise2(&ctx->noise, (x - 91000) * 0.00022, (z + 91000) * 0.00022) * 0.5 + 0.5;
|
||||||
|
double campus_patch = broad_patch * smoothstep01((gate - 0.32) / 0.36);
|
||||||
|
double mountain_guard = 1.0 - smoothstep01((mountain_factor - 0.42) / 0.34) * 0.82;
|
||||||
|
return clamp01(campus_patch * mountain_guard);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static double region_blend(worldgen_ctx *ctx, int x, int z) {
|
static double region_blend(worldgen_ctx *ctx, int x, int z) {
|
||||||
(void)ctx;
|
(void)ctx;
|
||||||
@@ -634,6 +648,7 @@ static int column_height(worldgen_ctx *ctx, int x, int z) {
|
|||||||
double mix_base = region * 0.35 + base_mountain * 0.55;
|
double mix_base = region * 0.35 + base_mountain * 0.55;
|
||||||
double mix = clamp01(mix_base * 0.65 + 0.15);
|
double mix = clamp01(mix_base * 0.65 + 0.15);
|
||||||
double height = lowland * (1.0 - mix) + highland * mix;
|
double height = lowland * (1.0 - mix) + highland * mix;
|
||||||
|
double build_flats = buildable_flatland_mask(ctx, x, z, mountain_factor);
|
||||||
|
|
||||||
double flat_noise = simplex_noise2(&ctx->noise, warp2_x * 0.0015, warp2_z * 0.0015) * 0.5 + 0.5;
|
double flat_noise = simplex_noise2(&ctx->noise, warp2_x * 0.0015, warp2_z * 0.0015) * 0.5 + 0.5;
|
||||||
double flat_bias = (mix < 0.45 ? (0.45 - mix) * 1.6 : 0.0) * flat_noise;
|
double flat_bias = (mix < 0.45 ? (0.45 - mix) * 1.6 : 0.0) * flat_noise;
|
||||||
@@ -648,15 +663,24 @@ static int column_height(worldgen_ctx *ctx, int x, int z) {
|
|||||||
double region_bias = 0.7 + 0.3 * clamp01(region);
|
double region_bias = 0.7 + 0.3 * clamp01(region);
|
||||||
double plains_detail_quiet = clamp01(1.0 - mix * 1.2);
|
double plains_detail_quiet = clamp01(1.0 - mix * 1.2);
|
||||||
double adjusted_weight = detail_weight * region_bias * (1.0 - plains_detail_quiet * 0.8);
|
double adjusted_weight = detail_weight * region_bias * (1.0 - plains_detail_quiet * 0.8);
|
||||||
|
adjusted_weight *= 1.0 - build_flats * 0.92;
|
||||||
height += simplex_noise2(&ctx->noise, warp2_x * 0.02, warp2_z * 0.02) * 5.0 * adjusted_weight;
|
height += simplex_noise2(&ctx->noise, warp2_x * 0.02, warp2_z * 0.02) * 5.0 * adjusted_weight;
|
||||||
height += simplex_noise2(&ctx->noise, warp2_x * 0.05, warp2_z * 0.05) * 2.0 * adjusted_weight;
|
height += simplex_noise2(&ctx->noise, warp2_x * 0.05, warp2_z * 0.05) * 2.0 * adjusted_weight;
|
||||||
height += simplex_noise2(&ctx->noise, warp2_x * 0.1, warp2_z * 0.1) * 1.0 * adjusted_weight;
|
height += simplex_noise2(&ctx->noise, warp2_x * 0.1, warp2_z * 0.1) * 1.0 * adjusted_weight;
|
||||||
height += simplex_noise3(&ctx->noise, warp2_x * 0.015, warp2_z * 0.015, region * 7.0) * 1.5;
|
height += simplex_noise3(&ctx->noise, warp2_x * 0.015, warp2_z * 0.015, region * 7.0) * 1.5 * (1.0 - build_flats * 0.85);
|
||||||
|
if (build_flats > 0.0) {
|
||||||
|
double campus_target = ctx->sea_level + 4;
|
||||||
|
campus_target += simplex_noise2(&ctx->noise, (x + 51000) * 0.00055, (z - 51000) * 0.00055) * 2.0;
|
||||||
|
campus_target += simplex_noise2(&ctx->noise, (x - 62000) * 0.0014, (z + 62000) * 0.0014) * 0.8;
|
||||||
|
double campus_blend = build_flats * 0.88;
|
||||||
|
height = height * (1.0 - campus_blend) + campus_target * campus_blend;
|
||||||
|
}
|
||||||
double flats = clamp01((old_growth - 0.25) / 0.75);
|
double flats = clamp01((old_growth - 0.25) / 0.75);
|
||||||
if (flats > 0.0) {
|
if (flats > 0.0) {
|
||||||
double plains_target = ctx->sea_level - 2 + simplex_noise2(&ctx->noise, (x - 22000) * 0.002, (z + 22000) * 0.002) * 5.0;
|
double plains_target = ctx->sea_level - 2 + simplex_noise2(&ctx->noise, (x - 22000) * 0.002, (z + 22000) * 0.002) * 5.0;
|
||||||
plains_target += simplex_noise2(&ctx->noise, (x + 33000) * 0.01, (z - 33000) * 0.01) * 1.5;
|
plains_target += simplex_noise2(&ctx->noise, (x + 33000) * 0.01, (z - 33000) * 0.01) * 1.5;
|
||||||
height = height * (1.0 - flats) + plains_target * flats;
|
double plains_blend = flats * (1.0 - build_flats * 0.55);
|
||||||
|
height = height * (1.0 - plains_blend) + plains_target * plains_blend;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int)height;
|
return (int)height;
|
||||||
|
|||||||
Reference in New Issue
Block a user