2 #include <dragonstd/array.h>
3 #include "client/facecache.h"
12 __attribute((constructor)) static void face_cache_init()
15 facecache.positions = array_create(sizeof(v3s32));
16 v3s32 pos = {0, 0, 0};
17 array_append(&facecache.positions, &pos);
18 pthread_mutex_init(&facecache.mtx, NULL);
21 __attribute((destructor)) void face_cache_deinit()
23 if (facecache.positions.ptr)
24 free(facecache.positions.ptr);
25 pthread_mutex_destroy(&facecache.mtx);
28 static void face_cache_calculate(s32 size)
30 #define ADDPOS(a, b, c, va, vb, vc) \
33 *(s32 *) ((char *) &pos + offsetof(v3s32, a)) = va; \
34 *(s32 *) ((char *) &pos + offsetof(v3s32, b)) = vb; \
35 *(s32 *) ((char *) &pos + offsetof(v3s32, c)) = vc; \
36 array_append(&facecache.positions, &pos); \
38 #define SQUARES(a, b, c) \
39 for (s32 va = -size + 1; va < size; va++) { \
40 for (s32 vb = -size + 1; vb < size; vb++) { \
41 ADDPOS(a, b, c, va, vb, size) \
42 ADDPOS(a, b, c, va, vb, -size) \
49 #define EDGES(a, b, c) \
50 for (s32 va = -size + 1; va < size; va++) { \
51 ADDPOS(a, b, c, va, size, size) \
52 ADDPOS(a, b, c, va, size, -size) \
53 ADDPOS(a, b, c, va, -size, size) \
54 ADDPOS(a, b, c, va, -size, -size) \
60 ADDPOS(x, y, z, size, size, size)
61 ADDPOS(x, y, z, size, size, -size)
62 ADDPOS(x, y, z, size, -size, size)
63 ADDPOS(x, y, z, size, -size, -size)
64 ADDPOS(x, y, z, -size, size, size)
65 ADDPOS(x, y, z, -size, size, -size)
66 ADDPOS(x, y, z, -size, -size, size)
67 ADDPOS(x, y, z, -size, -size, -size)
71 v3s32 facecache_face(size_t i, v3s32 *base)
73 pthread_mutex_lock(&facecache.mtx);
74 while (facecache.positions.siz <= i)
75 face_cache_calculate(++facecache.size);
76 v3s32 pos = ((v3s32 *) facecache.positions.ptr)[i];
77 pthread_mutex_unlock(&facecache.mtx);
86 size_t facecache_count(u32 size)
88 size_t len = 1 + size * 2;
89 return len * len * len;