Change all Y to Z
This commit is contained in:
@@ -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';
|
||||
|
||||
@@ -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);
|
||||
|
||||
+42
-43
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
+14
-14
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user