place / break blocks
This commit is contained in:
parent
fb639f96c3
commit
227d642be6
7 changed files with 191 additions and 55 deletions
76
gen.c
76
gen.c
|
@ -1,3 +1,4 @@
|
|||
#include "gen.h"
|
||||
#include "cubes.h"
|
||||
#include "noise.h"
|
||||
#include <stdio.h>
|
||||
|
@ -8,6 +9,37 @@ struct chunk *chunks = NULL;
|
|||
int lastI = 0;
|
||||
int prevExists = 0;
|
||||
|
||||
void gen_save(struct chunk chunk) {
|
||||
char fname[1024];
|
||||
snprintf(fname, 1023, "./db/chunk_%i_%i_%i.dat", chunk.x, chunk.y, chunk.z);
|
||||
if (chunk.exists == 0)
|
||||
return;
|
||||
|
||||
FILE *fp = fopen(fname, "wb");
|
||||
if (!fp) {
|
||||
return;
|
||||
}
|
||||
|
||||
fwrite(&chunk, sizeof(struct chunk), 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
struct chunk gen_find(int x, int y, int z) {
|
||||
struct chunk chunk;
|
||||
for (int j = 0; j < CBUF_ALL; j++) {
|
||||
int i = j;
|
||||
chunk = chunks[i];
|
||||
if ((chunk).x == x && (chunk).y == y && (chunk).z == z &&
|
||||
(chunk).exists != 0) {
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
chunk = (gen_chunk(x, y, z, 0, 0));
|
||||
return chunk;
|
||||
}
|
||||
|
||||
struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
|
||||
|
||||
struct chunk *chunks2 = chunks; // &chunks[CBUF_ALL * ci];
|
||||
|
@ -47,6 +79,10 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
|
|||
}
|
||||
}
|
||||
|
||||
if (chunk.exists == 1 && chunk.x != x && chunk.y != y && chunk.z != z) {
|
||||
gen_save(chunk);
|
||||
}
|
||||
|
||||
char fname[1024];
|
||||
snprintf(fname, 1023, "./db/chunk_%i_%i_%i.dat", x, y, z);
|
||||
|
||||
|
@ -62,9 +98,8 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
|
|||
chunk.exists = 1;
|
||||
return chunk;
|
||||
}
|
||||
}
|
||||
if (!fp) {
|
||||
fp = fopen(fname, "wb");
|
||||
} else if (fp) {
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
lastI = i;
|
||||
|
@ -82,12 +117,7 @@ struct chunk gen_chunk(int x, int y, int z, int ci, int h) {
|
|||
|
||||
chunks2[i] = chunk;
|
||||
|
||||
if (!fp) {
|
||||
return chunk;
|
||||
}
|
||||
|
||||
fwrite(&chunk, sizeof(struct chunk), 1, fp);
|
||||
fclose(fp);
|
||||
gen_save(chunk);
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
@ -98,21 +128,33 @@ void gen_init() {
|
|||
}
|
||||
}
|
||||
|
||||
void gen_free() { free(chunks); }
|
||||
void gen_free() {
|
||||
for (int i = 0; i < CHUNK_ALL; i++) {
|
||||
gen_save(chunks[i]);
|
||||
}
|
||||
free(chunks);
|
||||
}
|
||||
|
||||
int gen_cube(int x, int y, int z, struct chunk dat, int ci) {
|
||||
int gen_cube(int x, int y, int z, struct chunk dat, int ci, int val) {
|
||||
if (x < 0 || y < 0 || z < 0)
|
||||
return 0;
|
||||
|
||||
if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) ||
|
||||
if (val != -1) {
|
||||
dat = gen_find((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), (z / CHUNK_LENGTH));
|
||||
} else if (dat.exists == 0 || dat.x != (x / CHUNK_LENGTH) ||
|
||||
dat.y != (y / CHUNK_LENGTH) || dat.z != (z / CHUNK_LENGTH)) {
|
||||
dat = gen_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH),
|
||||
(z / CHUNK_LENGTH), ci, dat.exists);
|
||||
dat = gen_chunk((x / CHUNK_LENGTH), (y / CHUNK_LENGTH), (z / CHUNK_LENGTH),
|
||||
ci, dat.exists);
|
||||
prevExists = dat.exists;
|
||||
}
|
||||
|
||||
int h = dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH +
|
||||
(x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH];
|
||||
int *h = &dat.blocks[(y % CHUNK_LENGTH) + (z % CHUNK_LENGTH) * CHUNK_LENGTH +
|
||||
(x % CHUNK_LENGTH) * CHUNK_LENGTH * CHUNK_LENGTH];
|
||||
|
||||
return h;
|
||||
if (val != -1) {
|
||||
*h = val;
|
||||
cubes_refresh(x / CHUNK_LENGTH, y / CHUNK_LENGTH, z / CHUNK_LENGTH, dat);
|
||||
}
|
||||
|
||||
return *h;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue