fog
This commit is contained in:
parent
887dfbe5c4
commit
5ff44a7335
5 changed files with 115 additions and 39 deletions
67
gen.c
67
gen.c
|
@ -7,7 +7,7 @@
|
|||
Chunk *chunks = NULL;
|
||||
int lastI = 0;
|
||||
int seed = 69420;
|
||||
|
||||
int prevExists = 0;
|
||||
double interpolate(double a0, double a1, double w) {
|
||||
return (a1 - a0) * (3.0 - w * 2.0) * w * w + a0;
|
||||
}
|
||||
|
@ -58,22 +58,43 @@ double perlin_calc(double x, double y, double s) {
|
|||
return value;
|
||||
}
|
||||
|
||||
Chunk fetch_chunk(int x, int y, int z, int ci) {
|
||||
Chunk *chunks2 = &chunks[CBUF_ALL * ci];
|
||||
Chunk fetch_chunk(int x, int y, int z, int ci, int h, int r_order) {
|
||||
|
||||
Chunk *chunks2 = chunks; // &chunks[CBUF_ALL * ci];
|
||||
|
||||
Chunk chunk;
|
||||
|
||||
if (x < 0 || y < 0 || z < 0) {
|
||||
chunk.exists = 0;
|
||||
return chunk;
|
||||
}
|
||||
|
||||
int cbuf2 = CHUNK_ALL; // CBUF_ALL * (CHUNK_DIAMETER_H + (MAX_R * 2));
|
||||
|
||||
int i, j;
|
||||
for (j = 0; j < CBUF_ALL; j++) {
|
||||
i = j;
|
||||
int r = (h == 0);
|
||||
|
||||
h = h * 16;
|
||||
|
||||
for (j = 0; j < (r ? 16 : 1) && h; j++) {
|
||||
i = (j + h + cbuf2) % cbuf2;
|
||||
chunk = chunks2[i];
|
||||
if (chunk.x == x && chunk.y == y && chunk.z == z && chunk.exists) {
|
||||
// lastI = i;
|
||||
if (chunk.x == x && chunk.y == y && chunk.z == z && chunk.exists != 0) {
|
||||
|
||||
chunk.exists = i / 16;
|
||||
if (chunk.exists == 0)
|
||||
chunk.exists = 1;
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunk.exists)
|
||||
// printf("fail\n");
|
||||
for (j = 0; j < cbuf2; j += 16) {
|
||||
i = (j + h + cbuf2) % cbuf2;
|
||||
chunk = chunks2[i];
|
||||
if (chunk.exists == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
char fname[1024];
|
||||
|
@ -84,7 +105,13 @@ Chunk fetch_chunk(int x, int y, int z, int ci) {
|
|||
int code = (fp) ? fread(&chunk, sizeof(Chunk), 1, fp) : 0;
|
||||
if (code != 0) {
|
||||
fclose(fp);
|
||||
return chunk;
|
||||
fp = 0;
|
||||
if (chunk.exists != 0) {
|
||||
chunk.exists = i / 16;
|
||||
if (chunk.exists == 0)
|
||||
chunk.exists = 1;
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
if (!fp) {
|
||||
fp = fopen(fname, "wb");
|
||||
|
@ -92,10 +119,9 @@ Chunk fetch_chunk(int x, int y, int z, int ci) {
|
|||
|
||||
lastI = i;
|
||||
|
||||
if (i > CBUF_ALL - 1)
|
||||
i = CBUF_ALL - 1;
|
||||
|
||||
chunk.exists = 1;
|
||||
chunk.exists = i / 16;
|
||||
if (chunk.exists == 0)
|
||||
chunk.exists = 1;
|
||||
chunk.x = x;
|
||||
chunk.y = y;
|
||||
chunk.z = z;
|
||||
|
@ -137,21 +163,24 @@ void purge_chunks(int ci) {
|
|||
chunks = calloc(CBUF_ALL, sizeof(Chunk));
|
||||
*/
|
||||
if (chunks == NULL) {
|
||||
chunks = calloc(CBUF_ALL * (CHUNK_DIAMETER_H + (MAX_R * 2)), sizeof(Chunk));
|
||||
chunks = calloc(CHUNK_ALL, sizeof(Chunk));
|
||||
}
|
||||
memset(&chunks[CBUF_ALL * ci], 0, sizeof(Chunk) * CBUF_ALL);
|
||||
// memset(chunks, 0, sizeof(Chunk) *CHUNK_ALL);
|
||||
}
|
||||
|
||||
int cube_exists(int x, int y, int z, Chunk dat, int ci) {
|
||||
int cube_exists(int x, int y, int z, Chunk dat, int ci, int r_order) {
|
||||
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.y != (y / CHUNK_LENGTH) || dat.z != (z / CHUNK_LENGTH)) {
|
||||
dat = fetch_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH),
|
||||
(z / CHUNK_LENGTH), ci);
|
||||
(z / CHUNK_LENGTH), ci, dat.exists, r_order);
|
||||
prevExists = dat.exists;
|
||||
}
|
||||
|
||||
int h = dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH +
|
||||
(x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH];
|
||||
|
||||
return h;
|
||||
return !!h;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue