diff --git a/const.h b/const.h index 62368f3..103c34c 100644 --- a/const.h +++ b/const.h @@ -4,21 +4,19 @@ typedef struct Vertex { vec3 pos; -} Vertex; +} Vertex; typedef struct VertexI { int pos[3]; -} VertexI; - +} VertexI; typedef struct Vertex2 { vec2 pos; } Vertex2; - -#define CHUNK_LENGTH 16 -#define CHUNK_RADIUS_H 4//8 -#define CHUNK_RADIUS_V 4 //4 +#define CHUNK_LENGTH 8 +#define CHUNK_RADIUS_H 16 // 8 +#define CHUNK_RADIUS_V 8 // 4 #define TEXT_GAP_H 1 / 3.0 #define TEXT_GAP_V 1 / 1.0 @@ -28,7 +26,7 @@ typedef struct Vertex2 { #define CHUNK_ALL CHUNK_DIAMETER_H *CHUNK_DIAMETER_H *CHUNK_DIAMETER_V #define BLOCK_ALL CHUNK_LENGTH *CHUNK_LENGTH *CHUNK_LENGTH #define CBLOCK_ALL BLOCK_ALL *CHUNK_ALL -#define CBUF_ALL 25 +#define CBUF_ALL 10 #define CTRI_ALL CBLOCK_ALL * 18 * sizeof(Vertex) diff --git a/cubes.c b/cubes.c index dde7969..ec92330 100644 --- a/cubes.c +++ b/cubes.c @@ -12,15 +12,15 @@ struct args { }; void gen_face(Vertex *cube, int i, int x, int y, int z, int x2, int y2, int z2, - int j, int is_text, Chunk dat) { + int j, int is_text, Chunk dat, int ci) { VertexI a = {{x, y, z}}; Vertex a2 = {{x, y, z}}; if (is_text) { a.pos[i]--; int exists = 0; - exists = (cube_exists(x, y, z, dat) != - cube_exists(a.pos[0], a.pos[1], a.pos[2], dat)); + exists = (cube_exists(x, y, z, dat, ci) != + cube_exists(a.pos[0], a.pos[1], a.pos[2], dat, ci)); a2.pos[0] = exists ? TEXT_GAP_H * i : -1.0; a2.pos[1] = exists ? TEXT_GAP_V * i : -1.0; @@ -55,17 +55,21 @@ void *gen_chunk(void *args) { struct args args2 = ((struct args *)args)[0]; int i = args2.i; + int a = args2.a % CHUNK_DIAMETER_H; + int a2 = args2.a; int x2 = args2.pos.pos[0]; int y2 = args2.pos.pos[1]; int z2 = args2.pos.pos[2]; Vertex *cube = args2.cube; int is_text = args2.is_text; - Chunk chunk = - fetch_chunk(x2 / CHUNK_LENGTH, y2 / CHUNK_LENGTH, z2 / CHUNK_LENGTH); - printf("progress on this thread (%i / %i)\n", args2.a, CHUNK_ALL); + purge_chunks(a % CHUNK_DIAMETER_H); + + Chunk chunk = fetch_chunk(x2 / CHUNK_LENGTH, y2 / CHUNK_LENGTH, + z2 / CHUNK_LENGTH, a); + + printf("progress on this thread (%i / %i)\n", a2, CHUNK_ALL); - purge_chunks(); for (int y4 = 0; y4 < CHUNK_LENGTH; y4++) { for (int x4 = 0; x4 < CHUNK_LENGTH; x4++) { @@ -75,9 +79,9 @@ void *gen_chunk(void *args) { int x3 = x2 + x4; int z3 = z2 + z4; - gen_face(cube, 0, x3, y3, z3, x4, y4, z4, i, is_text, chunk); - gen_face(cube, 1, x3, y3, z3, x4, y4, z4, i + 6, is_text, chunk); - gen_face(cube, 2, x3, y3, z3, x4, y4, z4, i + 12, is_text, chunk); + gen_face(cube, 0, x3, y3, z3, x4, y4, z4, i, is_text, chunk, a ); + gen_face(cube, 1, x3, y3, z3, x4, y4, z4, i + 6, is_text, chunk, a ); + gen_face(cube, 2, x3, y3, z3, x4, y4, z4, i + 12, is_text, chunk, a); i += 18; } } @@ -92,38 +96,39 @@ void gen_cubes(Vertex *cube, int x, int y, int z, int is_text) { y *= CHUNK_LENGTH; z *= CHUNK_LENGTH; - pthread_t thread_id[24]; - for (int y2 = y - CHUNK_RADIUS_H * CHUNK_LENGTH; - y2 <= y + CHUNK_RADIUS_H * CHUNK_LENGTH; y2 += CHUNK_LENGTH) { +struct args args[CHUNK_DIAMETER_H]; + + pthread_t thread_id[CHUNK_DIAMETER_H]; + for (int y2 = y - CHUNK_RADIUS_V * CHUNK_LENGTH; + y2 <= y + CHUNK_RADIUS_V * CHUNK_LENGTH; y2 += CHUNK_LENGTH) { for (int x2 = x - CHUNK_RADIUS_H * CHUNK_LENGTH; x2 <= x + CHUNK_RADIUS_H * CHUNK_LENGTH; x2 += CHUNK_LENGTH) { - for (int z2 = z - CHUNK_RADIUS_V * CHUNK_LENGTH; - z2 <= z + CHUNK_RADIUS_V * CHUNK_LENGTH; z2 += CHUNK_LENGTH) { + for (int z2 = z - CHUNK_RADIUS_H * CHUNK_LENGTH; + z2 <= z + CHUNK_RADIUS_H * CHUNK_LENGTH; z2 += CHUNK_LENGTH) { VertexI pos = {{x2, y2, z2}}; - struct args args = {cube, pos, is_text, a, i}; + int a2 = a % CHUNK_DIAMETER_H; + args[a2].cube = cube; + args[a2].pos = pos; + args[a2].is_text = is_text; + args[a2].a = a; + args[a2].i = i; - gen_chunk((void *)&args); + /*gen_chunk((void *)&args); */ + + pthread_create(&(thread_id[a2]), NULL, gen_chunk, + (void *)&(args[a2])); i += CHUNK_LENGTH * CHUNK_LENGTH * CHUNK_LENGTH * 18; - /* buggy - pthread_create(&(thread_id[i]), NULL, gen_chunk, (void *)&args); - - if (i == 23) { - for (int k = 0; k < 24; k++) { - pthread_join((thread_id[k]), NULL); - } - i = 0; - } else { - i++; - } - */ - a++; } + + for (int k = 0; k < CHUNK_DIAMETER_H; k++) { + pthread_join((thread_id[k]), NULL); + } } } } \ No newline at end of file diff --git a/gen.c b/gen.c index 8a6bbde..78841d9 100644 --- a/gen.c +++ b/gen.c @@ -5,6 +5,7 @@ Chunk *chunks = NULL; int lastI = 0; +int seed = 69420; double interpolate(double a0, double a1, double w) { return (a1 - a0) * (3.0 - w * 2.0) * w * w + a0; @@ -13,10 +14,8 @@ double interpolate(double a0, double a1, double w) { int hash_combine(int a, int b) { return b + 0x9e3779b9 + (a << 6) + (a >> 2); } Vertex2 perlin_grad(int x, int y) { - srand(x); - int x_hash = rand(); - srand(y); - int y_hash = rand(); + int x_hash = hash_combine(x, seed); + int y_hash = hash_combine(seed, y); double random = hash_combine(x_hash, y_hash) * (M_PI / ~(~0u >> 1)); Vertex2 out = {cos(random), sin(random)}; @@ -58,16 +57,19 @@ double perlin_calc(double x, double y, double s) { return value; } -Chunk fetch_chunk(int x, int y, int z) { +Chunk fetch_chunk(int x, int y, int z, int ci) { if (chunks == NULL) { - chunks = calloc(CBUF_ALL, sizeof(Chunk)); + chunks = calloc(CBUF_ALL * CHUNK_DIAMETER_H, sizeof(Chunk)); } + + Chunk *chunks2 = &chunks[CBUF_ALL * ci]; + Chunk chunk; int i, j; for (j = 0; j < CBUF_ALL; j++) { i = (j + lastI) % CBUF_ALL; - chunk = chunks[i]; + chunk = chunks2[i]; if (chunk.x == x && chunk.y == y && chunk.z == z && chunk.exists) { // lastI = i; return chunk; @@ -76,7 +78,7 @@ Chunk fetch_chunk(int x, int y, int z) { for (j = CBUF_ALL - 1; j >= 0; j--) { i = j; - chunk = chunks[i]; + chunk = chunks2[i]; if (!chunk.exists) break; } @@ -97,8 +99,10 @@ Chunk fetch_chunk(int x, int y, int z) { int x3 = x2 + x * CHUNK_LENGTH; for (int z2 = 0; z2 < CHUNK_LENGTH; z2++) { int z3 = z2 + z * CHUNK_LENGTH; - double hp = (perlin_calc(x3, z3, 256.0) * 128.0); - int h = hp + 64; + double hp = perlin_calc(x3, z3, 128.0); + hp = ((hp > 0.0) ? -1.0 : 1.0) * (pow(fabs(hp),0.7)); + hp *= 32.0; + int h = hp + 32; for (int y2 = 0; y2 < CHUNK_LENGTH; y2++) { int y3 = y2 + y * CHUNK_LENGTH; @@ -108,22 +112,30 @@ Chunk fetch_chunk(int x, int y, int z) { } } - chunks[i] = chunk; + chunks2[i] = chunk; return chunk; } -void purge_chunks() { +void purge_chunks(int ci) { + /* free(chunks); chunks = calloc(CBUF_ALL, sizeof(Chunk)); + */ + if (chunks == NULL) { + chunks = calloc(CBUF_ALL * CHUNK_DIAMETER_H, sizeof(Chunk)); + } + memset(&chunks[CBUF_ALL * ci], 0, sizeof(Chunk) * CBUF_ALL); } -int cube_exists(int x, int y, int z, Chunk dat) { - if (x < 0 || y < 0 || z < 0) return 0; +int cube_exists(int x, int y, int z, Chunk dat, int ci) { + if (x < 0 || y < 0 || z < 0) + return 0; - if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) || dat.y != (y / CHUNK_LENGTH) || dat.z != (z / CHUNK_LENGTH) ) - dat = - fetch_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), (z / CHUNK_LENGTH)); + if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) || + dat.y != (y / CHUNK_LENGTH) || dat.z != (z / CHUNK_LENGTH)) + dat = fetch_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), + (z / CHUNK_LENGTH), ci); int h = dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH + (x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH]; diff --git a/gen.h b/gen.h index 65ff61a..8ecfa32 100644 --- a/gen.h +++ b/gen.h @@ -1,5 +1,5 @@ #include "const.h" -int cube_exists(int x, int y, int z, Chunk dat); -Chunk fetch_chunk(int x, int y, int z); -void purge_chunks(); \ No newline at end of file +int cube_exists(int x, int y, int z, Chunk dat, int ci); +Chunk fetch_chunk(int x, int y, int z, int ci); +void purge_chunks(int ci); \ No newline at end of file