]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/map.h
Speed up logistics of all air mapblocks
[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 <dragonstd/bintree.h>
7 #include <dragonstd/list.h>
8 #include "types.h"
9 #include "node.h"
10
11 #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++)
12
13 typedef struct MapNode
14 {
15         Node type;
16         void *data;
17 } MapNode;
18
19 typedef MapNode MapBlockData[MAPBLOCK_SIZE][MAPBLOCK_SIZE][MAPBLOCK_SIZE];
20
21 typedef struct
22 {
23         MapBlockData data;
24         v3s32 pos;
25         pthread_mutex_t mtx;
26         void *extra;
27 } MapBlock;
28
29 typedef struct
30 {
31         pthread_rwlock_t rwlck;
32         Bintree blocks;
33         v2s32 pos;
34 } MapSector;
35
36 typedef struct
37 {
38         void (*create_block)(MapBlock *block);
39         void (*delete_block)(MapBlock *block);
40         bool (*get_block)(MapBlock *block, bool create);
41         bool (*set_node) (MapBlock *block, v3u8 offset, MapNode *node, void *arg);
42         void (*after_set_node)(MapBlock *block, v3u8 offset, void *arg);
43 } MapCallbacks;
44
45 typedef struct
46 {
47         pthread_rwlock_t rwlck;
48         Bintree sectors;
49         pthread_rwlock_t cached_rwlck;
50         MapBlock *cached;
51         MapCallbacks callbacks;
52 } Map;
53
54 Map *map_create(MapCallbacks callbacks);
55 void map_delete(Map *map);
56
57 MapSector *map_get_sector(Map *map, v2s32 pos, bool create);
58 MapBlock *map_get_block(Map *map, v3s32 pos, bool create);
59
60 MapBlock *map_allocate_block(v3s32 pos);
61 void map_free_block(MapBlock *block);
62
63 Blob map_serialize_block(MapBlock *block);
64 bool map_deserialize_block(MapBlock *block, Blob buffer);
65
66 v3s32 map_node_to_block_pos(v3s32 pos, v3u8 *offset);
67
68 MapNode map_get_node(Map *map, v3s32 pos);
69 void map_set_node(Map *map, v3s32 pos, MapNode node, bool create, void *arg);
70
71 MapNode map_node_create(Node type, Blob buffer);
72 void map_node_delete(MapNode node);
73
74 #endif