multi-threaded chunk loading

This commit is contained in:
onezplpl 2024-07-13 17:02:49 -04:00
parent 186ea5f204
commit 7b9de49502
No known key found for this signature in database
GPG key ID: 7EC026A136F9EEC3
4 changed files with 73 additions and 58 deletions

46
gen.c
View file

@ -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];