From 483200363eb399623fe4c80c0a88354ae9f490bf Mon Sep 17 00:00:00 2001 From: chelsea Date: Tue, 2 Dec 2025 22:18:26 -0600 Subject: [PATCH] Add trail prepass scaffolding --- worldgen-c/bin/worldgen | Bin 135992 -> 135968 bytes worldgen-c/include/worldgen.h | 1 + worldgen-c/src/main.c | 39 ++++++- worldgen-c/src/worldgen.c | 188 +++++++++++++++++++++++++++++++++- 4 files changed, 225 insertions(+), 3 deletions(-) diff --git a/worldgen-c/bin/worldgen b/worldgen-c/bin/worldgen index 7cb76f4274c9864fd62d8b67ad47273da9b72712..809b626cdc4d77982119ec16bdea66b12e077888 100755 GIT binary patch delta 48021 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 B#83bL delta 46635 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 diff --git a/worldgen-c/include/worldgen.h b/worldgen-c/include/worldgen.h index 2b65b2b..3b3ccd9 100644 --- a/worldgen-c/include/worldgen.h +++ b/worldgen-c/include/worldgen.h @@ -79,5 +79,6 @@ typedef struct { void worldgen_init(worldgen_ctx *ctx, int world_seed, int sea_level, int snow_line); void worldgen_generate_chunk(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out); void worldgen_prepass(worldgen_ctx *ctx, int min_x, int max_x, int min_z, int max_z); +void worldgen_free_trails(worldgen_ctx *ctx); #endif diff --git a/worldgen-c/src/main.c b/worldgen-c/src/main.c index 1f5a76c..ee60e1a 100644 --- a/worldgen-c/src/main.c +++ b/worldgen-c/src/main.c @@ -52,6 +52,9 @@ typedef struct { pthread_mutex_t *log_mu; int enable_trails; results_buffer *results; + struct trail_segment *trail_segments; + size_t trail_segment_count; + int prepass_min_x, prepass_max_x, prepass_min_z, prepass_max_z; } worker_args; typedef enum { @@ -654,6 +657,16 @@ static void *worker_fn(void *ptr) { worldgen_ctx ctx; worldgen_init(&ctx, args->world_seed, args->sea_level, args->snow_line); ctx.enable_trails = args->enable_trails; + if (args->trail_segments && args->trail_segment_count > 0) { + ctx.trail_segments = args->trail_segments; + ctx.trail_segment_count = args->trail_segment_count; + ctx.trail_segment_cap = args->trail_segment_count; + ctx.prepass_done = 1; + ctx.prepass_min_x = args->prepass_min_x; + ctx.prepass_max_x = args->prepass_max_x; + ctx.prepass_min_z = args->prepass_min_z; + ctx.prepass_max_z = args->prepass_max_z; + } while (1) { size_t idx = atomic_fetch_add(&args->queue->next_index, 1); if (idx >= args->queue->count) break; @@ -698,6 +711,9 @@ int main(int argc, char **argv) { const char *out_dir = "output"; output_format format = FORMAT_MCA; + /* Prepass context */ + worldgen_ctx pre_ctx; + int prepass_ready = 0; for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "--radius") == 0 && i + 1 < argc) { radius = (int)parse_long(argv[++i]); @@ -753,6 +769,18 @@ int main(int argc, char **argv) { snow_line = sea_level + 38; } + /* Global prepass: compute trails based on target area before threading */ + worldgen_init(&pre_ctx, world_seed, sea_level, snow_line); + pre_ctx.enable_trails = enable_trails; + int world_min_x = min_x * CHUNK_SIZE; + int world_max_x = max_x * CHUNK_SIZE + (CHUNK_SIZE - 1); + int world_min_z = min_z * CHUNK_SIZE; + int world_max_z = max_z * CHUNK_SIZE + (CHUNK_SIZE - 1); + if (enable_trails) { + worldgen_prepass(&pre_ctx, world_min_x, world_max_x, world_min_z, world_max_z); + prepass_ready = 1; + } + if (!have_rect) { min_x = center_x - radius; max_x = center_x + radius; @@ -800,7 +828,13 @@ int main(int argc, char **argv) { .snow_line = snow_line, .log_mu = &log_mu, .enable_trails = enable_trails, - .results = &results}; + .results = &results, + .trail_segments = prepass_ready ? pre_ctx.trail_segments : NULL, + .trail_segment_count = prepass_ready ? pre_ctx.trail_segment_count : 0, + .prepass_min_x = world_min_x, + .prepass_max_x = world_max_x, + .prepass_min_z = world_min_z, + .prepass_max_z = world_max_z}; for (int i = 0; i < threads; ++i) { pthread_create(&workers[i], NULL, worker_fn, &args); @@ -861,5 +895,8 @@ int main(int argc, char **argv) { free(results.chunks); free(workers); free(jobs); + if (prepass_ready) { + worldgen_free_trails(&pre_ctx); + } return 0; } diff --git a/worldgen-c/src/worldgen.c b/worldgen-c/src/worldgen.c index 1d8d29b..9a38c92 100644 --- a/worldgen-c/src/worldgen.c +++ b/worldgen-c/src/worldgen.c @@ -131,6 +131,7 @@ static void generate_chunk_grass(worldgen_ctx *ctx, int chunk_x, int chunk_z, co static void generate_chunk_flowers(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void generate_chunk_cabins(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out); static void ensure_trail_prepass(worldgen_ctx *ctx, int chunk_x, int chunk_z); +static void append_trail_segment(worldgen_ctx *ctx, int ax, int az, int bx, int bz, int *points, int count); static void trail_node_position(worldgen_ctx *ctx, int node_x, int node_z, double spacing, double *out_x, double *out_z); static void carve_trail_pad(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int center_x, int center_z, int radius, int target_height); static void carve_trail_span(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_data *out, column_data columns[CHUNK_SIZE][CHUNK_SIZE], int x0, int z0, int x1, int z1, int width); @@ -141,6 +142,8 @@ static uint16_t generate_normal_ores(worldgen_ctx *ctx, int x, int y, int z, con static void connect_cabin_to_trail(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *chunk, int door_x, int door_z, int door_side, int path_width); +static column_data get_column_data(worldgen_ctx *ctx, int x, int z); +static int generate_coal(worldgen_ctx *ctx, int x, int y, int z, int column_height, biome_id biome); static uint32_t hash_coords(int x, int z, uint32_t seed) { uint32_t h = (uint32_t)(x * 374761393 + z * 668265263) ^ seed; @@ -179,6 +182,163 @@ static double land_value(worldgen_ctx *ctx, int x, int z) { return value; } +static void append_trail_segment(worldgen_ctx *ctx, int ax, int az, int bx, int bz, int *points, int count) { + if (ctx->trail_segment_count >= ctx->trail_segment_cap) { + size_t new_cap = ctx->trail_segment_cap ? ctx->trail_segment_cap * 2 : 32; + trail_segment *resized = (trail_segment *)realloc(ctx->trail_segments, new_cap * sizeof(trail_segment)); + if (!resized) return; + ctx->trail_segments = resized; + ctx->trail_segment_cap = new_cap; + } + trail_segment *seg = &ctx->trail_segments[ctx->trail_segment_count]; + memset(seg, 0, sizeof(*seg)); + seg->ax = ax; + seg->az = az; + seg->bx = bx; + seg->bz = bz; + seg->points = points; + seg->count = count; + ctx->trail_segment_count++; +} + +void worldgen_prepass(worldgen_ctx *ctx, int min_x, int max_x, int min_z, int max_z) { + if (!ctx) return; + if (ctx->prepass_done) { + if (min_x >= ctx->prepass_min_x && max_x <= ctx->prepass_max_x && + min_z >= ctx->prepass_min_z && max_z <= ctx->prepass_max_z) { + return; + } + } + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + free(ctx->trail_segments[i].points); + } + free(ctx->trail_segments); + ctx->trail_segments = NULL; + ctx->trail_segment_count = 0; + ctx->trail_segment_cap = 0; + + const int step = 64; + const int max_points = 48; + const double min_spacing = 96.0; + int cap = max_points; + int count = 0; + int *px = (int *)malloc((size_t)cap * sizeof(int)); + int *pz = (int *)malloc((size_t)cap * sizeof(int)); + double *pv = (double *)malloc((size_t)cap * sizeof(double)); + if (!px || !pz || !pv) { + free(px); free(pz); free(pv); + goto done; + } + for (int z = min_z; z <= max_z; z += step) { + for (int x = min_x; x <= max_x; x += step) { + double val = land_value(ctx, x, z); + if (val < 0.05) continue; + int spaced = 1; + for (int i = 0; i < count; ++i) { + double dx = (double)(x - px[i]); + double dz = (double)(z - pz[i]); + if (dx * dx + dz * dz < min_spacing * min_spacing) { + spaced = 0; + break; + } + } + if (!spaced) continue; + if (count < cap) { + px[count] = x; + pz[count] = z; + pv[count] = val; + count++; + } + if (count >= max_points) break; + } + if (count >= max_points) break; + } + if (count == 0) { + px = (int *)realloc(px, sizeof(int)); + pz = (int *)realloc(pz, sizeof(int)); + pv = (double *)realloc(pv, sizeof(double)); + if (!px || !pz || !pv) { + free(px); free(pz); free(pv); + goto done; + } + px[0] = (min_x + max_x) / 2; + pz[0] = (min_z + max_z) / 2; + pv[0] = 1.0; + count = 1; + } + int root = 0; + for (int i = 1; i < count; ++i) { + if (pv[i] > pv[root]) root = i; + } + unsigned char *connected = (unsigned char *)calloc((size_t)count, 1); + if (!connected) { + free(px); free(pz); free(pv); + goto done; + } + connected[root] = 1; + int connected_count = 1; + while (connected_count < count) { + int best_u = -1, best_v = -1; + double best_d2 = DBL_MAX; + for (int u = 0; u < count; ++u) { + if (!connected[u]) continue; + for (int v = 0; v < count; ++v) { + if (connected[v]) continue; + double dx = (double)(px[u] - px[v]); + double dz = (double)(pz[u] - pz[v]); + double d2 = dx * dx + dz * dz; + if (d2 < best_d2) { + best_d2 = d2; + best_u = u; + best_v = v; + } + } + } + if (best_u == -1 || best_v == -1) break; + int *pts = NULL; + int path_count = 0; + if (build_trail_path(ctx, (double)px[best_u], (double)pz[best_u], (double)px[best_v], (double)pz[best_v], &pts, &path_count) && pts && path_count >= 2) { + append_trail_segment(ctx, px[best_u], pz[best_u], px[best_v], pz[best_v], pts, path_count); + } else { + free(pts); + } + connected[best_v] = 1; + connected_count++; + } + free(connected); + free(px); + free(pz); + free(pv); + +done: + ctx->prepass_done = 1; + ctx->prepass_min_x = min_x; + ctx->prepass_max_x = max_x; + ctx->prepass_min_z = min_z; + ctx->prepass_max_z = max_z; +} + +static void ensure_trail_prepass(worldgen_ctx *ctx, int chunk_x, int chunk_z) { + if (!ctx) return; + if (ctx->prepass_done) return; + int min_x = (chunk_x - 8) * CHUNK_SIZE; + int max_x = (chunk_x + 8) * CHUNK_SIZE + (CHUNK_SIZE - 1); + int min_z = (chunk_z - 8) * CHUNK_SIZE; + int max_z = (chunk_z + 8) * CHUNK_SIZE + (CHUNK_SIZE - 1); + worldgen_prepass(ctx, min_x, max_x, min_z, max_z); +} + +void worldgen_free_trails(worldgen_ctx *ctx) { + if (!ctx || !ctx->trail_segments) return; + for (size_t i = 0; i < ctx->trail_segment_count; ++i) { + free(ctx->trail_segments[i].points); + } + free(ctx->trail_segments); + ctx->trail_segments = NULL; + ctx->trail_segment_count = 0; + ctx->trail_segment_cap = 0; +} + static void set_block_with_height(chunk_data *chunk, int local_x, int local_z, int y, uint16_t id) { if (local_x < 0 || local_x >= CHUNK_SIZE || local_z < 0 || local_z >= CHUNK_SIZE) return; if (y < 0 || y >= CHUNK_HEIGHT) return; @@ -2636,16 +2796,38 @@ static void carve_trail_span(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_ } static void generate_chunk_trails(worldgen_ctx *ctx, int chunk_x, int chunk_z, column_data columns[CHUNK_SIZE][CHUNK_SIZE], chunk_data *out) { - const double spacing = TRAIL_NODE_SPACING; int chunk_min_x = chunk_x * CHUNK_SIZE; int chunk_max_x = chunk_min_x + CHUNK_SIZE - 1; int chunk_min_z = chunk_z * CHUNK_SIZE; int chunk_max_z = chunk_min_z + CHUNK_SIZE - 1; + int width = TRAIL_WIDTH; + + if (ctx->trail_segment_count > 0) { + for (size_t s = 0; s < ctx->trail_segment_count; ++s) { + trail_segment *seg = &ctx->trail_segments[s]; + if (!seg || seg->count < 2) continue; + for (int i = 1; i < seg->count; ++i) { + int x0 = seg->points[(i - 1) * 2]; + int z0 = seg->points[(i - 1) * 2 + 1]; + int x1 = seg->points[i * 2]; + int z1 = seg->points[i * 2 + 1]; + int span_min_x = (x0 < x1) ? x0 : x1; + int span_max_x = (x0 > x1) ? x0 : x1; + int span_min_z = (z0 < z1) ? z0 : z1; + int span_max_z = (z0 > z1) ? z0 : z1; + if (span_max_x < chunk_min_x - 4 || span_min_x > chunk_max_x + 4) continue; + if (span_max_z < chunk_min_z - 4 || span_min_z > chunk_max_z + 4) continue; + carve_trail_span(ctx, chunk_x, chunk_z, out, columns, x0, z0, x1, z1, width); + } + } + return; + } + + const double spacing = TRAIL_NODE_SPACING; int min_node_x = (int)floor((chunk_min_x - spacing) / spacing); int max_node_x = (int)ceil((chunk_max_x + spacing) / spacing); int min_node_z = (int)floor((chunk_min_z - spacing) / spacing); int max_node_z = (int)ceil((chunk_max_z + spacing) / spacing); - int width = TRAIL_WIDTH; size_t neighbor_count = sizeof(TRAIL_NEIGHBOR_OFFSETS) / sizeof(TRAIL_NEIGHBOR_OFFSETS[0]); for (int nx = min_node_x; nx <= max_node_x; ++nx) { for (int nz = min_node_z; nz <= max_node_z; ++nz) { @@ -2695,6 +2877,8 @@ void worldgen_generate_chunk(worldgen_ctx *ctx, int chunk_x, int chunk_z, chunk_ out->chunk_x = chunk_x; out->chunk_z = chunk_z; + ensure_trail_prepass(ctx, chunk_x, chunk_z); + // Precompute column data for base terrain column_data columns[CHUNK_SIZE][CHUNK_SIZE]; for (int dx = 0; dx < CHUNK_SIZE; ++dx) {