diff --git a/game/src/chunk/chunk.c b/game/src/chunk/chunk.c index 2ace894..81b1f0c 100644 --- a/game/src/chunk/chunk.c +++ b/game/src/chunk/chunk.c @@ -12,18 +12,18 @@ Chunk_new () } void -Chunk_random (Chunk *chunk, int xoffset, int yoffset) +Chunk_random (Chunk *chunk, int xoffset, int zoffset) { - for (int y = 0; y < CHUNK_DIM; ++y) + for (int z = 0; z < CHUNK_DIM; ++z) { for (int x = 0; x < CHUNK_DIM; ++x) { - chunk->heightmap[INDEX (x, y)] = + chunk->heightmap[INDEX (x, z)] = (glm_perlin_vec2 - ((vec2) { (x + xoffset + 0.5) / 10.0, (y + yoffset + 0.5) / 10.0 }) + 0.6) * 5; + ((vec2) { (x + xoffset + 0.5) / 10.0, (z + zoffset + 0.5) / 10.0 }) + 0.6) * 5; - chunk->materialmap[INDEX (x, y)] = (int) - (glm_perlin_vec2 ((vec2) { (x + xoffset + 0.5) / 20.0, (y + yoffset + 0.5) / 20.0 }) + 0.6 * 5) % 5; + chunk->materialmap[INDEX (x, z)] = (int) + (glm_perlin_vec2 ((vec2) { (x + xoffset + 0.5) / 20.0, (z + zoffset + 0.5) / 20.0 }) + 0.6 * 5) % 5; } } } @@ -40,13 +40,13 @@ Chunk_heightmap_print (Chunk *chunk) { INFO ("== Chunk heightmap =="); - for (int y = 0; y < CHUNK_DIM; ++y) + for (int z = 0; z < CHUNK_DIM; ++z) { char row[CHUNK_DIM+1]; for (int x = 0; x < CHUNK_DIM; ++x) { - row[x] = (int) chunk->heightmap[INDEX (x, y)] + 48; + row[x] = (int) chunk->heightmap[INDEX (x, z)] + 48; } row[CHUNK_DIM] = '\0'; diff --git a/game/src/chunk/chunk.h b/game/src/chunk/chunk.h index 6fb3461..75af918 100644 --- a/game/src/chunk/chunk.h +++ b/game/src/chunk/chunk.h @@ -9,7 +9,7 @@ #define CHUNK_DIM 16 #define CHUNK_SIZE (CHUNK_DIM*CHUNK_DIM) -#define INDEX(x, y) (CHUNK_DIM * (y) + (x)) +#define INDEX(x, z) (CHUNK_DIM * (z) + (x)) typedef struct Chunk { @@ -18,6 +18,6 @@ typedef struct Chunk } Chunk; Chunk *Chunk_new (); -void Chunk_random (Chunk *chunk, int x, int y); +void Chunk_random (Chunk *chunk, int xoffset, int zoffset); void Chunk_free (Chunk *chunk); void Chunk_heightmap_print (Chunk *chunk); diff --git a/game/src/chunk/manager.c b/game/src/chunk/manager.c index 3318678..d1539ac 100644 --- a/game/src/chunk/manager.c +++ b/game/src/chunk/manager.c @@ -21,14 +21,21 @@ cm_ivec2_equal (gconstpointer a, gconstpointer b) } ivec2 * -cm_make_key(int x, int y) +cm_make_key(int x, int z) { ivec2 *key = malloc(sizeof(ivec2)); (*key)[0] = x; - (*key)[1] = y; + (*key)[1] = z; return key; } +void +cm_world_to_chunk (float x, float z, int *ox, int *oz) +{ + *ox = floor (x / (float) CHUNK_DIM); + *oz = floor (z / (float) CHUNK_DIM); +} + void ChunkManager_init () { @@ -37,56 +44,48 @@ ChunkManager_init () } void -cm_world_to_chunk (float x, float y, int *ox, int *oy) +ChunkManager_update (float camera_x, float camera_z) { - *ox = floor (x / (float) CHUNK_DIM); - *oy = floor (y / (float) CHUNK_DIM); -} + int cx = 0, cz = 0; + cm_world_to_chunk (camera_x, camera_z, &cx, &cz); -void -ChunkManager_update (float px, float py) -/* x = camera's X position, y = camera's Y position */ -{ - int cx = 0, cy = 0; - cm_world_to_chunk (px, py, &cx, &cy); - - for (int y = cy - RENDER_DISTANCE - 1; y <= cy + RENDER_DISTANCE + 1; ++y) + for (int z = cz - RENDER_DISTANCE - 1; z <= cz + RENDER_DISTANCE + 1; ++z) { for (int x = cx - RENDER_DISTANCE - 1; x <= cx + RENDER_DISTANCE + 1; ++x) { - if (ChunkManager_get_Chunk_at (x, y) == NULL) + if (ChunkManager_get_Chunk_at (x, z) == NULL) { - ChunkManager_generate_Chunk_at (x, y); + ChunkManager_generate_Chunk_at (x, z); } } } - for (int y = cy - RENDER_DISTANCE; y <= cy + RENDER_DISTANCE; ++y) + for (int z = cz - RENDER_DISTANCE; z <= cz + RENDER_DISTANCE; ++z) { for (int x = cx - RENDER_DISTANCE; x <= cx + RENDER_DISTANCE; ++x) { - if (ChunkManager_get_ChunkMesh_at (x, y) == NULL) + if (ChunkManager_get_ChunkMesh_at (x, z) == NULL) { - ChunkManager_generate_ChunkMesh_at (x, y); + ChunkManager_generate_ChunkMesh_at (x, z); } } } } void -ChunkManager_render (float px, float py, int program) +ChunkManager_render (float camera_x, float camera_z, int program) { - int cx = 0, cy = 0; - cm_world_to_chunk (px, py, &cx, &cy); + int cx = 0, cz = 0; + cm_world_to_chunk (camera_x, camera_z, &cx, &cz); - for (int y = cy - RENDER_DISTANCE; y <= cy + RENDER_DISTANCE; ++y) + for (int z = cz - RENDER_DISTANCE; z <= cz + RENDER_DISTANCE; ++z) { for (int x = cx - RENDER_DISTANCE; x <= cx + RENDER_DISTANCE; ++x) { - ChunkMesh *mesh = ChunkManager_get_ChunkMesh_at (x, y); + ChunkMesh *mesh = ChunkManager_get_ChunkMesh_at (x, z); if (mesh != NULL) { - program_set_vec3 (program, "chunk_position", x * CHUNK_DIM, 0.0, y * CHUNK_DIM); + program_set_vec3 (program, "chunk_position", x * CHUNK_DIM, 0.0, z * CHUNK_DIM); ChunkMesh_render (mesh); } } @@ -94,50 +93,50 @@ ChunkManager_render (float px, float py, int program) } Chunk * -ChunkManager_get_Chunk_at (int x, int y) +ChunkManager_get_Chunk_at (int x, int z) { - return (Chunk *) g_hash_table_lookup (chunk_manager.chunks, (ivec2) { x, y }); + return (Chunk *) g_hash_table_lookup (chunk_manager.chunks, (ivec2) { x, z }); } void -ChunkManager_set_Chunk_at (int x, int y, Chunk *chunk) +ChunkManager_set_Chunk_at (int x, int z, Chunk *chunk) { - g_hash_table_insert (chunk_manager.chunks, cm_make_key (x, y), chunk); + g_hash_table_insert (chunk_manager.chunks, cm_make_key (x, z), chunk); } void -ChunkManager_generate_Chunk_at (int x, int y) +ChunkManager_generate_Chunk_at (int x, int z) { Chunk *chunk = Chunk_new (); - Chunk_random (chunk, x * CHUNK_DIM, y * CHUNK_DIM); - ChunkManager_set_Chunk_at (x, y, chunk); + Chunk_random (chunk, x * CHUNK_DIM, z * CHUNK_DIM); + ChunkManager_set_Chunk_at (x, z, chunk); } void -ChunkManager_get_Chunk_neighbors_at (int x, int y, Chunk **nr, Chunk **nd, Chunk **nc) +ChunkManager_get_Chunk_neighbors_at (int x, int z, Chunk **nr, Chunk **nd, Chunk **nc) { - *nr = ChunkManager_get_Chunk_at (x + 1, y); - *nd = ChunkManager_get_Chunk_at (x, y + 1); - *nc = ChunkManager_get_Chunk_at (x + 1, y + 1); + *nr = ChunkManager_get_Chunk_at (x + 1, z); + *nd = ChunkManager_get_Chunk_at (x, z + 1); + *nc = ChunkManager_get_Chunk_at (x + 1, z + 1); } ChunkMesh * -ChunkManager_get_ChunkMesh_at (int x, int y) +ChunkManager_get_ChunkMesh_at (int x, int z) { - return (ChunkMesh *) g_hash_table_lookup (chunk_manager.chunk_meshes, (ivec2) { x, y }); + return (ChunkMesh *) g_hash_table_lookup (chunk_manager.chunk_meshes, (ivec2) { x, z }); } void -ChunkManager_set_ChunkMesh_at (int x, int y, ChunkMesh *mesh) +ChunkManager_set_ChunkMesh_at (int x, int z, ChunkMesh *mesh) { - g_hash_table_insert (chunk_manager.chunk_meshes, cm_make_key (x, y), mesh); + g_hash_table_insert (chunk_manager.chunk_meshes, cm_make_key (x, z), mesh); } void -ChunkManager_generate_ChunkMesh_at (int x, int y) +ChunkManager_generate_ChunkMesh_at (int x, int z) { Chunk *nr, *nd, *nc; - ChunkManager_get_Chunk_neighbors_at (x, y, &nr, &nd, &nc); + ChunkManager_get_Chunk_neighbors_at (x, z, &nr, &nd, &nc); ChunkManager_set_ChunkMesh_at - (x, y, ChunkMesh_build (ChunkManager_get_Chunk_at (x, y), nr, nd, nc)); + (x, z, ChunkMesh_build (ChunkManager_get_Chunk_at (x, z), nr, nd, nc)); } diff --git a/game/src/chunk/manager.h b/game/src/chunk/manager.h index 1fa81c2..9cff0fb 100644 --- a/game/src/chunk/manager.h +++ b/game/src/chunk/manager.h @@ -22,12 +22,12 @@ void ChunkManager_init (); void ChunkManager_update (float px, float py); void ChunkManager_render (float px, float py, int program); -Chunk *ChunkManager_get_Chunk_at (int x, int y); -void ChunkManager_get_Chunk_neighbors_at (int x, int y, Chunk **nr, Chunk **nd, Chunk **nc); -void ChunkManager_set_Chunk_at (int x, int y, Chunk *chunk); +Chunk *ChunkManager_get_Chunk_at (int x, int z); +void ChunkManager_get_Chunk_neighbors_at (int x, int z, Chunk **nr, Chunk **nd, Chunk **nc); +void ChunkManager_set_Chunk_at (int x, int z, Chunk *chunk); -ChunkMesh *ChunkManager_get_ChunkMesh_at (int x, int y); -void ChunkManager_set_ChunkMesh_at (int x, int y, ChunkMesh *mesh); +ChunkMesh *ChunkManager_get_ChunkMesh_at (int x, int z); +void ChunkManager_set_ChunkMesh_at (int x, int z, ChunkMesh *mesh); -void ChunkManager_generate_Chunk_at (int x, int y); -void ChunkManager_generate_ChunkMesh_at (int x, int y); +void ChunkManager_generate_Chunk_at (int x, int z); +void ChunkManager_generate_ChunkMesh_at (int x, int z); diff --git a/game/src/chunk/mesh.c b/game/src/chunk/mesh.c index 413aece..2c74a27 100644 --- a/game/src/chunk/mesh.c +++ b/game/src/chunk/mesh.c @@ -11,43 +11,43 @@ ChunkMesh_build (Chunk *chunk, Chunk *nr, Chunk *nd, Chunk *nc) unsigned int *indices = malloc (sizeof (unsigned int) * CHUNK_SIZE * 6); int m_i = 0, i_i = 0; - for (int y = 0; y < CHUNKMESH_DIM; ++y) + for (int z = 0; z < CHUNKMESH_DIM; ++z) { for (int x = 0; x < CHUNKMESH_DIM; ++x) { - float height = chunk->heightmap[INDEX (x, y)]; - float material_id = chunk->materialmap[INDEX (x, y)]; + float height = chunk->heightmap[INDEX (x, z)]; + float material_id = chunk->materialmap[INDEX (x, z)]; - if (x == CHUNK_DIM && y < CHUNK_DIM && nr != NULL) + if (x == CHUNK_DIM && z < CHUNK_DIM && nr != NULL) { - height = nr->heightmap[INDEX (0, y)]; - material_id = nr->materialmap[INDEX (0, y)]; + height = nr->heightmap[INDEX (0, z)]; + material_id = nr->materialmap[INDEX (0, z)]; } - if (y == CHUNK_DIM && x < CHUNK_DIM && nd != NULL) + if (z == CHUNK_DIM && x < CHUNK_DIM && nd != NULL) { height = nd->heightmap[INDEX (x, 0)]; material_id = nd->materialmap[INDEX (x, 0)]; } - if (x == CHUNK_DIM && y == CHUNK_DIM && nc != NULL) + if (x == CHUNK_DIM && z == CHUNK_DIM && nc != NULL) { height = nc->heightmap[INDEX (0, 0)]; material_id = nc->materialmap[INDEX (0, 0)]; } - glm_vec3_copy ((vec3) { x, height, y }, positions[CMINDEX (x, y)]); + glm_vec3_copy ((vec3) { x, height, z }, positions[CMINDEX (x, z)]); materials[m_i++] = material_id == 1 ? 1 : 0; materials[m_i++] = material_id == 2 ? 1 : 0; materials[m_i++] = material_id == 3 ? 1 : 0; materials[m_i++] = material_id == 4 ? 1 : 0; - if (x < CHUNK_DIM && y < CHUNK_DIM) + if (x < CHUNK_DIM && z < CHUNK_DIM) { - int i0 = CMINDEX (x, y); - int i1 = CMINDEX (x + 1, y); - int i2 = CMINDEX (x, y + 1); - int i3 = CMINDEX (x + 1, y + 1); + int i0 = CMINDEX (x, z); + int i1 = CMINDEX (x + 1, z); + int i2 = CMINDEX (x, z + 1); + int i3 = CMINDEX (x + 1, z + 1); /* i0----i1 diff --git a/game/src/chunk/mesh.h b/game/src/chunk/mesh.h index 23a0bbc..e23a02d 100644 --- a/game/src/chunk/mesh.h +++ b/game/src/chunk/mesh.h @@ -8,7 +8,7 @@ #define CHUNKMESH_DIM (CHUNK_DIM+1) #define CHUNKMESH_SIZE (CHUNKMESH_DIM*CHUNKMESH_DIM) -#define CMINDEX(x, y) (CHUNKMESH_DIM * (y) + (x)) +#define CMINDEX(x, z) (CHUNKMESH_DIM * (z) + (x)) typedef struct ChunkMesh {