X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=addon.h;h=f63566e696d5ab32039aa08073a986d85cc67b25;hb=137d40d96fe923600d8378b8e138e3c276f27ff4;hp=65e88e187ccc0d517defa694f5366270b906c748;hpb=92ba950580dd4877935e90682cd4f66fead8fed2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/addon.h b/addon.h index 65e88e1..f63566e 100644 --- a/addon.h +++ b/addon.h @@ -1,23 +1,32 @@ #ifndef ADDON_H #define ADDON_H -#include "workshop.h" -#include "workshop_types.h" -#define ADDON_MOUNTED_MAX 128 -#define ADDON_FOLDERNAME_MAX 64 +#include "skaterift.h" +#include "vg/vg_steam_ugc.h" +#include "addon_types.h" +#include "vg/vg_mem_pool.h" + +#include "world.h" +#include "player.h" typedef struct addon_reg addon_reg; +typedef struct addon_cache_entry addon_cache_entry; +typedef struct addon_alias addon_alias; + +struct addon_alias { + enum addon_type type; + PublishedFileId_t workshop_id; + char foldername[ ADDON_FOLDERNAME_MAX ]; +}; + struct { struct addon_reg{ - PublishedFileId_t workshop_id; - - enum workshop_file_type type; + addon_alias alias; + u32 foldername_hash; u8 metadata[512]; /* vg_msg buffer */ u32 metadata_len; - char foldername[ ADDON_FOLDERNAME_MAX ]; - u32 foldername_hash; - void *userdata; + u16 cache_id; enum addon_state{ k_addon_state_none, @@ -30,23 +39,64 @@ struct { u32 registry_count; /* deffered: updates in main thread */ - u32 registry_type_counts[k_workshop_file_type_max]; + u32 registry_type_counts[k_addon_type_max]; + + struct addon_cache{ + struct addon_cache_entry{ + u32 reg_index; + addon_reg *reg_ptr; /* TODO: only use reg_index? */ + + vg_pool_node poolnode; + + enum addon_cache_state{ + k_addon_cache_state_none, + k_addon_cache_state_loaded, + k_addon_cache_state_load_request + } + state; + } + *allocs; + vg_pool pool; + + void *items; /* the real data */ + size_t stride; + } + cache[k_addon_type_max]; + SDL_SpinLock sl_cache_using_resources; } static addon_system; static void addon_system_init( void ); -static u32 addon_count( enum workshop_file_type type ); -static addon_reg *get_addon_from_index(enum workshop_file_type type, u32 index); -static u32 get_index_from_addon( enum workshop_file_type type, addon_reg *a ); +static u32 addon_count( enum addon_type type ); +static addon_reg *get_addon_from_index( enum addon_type type, u32 index ); +static u32 get_index_from_addon( enum addon_type type, addon_reg *a ); +static int addon_get_content_folder( addon_reg *reg, vg_str *folder ); /* scanning routines */ -VG_STATIC void addon_mount_content_folder( enum workshop_file_type type, +static u32 addon_match( addon_alias *alias ); +static int addon_alias_eq( addon_alias *a, addon_alias *b ); +static void addon_alias_uid( addon_alias *alias, char buf[ADDON_UID_MAX] ); +static int addon_uid_to_alias( char uid[ADDON_UID_MAX], addon_alias *alias ); +static void invalidate_addon_alias( addon_alias *alias ); +static void addon_mount_content_folder( enum addon_type type, const char *base_folder, const char *content_ext ); -VG_STATIC void addon_mount_workshop_items(void); -VG_STATIC void async_addon_reg_update( void *data, u32 size ); -VG_STATIC addon_reg *addon_mount_local_addon( const char *folder, - enum workshop_file_type type, +static void addon_mount_workshop_items(void); +static void async_addon_reg_update( void *data, u32 size ); +static addon_reg *addon_mount_local_addon( const char *folder, + enum addon_type type, const char *content_ext ); +static u16 addon_cache_fetch( enum addon_type type, u32 reg_index ); +static u16 addon_cache_alloc( enum addon_type type, u32 reg_index ); +static void *addon_cache_item( enum addon_type type, u16 id ); +static void *addon_cache_item_if_loaded( enum addon_type type, u16 id ); +static void async_addon_setstate( void *data, u32 size ); +static void addon_cache_load_loop(void); +static u16 addon_cache_create_viewer( enum addon_type type, u16 reg_id); + +static void addon_cache_watch( enum addon_type type, u16 cache_id ); +static void addon_cache_unwatch( enum addon_type type, u16 cache_id ); +static u16 addon_cache_create_viewer_from_uid( enum addon_type type, + char uid[ADDON_UID_MAX] ); #endif /* ADDON_H */