refactor(1)
[carveJwlIkooP6JGAAIwe30JlM.git] / addon.h
1 #ifndef ADDON_H
2 #define ADDON_H
3
4 #include "skaterift.h"
5 #include "vg/vg_steam_ugc.h"
6 #include "workshop_types.h"
7 #include "vg/vg_mem_pool.h"
8
9 #include "world.h"
10 #include "player.h"
11
12 #define ADDON_FOLDERNAME_MAX 64
13
14 /* total count that we have knowledge of */
15 #define ADDON_MOUNTED_MAX 128
16
17 /* in memory and loaded stuffs */
18 #define CACHE_BOARD_MAX 10
19 #define CACHE_PLAYER_MAX 10
20
21 typedef struct addon_reg addon_reg;
22 typedef struct addon_cache_entry addon_cache_entry;
23 struct {
24 struct addon_reg{
25 PublishedFileId_t workshop_id;
26
27 enum workshop_file_type type;
28 u8 metadata[512]; /* vg_msg buffer */
29 u32 metadata_len;
30
31 char foldername[ ADDON_FOLDERNAME_MAX ];
32 u32 foldername_hash;
33 u16 cache_id;
34
35 enum addon_state{
36 k_addon_state_none,
37 k_addon_state_indexed,
38 k_addon_state_indexed_absent /* gone but not forgotten */
39 }
40 state;
41 }
42 *registry;
43 u32 registry_count;
44
45 /* deffered: updates in main thread */
46 u32 registry_type_counts[k_workshop_file_type_max];
47
48 struct addon_cache{
49 struct addon_cache_entry{
50 u32 reg_index;
51 addon_reg *reg_ptr; /* TODO: only use reg_index? */
52
53 vg_pool_node poolnode;
54
55 enum addon_cache_state{
56 k_addon_cache_state_none,
57 k_addon_cache_state_loaded,
58 k_addon_cache_state_load_request
59 }
60 state;
61 }
62 *allocs;
63 vg_pool pool;
64
65 void *items; /* the real data */
66 size_t stride;
67 }
68 cache[k_workshop_file_type_max];
69 SDL_SpinLock sl_cache_using_resources;
70
71
72
73 #if 0
74
75
76
77 /* caches */
78 struct cache_board{
79 struct player_board board;
80
81 u32 reg_index;
82 addon_reg *reg_ptr;
83 vg_pool_node cachenode;
84 }
85 *boards;
86 vg_pool board_cache;
87
88 struct cache_playermodel{
89 struct player_model model;
90
91 u32 reg_index;
92 addon_reg *reg_ptr;
93 vg_pool_node cachenode;
94 }
95 *playermodels;
96 vg_pool playermodel_cache;
97 #endif
98
99 }
100 static addon_system;
101
102 static void addon_system_init( void );
103 static u32 addon_count( enum workshop_file_type type );
104 static addon_reg *get_addon_from_index(enum workshop_file_type type, u32 index);
105 static u32 get_index_from_addon( enum workshop_file_type type, addon_reg *a );
106 static int addon_get_content_folder( addon_reg *reg, vg_str *folder );
107
108 /* scanning routines */
109 VG_STATIC void addon_mount_content_folder( enum workshop_file_type type,
110 const char *base_folder,
111 const char *content_ext );
112 VG_STATIC void addon_mount_workshop_items(void);
113 VG_STATIC void async_addon_reg_update( void *data, u32 size );
114 VG_STATIC addon_reg *addon_mount_local_addon( const char *folder,
115 enum workshop_file_type type,
116 const char *content_ext );
117 static u16 addon_cache_fetch( enum workshop_file_type type, u32 reg_index );
118 static u16 addon_cache_alloc( enum workshop_file_type type, u32 reg_index );
119 static void *addon_cache_item( enum workshop_file_type type, u16 id );
120 static void *addon_cache_item_if_loaded( enum workshop_file_type type, u16 id );
121
122 #endif /* ADDON_H */