]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/map.h
Remove leftover debugging construct
[dragonblocks_alpha.git] / src / map.h
1 #ifndef _MAP_H_
2 #define _MAP_H_
3
4 #include <stdbool.h>
5 #include <pthread.h>
6 #include <dragontype/bintree.h>
7 #include <dragontype/number.h>
8 #include <dragontype/list.h>
9 #include "node.h"
10
11 #define MAPBLOCK_SIZE 16
12 #define ITERATE_MAPBLOCK for (u8 x = 0; x < MAPBLOCK_SIZE; x++) for (u8 y = 0; y < MAPBLOCK_SIZE; y++) for (u8 z = 0; z < MAPBLOCK_SIZE; z++)
13
14 typedef struct MapNode
15 {
16         Node type;
17         void *data;
18 } MapNode;
19
20 typedef MapNode MapBlockData[MAPBLOCK_SIZE][MAPBLOCK_SIZE][MAPBLOCK_SIZE];
21
22 typedef struct
23 {
24         MapBlockData data;
25         v3s32 pos;
26         pthread_mutex_t mtx;
27         void *extra;
28 } MapBlock;
29
30 typedef struct
31 {
32         pthread_rwlock_t rwlck;
33         Bintree blocks;
34         v2s32 pos;
35 } MapSector;
36
37 typedef struct
38 {
39         void (*create_block)(MapBlock *block);
40         void (*delete_block)(MapBlock *block);
41         bool (*get_block)(MapBlock *block, bool create);
42         bool (*set_node) (MapBlock *block, v3u8 offset, MapNode *node, void *arg);
43         void (*after_set_node)(MapBlock *block, v3u8 offset, void *arg);
44 } MapCallbacks;
45
46 typedef struct
47 {
48         pthread_rwlock_t rwlck;
49         Bintree sectors;
50         pthread_rwlock_t cached_rwlck;
51         MapBlock *cached;
52         MapCallbacks callbacks;
53 } Map;
54
55 Map *map_create(MapCallbacks callbacks);
56 void map_delete(Map *map);
57
58 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
59 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
60
61 MapBlock *map_allocate_block(v3s32 pos);
62 void map_free_block(MapBlock *block);
63
64 void map_serialize_block(MapBlock *block, char **dataptr, size_t *sizeptr, size_t *rawsizeptr);
65 bool map_deserialize_block(MapBlock *block, const char *data, size_t size, size_t rawsize);
66
67 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);
68
69 MapNode map_get_node(Map *map, v3s32 pos);
70 void map_set_node(Map *map, v3s32 pos, MapNode node, bool create, void *arg);
71
72 MapNode map_node_create(Node type, void *data, size_t size);
73 void map_node_delete(MapNode node);
74
75 #endif