many updates and improvements to chunk loading

This commit is contained in:
onezplpl 2024-07-13 21:18:55 -04:00
parent 7b9de49502
commit e21945fe23
No known key found for this signature in database
GPG key ID: 7EC026A136F9EEC3
6 changed files with 194 additions and 68 deletions

32
gen.c
View file

@ -2,6 +2,7 @@
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Chunk *chunks = NULL;
int lastI = 0;
@ -58,31 +59,37 @@ double perlin_calc(double x, double y, double s) {
}
Chunk fetch_chunk(int x, int y, int z, int ci) {
if (chunks == NULL) {
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;
i = j;
chunk = chunks2[i];
if (chunk.x == x && chunk.y == y && chunk.z == z && chunk.exists) {
// lastI = i;
return chunk;
}
}
for (j = CBUF_ALL - 1; j >= 0; j--) {
i = j;
chunk = chunks2[i];
if (!chunk.exists)
break;
}
char fname[1024];
snprintf(fname, 1023, "./db/chunk_%i_%i_%i.dat", x, y, z);
FILE *fp = fopen(fname, "rb+");
int code = (fp) ? fread(&chunk, sizeof(Chunk), 1, fp) : 0;
if (code != 0) {
fclose(fp);
return chunk;
}
if (!fp) {
fp = fopen(fname, "wb");
}
lastI = i;
if (i > CBUF_ALL - 1)
@ -100,7 +107,7 @@ Chunk fetch_chunk(int x, int y, int z, int ci) {
for (int z2 = 0; z2 < CHUNK_LENGTH; z2++) {
int z3 = z2 + z * CHUNK_LENGTH;
double hp = perlin_calc(x3, z3, 128.0);
hp = ((hp > 0.0) ? -1.0 : 1.0) * (pow(fabs(hp),0.7));
hp = ((hp > 0.0) ? -1.0 : 1.0) * (pow(fabs(hp), 0.7));
hp *= 32.0;
int h = hp + 32;
@ -114,6 +121,9 @@ Chunk fetch_chunk(int x, int y, int z, int ci) {
chunks2[i] = chunk;
fwrite(&chunk, sizeof(Chunk), 1, fp);
fclose(fp);
return chunk;
}
@ -123,7 +133,7 @@ void purge_chunks(int ci) {
chunks = calloc(CBUF_ALL, sizeof(Chunk));
*/
if (chunks == NULL) {
chunks = calloc(CBUF_ALL * CHUNK_DIAMETER_H, sizeof(Chunk));
chunks = calloc(CBUF_ALL * (CHUNK_DIAMETER_H + (MAX_R * 2)), sizeof(Chunk));
}
memset(&chunks[CBUF_ALL * ci], 0, sizeof(Chunk) * CBUF_ALL);
}