seperate rand instances for each thread
[carveJwlIkooP6JGAAIwe30JlM.git] / addon.h
diff --git a/addon.h b/addon.h
index 85b5014bf7c9d7e036a837cd6f6067d464d536e5..bb96f2e5023777cb8a21642745a05891ce427138 100644 (file)
--- a/addon.h
+++ b/addon.h
@@ -1,35 +1,38 @@
 #ifndef ADDON_H
 #define ADDON_H
 
-#include "common.h"
+#include "skaterift.h"
 #include "vg/vg_steam_ugc.h"
-#include "workshop_types.h"
-#include "addon_cache.h"
+#include "addon_types.h"
+#include "vg/vg_mem_pool.h"
 
 #include "world.h"
 #include "player.h"
 
-#define ADDON_FOLDERNAME_MAX 64
+typedef struct addon_reg addon_reg;
+typedef struct addon_cache_entry addon_cache_entry;
+typedef struct addon_alias addon_alias;
 
-/* total count that we have knowledge of */
-#define ADDON_MOUNTED_MAX 128
+struct addon_alias {
+   enum addon_type type;
+   PublishedFileId_t workshop_id;
+   char foldername[ ADDON_FOLDERNAME_MAX ];
+};
 
-/* in memory and loaded stuffs */
-#define CACHE_BOARD_MAX  10
-#define CACHE_PLAYER_MAX 10
+#define ADDON_REG_HIDDEN   0x1
+#define ADDON_REG_MTZERO   0x2
+#define ADDON_REG_CITY     0x4
+#define ADDON_REG_PREMIUM  0x8
 
-typedef struct addon_reg addon_reg;
 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;
+      u32 flags;
 
-      char foldername[ ADDON_FOLDERNAME_MAX ];
-      u32 foldername_hash;
-      void *userdata;
+      u16 cache_id;
 
       enum addon_state{
          k_addon_state_none,
@@ -42,43 +45,65 @@ struct {
    u32 registry_count;
 
    /* deffered: updates in main thread */
-   u32 registry_type_counts[k_workshop_file_type_max]; 
-
-   /* caches */
-   struct cache_board{
-      enum cache_board_state{
-         k_cache_board_state_none,
-         k_cache_board_state_loaded,
-         k_cache_board_state_load_request
+   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;
       }
-      state;
-      struct player_board board;
-      u32 reg_index;
-      addon_reg *reg_ptr;
+      *allocs;
+      vg_pool pool;
 
-      addon_cache_node cachenode;
+      void *items;  /* the real data */
+      size_t stride;
    }
-   *boards;
-   addon_cache board_cache;
-
-   SDL_SpinLock sl_cache;
+   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 int addon_get_content_folder( addon_reg *reg, vg_str *folder );
+static u32 addon_count( enum addon_type type, u32 ignoreflags );
+static addon_reg *get_addon_from_index( enum addon_type type, u32 index, 
+                                        u32 ignoreflags );
+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, int async);
 
 /* 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( const char *uid, 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 */