1 #include <dragonstd/array.h>
3 #include "client/facecache.h"
5 static Array positions;
7 static pthread_mutex_t mtx;
9 __attribute__((constructor)) static void facecache_init()
11 array_ini(&positions, sizeof(v3s32), 1000);
12 array_apd(&positions, &(v3s32) {0, 0, 0});
13 pthread_mutex_init(&mtx, NULL);
17 __attribute__((destructor)) static void facecache_deinit()
19 array_clr(&positions);
20 pthread_mutex_destroy(&mtx);
23 static inline void facecache_calculate(s32 radius)
25 #define ADDPOS(a, b, c, va, vb, vc) \
28 *(s32 *) ((char *) &pos + offsetof(v3s32, a)) = va; \
29 *(s32 *) ((char *) &pos + offsetof(v3s32, b)) = vb; \
30 *(s32 *) ((char *) &pos + offsetof(v3s32, c)) = vc; \
31 array_apd(&positions, &pos); \
33 #define SQUARES(a, b, c) \
34 for (s32 va = -radius + 1; va < radius; va++) { \
35 for (s32 vb = -radius + 1; vb < radius; vb++) { \
36 ADDPOS(a, b, c, va, vb, radius) \
37 ADDPOS(a, b, c, va, vb, -radius) \
44 #define EDGES(a, b, c) \
45 for (s32 va = -radius + 1; va < radius; va++) { \
46 ADDPOS(a, b, c, va, radius, radius) \
47 ADDPOS(a, b, c, va, radius, -radius) \
48 ADDPOS(a, b, c, va, -radius, radius) \
49 ADDPOS(a, b, c, va, -radius, -radius) \
55 ADDPOS(x, y, z, radius, radius, radius)
56 ADDPOS(x, y, z, radius, radius, -radius)
57 ADDPOS(x, y, z, radius, -radius, radius)
58 ADDPOS(x, y, z, radius, -radius, -radius)
59 ADDPOS(x, y, z, -radius, radius, radius)
60 ADDPOS(x, y, z, -radius, radius, -radius)
61 ADDPOS(x, y, z, -radius, -radius, radius)
62 ADDPOS(x, y, z, -radius, -radius, -radius)
66 v3s32 facecache_get(size_t i)
68 pthread_mutex_lock(&mtx);
70 if (positions.cap <= i) {
72 array_rlc(&positions);
75 while (positions.siz <= i)
76 facecache_calculate(++radius);
78 v3s32 pos = ((v3s32 *) positions.ptr)[i];
79 pthread_mutex_unlock(&mtx);
83 size_t facecache_count(u32 radius)
85 size_t len = 1 + radius * 2;
86 return len * len * len;