4 #include <dragonstd/list.h>
5 #include <dragonstd/tree.h>
11 #define CHUNK_ITERATE \
12 for (u8 x = 0; x < CHUNK_SIZE; x++) \
13 for (u8 y = 0; y < CHUNK_SIZE; y++) \
14 for (u8 z = 0; z < CHUNK_SIZE; z++)
16 typedef struct TerrainNode {
21 typedef TerrainNode TerrainChunkData[CHUNK_SIZE][CHUNK_SIZE][CHUNK_SIZE];
26 TerrainChunkData data;
35 pthread_rwlock_t lock;
40 pthread_rwlock_t lock;
42 pthread_rwlock_t cache_lock;
44 void (*create_chunk)(TerrainChunk *chunk);
45 void (*delete_chunk)(TerrainChunk *chunk);
46 bool (*get_chunk)(TerrainChunk *chunk, bool create);
47 bool (*set_node) (TerrainChunk *chunk, v3u8 offset, TerrainNode *node, void *arg);
48 void (*after_set_node)(TerrainChunk *chunk, v3u8 offset, void *arg);
52 Terrain *terrain_create();
53 void terrain_delete(Terrain *terrain);
55 TerrainSector *terrain_get_sector(Terrain *terrain, v2s32 pos, bool create);
56 TerrainChunk *terrain_get_chunk(Terrain *terrain, v3s32 pos, bool create);
58 TerrainChunk *terrain_allocate_chunk(v3s32 pos);
59 void terrain_free_chunk(TerrainChunk *chunk);
61 Blob terrain_serialize_chunk(TerrainChunk *chunk);
62 bool terrain_deserialize_chunk(TerrainChunk *chunk, Blob buffer);
64 v3s32 terrain_node_to_chunk_pos(v3s32 pos, v3u8 *offset);
66 TerrainNode terrain_get_node(Terrain *terrain, v3s32 pos);
67 void terrain_set_node(Terrain *terrain, v3s32 pos, TerrainNode node, bool create, void *arg);
69 TerrainNode terrain_node_create(NodeType type, Blob buffer);
70 void terrain_node_delete(TerrainNode node);