load in preview images to dynamic rt textures
[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 "addon_types.h"
7 #include "vg/vg_mem_pool.h"
8
9 #include "world.h"
10 #include "player.h"
11
12 typedef struct addon_reg addon_reg;
13 typedef struct addon_cache_entry addon_cache_entry;
14 typedef struct addon_alias addon_alias;
15
16 struct addon_alias {
17 enum addon_type type;
18 PublishedFileId_t workshop_id;
19 char foldername[ ADDON_FOLDERNAME_MAX ];
20 };
21
22 #define ADDON_REG_HIDDEN 0x1
23
24 struct {
25 struct addon_reg{
26 addon_alias alias;
27 u32 foldername_hash;
28 u8 metadata[512]; /* vg_msg buffer */
29 u32 metadata_len;
30 u32 flags;
31
32 u16 cache_id;
33
34 enum addon_state{
35 k_addon_state_none,
36 k_addon_state_indexed,
37 k_addon_state_indexed_absent /* gone but not forgotten */
38 }
39 state;
40 }
41 *registry;
42 u32 registry_count;
43
44 /* deffered: updates in main thread */
45 u32 registry_type_counts[k_addon_type_max];
46
47 struct addon_cache{
48 struct addon_cache_entry{
49 u32 reg_index;
50 addon_reg *reg_ptr; /* TODO: only use reg_index? */
51
52 vg_pool_node poolnode;
53
54 enum addon_cache_state{
55 k_addon_cache_state_none,
56 k_addon_cache_state_loaded,
57 k_addon_cache_state_load_request
58 }
59 state;
60 }
61 *allocs;
62 vg_pool pool;
63
64 void *items; /* the real data */
65 size_t stride;
66 }
67 cache[k_addon_type_max];
68 SDL_SpinLock sl_cache_using_resources;
69 }
70 static addon_system;
71
72 static void addon_system_init( void );
73 static u32 addon_count( enum addon_type type, u32 ignoreflags );
74 static addon_reg *get_addon_from_index( enum addon_type type, u32 index,
75 u32 ignoreflags );
76 static u32 get_index_from_addon( enum addon_type type, addon_reg *a );
77 static int addon_get_content_folder( addon_reg *reg, vg_str *folder, int async);
78
79 /* scanning routines */
80 static u32 addon_match( addon_alias *alias );
81 static int addon_alias_eq( addon_alias *a, addon_alias *b );
82 static void addon_alias_uid( addon_alias *alias, char buf[ADDON_UID_MAX] );
83 static int addon_uid_to_alias( const char *uid, addon_alias *alias );
84 static void invalidate_addon_alias( addon_alias *alias );
85 static void addon_mount_content_folder( enum addon_type type,
86 const char *base_folder,
87 const char *content_ext );
88 static void addon_mount_workshop_items(void);
89 static void async_addon_reg_update( void *data, u32 size );
90 static addon_reg *addon_mount_local_addon( const char *folder,
91 enum addon_type type,
92 const char *content_ext );
93 static u16 addon_cache_fetch( enum addon_type type, u32 reg_index );
94 static u16 addon_cache_alloc( enum addon_type type, u32 reg_index );
95 static void *addon_cache_item( enum addon_type type, u16 id );
96 static void *addon_cache_item_if_loaded( enum addon_type type, u16 id );
97 static void async_addon_setstate( void *data, u32 size );
98 static void addon_cache_load_loop(void);
99 static u16 addon_cache_create_viewer( enum addon_type type, u16 reg_id);
100
101 static void addon_cache_watch( enum addon_type type, u16 cache_id );
102 static void addon_cache_unwatch( enum addon_type type, u16 cache_id );
103 static u16 addon_cache_create_viewer_from_uid( enum addon_type type,
104 char uid[ADDON_UID_MAX] );
105
106 #endif /* ADDON_H */