diff options
| author | Aaditya Dhruv <[email protected]> | 2026-01-27 22:35:54 -0600 |
|---|---|---|
| committer | Aaditya Dhruv <[email protected]> | 2026-01-27 22:35:54 -0600 |
| commit | 17cd7420e9d2432d56f9c69c6e4a8ab665ef4b9b (patch) | |
| tree | 7bcfc1d05b9b058240799d714ea0674f5eed58f3 /src | |
| parent | 186889aaa18426d31c268735a4d34b494234f421 (diff) | |
Add World and multi-chunk rendering
- More than 1 chunk can now be rendered with the help of the world
struct
- Block coords are now in world space, not local space
- Engine init code cleaned up for cleaner world/chunk handling
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/chunk.c | 30 | ||||
| -rw-r--r-- | src/chunk.h | 16 | ||||
| -rw-r--r-- | src/engine.c | 27 | ||||
| -rw-r--r-- | src/junkcraft.c | 1 | ||||
| -rw-r--r-- | src/world.c | 28 | ||||
| -rw-r--r-- | src/world.h | 5 |
7 files changed, 87 insertions, 21 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 34e23b2..f86a139 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,4 +7,5 @@ add_executable(junkcraft window.c engine.c chunk.c + world.c ) diff --git a/src/chunk.c b/src/chunk.c index 77c2301..982882d 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -17,10 +17,28 @@ void _chunk_plains_gen(struct chunk* chunk); -int chunk_gen(struct world* world, struct chunk *chunk) { - // struct chunk neighbor = {0}; +int chunk_gen(struct world* world, vec2 coord, struct chunk **chunk) { + *chunk = malloc(sizeof(struct chunk)); + memcpy((*chunk)->coord,coord, sizeof(vec2)); + // struct chunk* neighbor_top = { 0 }; + // struct chunk* neighbor_bottom = { 0 }; + // struct chunk* neighbor_left = { 0 }; + // struct chunk* neighbor_right = { 0 }; + // vec2 top = { 0, 1 }; + // vec2 bottom = { 0, -1 }; + // vec2 left = { -1, 0 }; + // vec2 right = { 1, 0 }; + // glm_vec2_add(top, coord, top); + // glm_vec2_add(bottom, coord, bottom); + // glm_vec2_add(left, coord, left); + // glm_vec2_add(right, coord, right); + // world_get_chunk(world, top, &neighbor_top); + // world_get_chunk(world, bottom, &neighbor_bottom); + // world_get_chunk(world, left, &neighbor_left); + // world_get_chunk(world, right, &neighbor_right); + // world_get_chunk(world, chunk->coord, &neighbor); - _chunk_plains_gen(chunk); + _chunk_plains_gen(*chunk); // switch (chunk->biome) { // case JUNK_BIOME_PLAINS: // _ @@ -95,13 +113,11 @@ void _chunk_plains_gen(struct chunk* chunk) { int z_final = (z1 + z2) / 2; for (int h = 0; h < z_final; h++) { struct block* blk = malloc(sizeof(struct block)); - vec3 pos = {x, h, -y - 1}; + // Adjust block coordinates with global chunk coordinates + vec3 pos = {x + (CHUNK_WIDTH * chunk->coord[0]), h, -y - 1 - (CHUNK_LENGTH * chunk->coord[1])}; block_init(pos, blk); chunk->blocks[x][y][h] = blk; } } } - fprintf(stderr, "POI Coords\n"); - glm_vec3_print(poi1, stderr); - glm_vec3_print(poi2, stderr); } diff --git a/src/chunk.h b/src/chunk.h index 87c33fa..4d06f5f 100644 --- a/src/chunk.h +++ b/src/chunk.h @@ -1,21 +1,27 @@ #pragma once #include "block.h" #include "world.h" -#include "junk/vector.h" #include <stdint.h> -enum biome { - JUNK_BIOME_PLAINS, -}; #define CHUNK_WIDTH 16 #define CHUNK_LENGTH 16 #define CHUNK_HEIGHT 128 +enum biome { + JUNK_BIOME_PLAINS, +}; + + +//NOTE: Forward declare world here. There is a circular dependency between +// chunk and world, and the order in which compiler sees them causes issues. +// World.c compiles -> includes world.h -> first line is include chunk.h -> struct world +// is used here, which messes it up. Forward declare to avoid errors +struct world; struct chunk { struct block* blocks[CHUNK_WIDTH][CHUNK_LENGTH][CHUNK_HEIGHT]; enum biome biome; vec2 coord; }; -int chunk_gen(struct world* world, struct chunk* chunk); +int chunk_gen(struct world* wld, vec2 coord, struct chunk** chunk); int chunk_gen_structures(void* neighbor_data, struct chunk* chunk); int chunk_gen_terrain(void* neighbor_data, struct chunk* chunk); diff --git a/src/engine.c b/src/engine.c index d8df9b3..08f4852 100644 --- a/src/engine.c +++ b/src/engine.c @@ -2,7 +2,11 @@ #include "block.h" #include "chunk.h" #include "window.h" +#include "world.h" #include <junk/vector.h> +#include <time.h> + +void _engine_insert_chunk_ptrs(struct engine* engine, struct chunk* chunk); int engine_init(struct engine *engine) { // Setup the Window @@ -27,9 +31,22 @@ int engine_init(struct engine *engine) { // Setup Objects to draw vector_init(&engine->objects); // Setup root chunk - struct chunk* chunk = malloc(sizeof(struct chunk)); - chunk_gen(NULL, chunk); - + struct world* world; + world_init(time(NULL), &world); + vec2 curr_chunk = { 0, 0 }; + int chunk_distance = 2; + for (int i = 0; i < chunk_distance; i++) { + for (int j = 0; j < chunk_distance; j++) { + struct chunk* chunk; + vec2 chunk_coord = { curr_chunk[0] + i, curr_chunk[1] + j }; + world_get_chunk(world, chunk_coord, &chunk); + _engine_insert_chunk_ptrs(engine, chunk); + } + } + engine->game_loop = 1; + return 0; +} +void _engine_insert_chunk_ptrs(struct engine* engine, struct chunk* chunk) { int counter = 0; for (int i = 0; i < CHUNK_WIDTH; i++) { for (int j = 0; j < CHUNK_LENGTH; j++) { @@ -44,9 +61,6 @@ int engine_init(struct engine *engine) { } } } - - engine->game_loop = 1; - return 0; } void engine_draw(struct engine* engine) { @@ -59,6 +73,7 @@ void engine_draw(struct engine* engine) { } } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearColor(0.529f, 0.808f, 0.922f, 1.0f); glEnable(GL_DEPTH_TEST); //glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glUseProgram(engine->shader->program); diff --git a/src/junkcraft.c b/src/junkcraft.c index 6a12a40..4a1a96a 100644 --- a/src/junkcraft.c +++ b/src/junkcraft.c @@ -2,7 +2,6 @@ #include <time.h> int main() { - srand(time(NULL)); struct engine engine = { 0 }; if (engine_init(&engine) != 0) { return -1; diff --git a/src/world.c b/src/world.c new file mode 100644 index 0000000..e81f100 --- /dev/null +++ b/src/world.c @@ -0,0 +1,28 @@ +#include "world.h" +#include <stdlib.h> +#include <string.h> + +int world_init(int32_t seed, struct world** world) { + srand(seed); + struct world* wld = malloc(sizeof(struct world)); + memset(wld, 0, sizeof(struct world)); + wld->seed = seed; + for (int i = 0; i < WORLD_WIDTH; i++) { + for (int j = 0; j < WORLD_LENGTH; j++) { + struct chunk* chunk; + vec2 coords = { i, j }; + chunk_gen(wld, coords, &chunk); + wld->chunks[i][j] = chunk; + + } + } + *world = wld; + return 0; +} + +int world_get_chunk(struct world* world, vec2 coord, struct chunk** chunk) { + int x = (int)coord[0] % WORLD_WIDTH; + int y = (int)coord[1] % WORLD_LENGTH; + *chunk = world->chunks[x][y]; + return 0; +} diff --git a/src/world.h b/src/world.h index 5be1cf2..c65a1d0 100644 --- a/src/world.h +++ b/src/world.h @@ -3,11 +3,12 @@ #include <stdint.h> #define WORLD_LENGTH 32 #define WORLD_WIDTH 32 + struct world { struct chunk* chunks[WORLD_WIDTH][WORLD_LENGTH]; int32_t seed; }; -int world_init(int32_t seed); +int world_init(int32_t seed, struct world** world); int world_save(int32_t seed); -int world_get_chunk(struct world* world, vec2 coord, struct chunk* chunk); +int world_get_chunk(struct world* world, vec2 coord, struct chunk** chunk); |
