summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAaditya Dhruv <[email protected]>2026-01-27 22:35:54 -0600
committerAaditya Dhruv <[email protected]>2026-01-27 22:35:54 -0600
commit17cd7420e9d2432d56f9c69c6e4a8ab665ef4b9b (patch)
tree7bcfc1d05b9b058240799d714ea0674f5eed58f3 /src
parent186889aaa18426d31c268735a4d34b494234f421 (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.txt1
-rw-r--r--src/chunk.c30
-rw-r--r--src/chunk.h16
-rw-r--r--src/engine.c27
-rw-r--r--src/junkcraft.c1
-rw-r--r--src/world.c28
-rw-r--r--src/world.h5
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);