animation board tweaks
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_skateshop.c
index 279512b7d124cb6dafdcbad865a603bc701e541e..4c55bb939477117aac5c1cb36ae900aa50830ed9 100644 (file)
@@ -27,94 +27,20 @@ static inline int const_str_eq( u32 hash, const char *str, const char *cmp )
    return 0;
 }
 
-#if 0
-/*
- * Get an existing cache instance, allocate a new one to be loaded, or NULL if
- * there is no space
- */
-VG_STATIC struct cache_board *skateshop_cache_fetch_board( u32 registry_index )
-{
-   addon_reg *reg = NULL;
-
-   if( registry_index < addon_count( k_workshop_file_type_board ) ){
-      reg = get_addon_from_index( k_workshop_file_type_board, registry_index );
-
-      if( reg->userdata ){
-         return reg->userdata;
-      }
-   }
-
-   SDL_AtomicLock( &addon_system.sl_cache );
-   struct cache_board *min_board = vg_pool_lru( &addon_system.board_cache );
-
-   if( min_board ){
-      if( min_board->state == k_cache_board_state_loaded ){
-         player_board_unload( &min_board->board );
-         min_board->reg_ptr->userdata = NULL;
-      }
-
-      if( reg ){
-         vg_info( "Allocating board (reg:%u) '%s'\n", 
-                  registry_index, reg->foldername );
-      }
-      else{
-         vg_info( "Pre-allocating board (reg:%u) 'null'\n", registry_index );
-      }
-
-      min_board->reg_ptr = reg;
-      min_board->reg_index = registry_index;
-      min_board->state = k_cache_board_state_load_request;
-   }
-   else{
-      vg_error( "No free boards to load registry!\n" );
-   }
-
-   SDL_AtomicUnlock( &addon_system.sl_cache );
-   return min_board;
-}
-#endif
-
 VG_STATIC void skateshop_update_viewpage(void){
    u32 page = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
-      
-   struct addon_cache *cache = &addon_system.cache[k_workshop_file_type_board];
-   vg_pool *pool = &cache->pool;
 
    for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ ){
       u32 j = SKATESHOP_VIEW_SLOT_MAX-1-i;
       struct shop_view_slot *slot = &global_skateshop.shop_view_slots[j];
-
-      if( slot->cache_id )
-         vg_pool_unwatch( pool, slot->cache_id );
+      addon_cache_unwatch( k_addon_type_board, slot->cache_id );
    }
    
    for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ ){
       struct shop_view_slot *slot = &global_skateshop.shop_view_slots[i];
       u32 request_id = page*SKATESHOP_VIEW_SLOT_MAX + i;
-
-      u16 id = addon_cache_fetch( k_workshop_file_type_board, request_id );
-      if( !id ){
-         id = addon_cache_alloc( k_workshop_file_type_board, request_id );
-
-         if( id ){
-            SDL_AtomicLock( &addon_system.sl_cache_using_resources );
-
-            addon_cache_entry *entry = vg_pool_item( &cache->pool, id );
-            struct player_board *board = 
-               addon_cache_item( k_workshop_file_type_board, id );
-
-            if( entry->state == k_addon_cache_state_loaded )
-               dynamic_model_unload( &board->mdl );
-
-            entry->state = k_addon_cache_state_load_request;
-            SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-         }
-      }
-
-      if( id )
-         vg_pool_watch( pool, id );
-
-      slot->cache_id = id;
+      slot->cache_id = addon_cache_create_viewer( k_addon_type_board,
+                                                  request_id );
    }
 }
 
@@ -123,119 +49,25 @@ VG_STATIC void skateshop_update_viewpage(void){
  * -----------------------------------------------------------------------------
  */
 
-/*
- * Thread(or subroutine of thread), for checking view slots that weve installed.
- * Load the model if a view slot wants it
- */
-VG_STATIC void workshop_visibile_load_loop(void)
-{
-   vg_info( "Running load loop\n" );
-   char path_buf[4096];
-
-   /* boards */
-   struct addon_cache *cache = &addon_system.cache[k_workshop_file_type_board];
-
-   for( u32 id=1; id<=cache->pool.count; id++ ){
-      addon_cache_entry *entry = vg_pool_item( &cache->pool, id );
-      struct player_board *board = 
-         addon_cache_item( k_workshop_file_type_board, id );
-
-      SDL_AtomicLock( &addon_system.sl_cache_using_resources );
-      if( entry->state == k_addon_cache_state_load_request ){
-         vg_info( "process cache load request (type:%u#%u, reg:%u)\n",
-                     k_workshop_file_type_board, id, entry->reg_index );
-
-         if( entry->reg_index >= addon_count(k_workshop_file_type_board) ){
-            /* should maybe have a different value for this case */
-            entry->state = k_addon_cache_state_none;
-            SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-            continue;
-         }
-
-         SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-
-         /* continue with the request */
-         addon_reg *reg = get_addon_from_index( k_workshop_file_type_board,
-                                                entry->reg_index );
-         entry->reg_ptr = reg;
-
-         vg_str folder;
-         vg_strnull( &folder, path_buf, 4096 );
-         if( !addon_get_content_folder( reg, &folder ) )
-            goto file_is_broken;
-
-
-         /* load content files
-          * --------------------------------- */
-         vg_str content_path = folder;
-
-         vg_msg root = {0};
-         root.buf = reg->metadata;
-         root.len = reg->metadata_len;
-         root.max = sizeof(reg->metadata);
-
-         const char *kv_content = vg_msg_seekkvstr( &root, "content", 0 );
-         if( kv_content ){
-            vg_strcat( &content_path, "/" );
-            vg_strcat( &content_path, kv_content );
-         }
-         else{
-            vg_error( "   No content paths in metadata\n" );
-            goto file_is_broken;
-         }
-
-         if( !vg_strgood( &content_path ) ) {
-            vg_error( "   Metadata path too long\n" );
-            goto file_is_broken;
-         }
-         
-         vg_info( "   Load content: %s\n", content_path.buffer );
-         
-         player_board_load( board, content_path.buffer );
-
-         /* WELL DONE */
-         vg_async_stall();
-
-         SDL_AtomicLock( &addon_system.sl_cache_using_resources );
-         entry->state = k_addon_cache_state_loaded;
-         SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-
-         vg_success( "   loaded (%s)\n", entry->reg_ptr->foldername );
-         continue;
-
-file_is_broken:;
-         SDL_AtomicLock( &addon_system.sl_cache_using_resources );
-         entry->state = k_addon_cache_state_none;
-         SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-      }
-      else
-         SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
-   }
-}
-
-
 VG_STATIC void world_scan_thread( void *_args ){
-   addon_mount_content_folder( k_workshop_file_type_world, "maps", ".mdl" );
+   addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" );
    addon_mount_workshop_items();
    vg_async_call( async_addon_reg_update, NULL, 0 );
-   skaterift_end_op();
 }
 
 /*
  * Asynchronous scan of local disk for worlds
  */
 VG_STATIC void skateshop_op_world_scan(void){
-   skaterift_begin_op( k_async_op_world_scan );
    vg_loader_start( world_scan_thread, NULL );
 }
 
 VG_STATIC void board_processview_thread( void *_args ){
-   workshop_visibile_load_loop();
-   skaterift_end_op();
+   addon_cache_load_loop();
 }
 
 VG_STATIC void board_scan_thread( void *_args ){
-   addon_mount_content_folder( k_workshop_file_type_board, "boards", ".mdl" );
+   addon_mount_content_folder( k_addon_type_board, "boards", ".mdl" );
    addon_mount_workshop_items();
    vg_async_call( async_addon_reg_update, NULL, 0 );
    vg_async_stall();
@@ -243,12 +75,10 @@ VG_STATIC void board_scan_thread( void *_args ){
 }
 
 VG_STATIC void skateshop_op_board_scan(void){
-   skaterift_begin_op( k_async_op_board_scan );
    vg_loader_start( board_scan_thread, NULL );
 }
 
 VG_STATIC void skateshop_op_processview(void){
-   skaterift_begin_op( k_async_op_board_scan );
    vg_loader_start( board_processview_thread, NULL );
 }
 
@@ -264,8 +94,8 @@ VG_STATIC void skateshop_init(void){
 }
 
 static u16 skateshop_selected_cache_id(void){
-   if( addon_count(k_workshop_file_type_board) ){
-      addon_reg *reg = get_addon_from_index(k_workshop_file_type_board,
+   if( addon_count(k_addon_type_board) ){
+      addon_reg *reg = get_addon_from_index(k_addon_type_board,
                                             global_skateshop.selected_board_id);
       return reg->cache_id;
    }
@@ -283,7 +113,7 @@ VG_STATIC void pointcloud_clear_async(void *_, u32 __)
    pointcloud_animate( k_pointcloud_anim_opening );
 }
 
-VG_STATIC void skateshop_preview_loader_thread( void *_data )
+VG_STATIC void skateshop_world_preview_loader_thread( void *_data )
 {
    addon_reg *reg = _data;
 
@@ -321,15 +151,12 @@ VG_STATIC void skateshop_preview_loader_thread( void *_data )
    }
 }
 
-VG_STATIC void skateshop_preview_loader_thread_and_end( void *_data ){
-   skateshop_preview_loader_thread( _data );
-   skaterift_end_op();
+VG_STATIC void skateshop_world_preview_loader_thread_and_end( void *_data ){
+   skateshop_world_preview_loader_thread( _data );
 }
 
-VG_STATIC void skateshop_load_world_preview( addon_reg *reg )
-{
-   skaterift_begin_op( k_async_op_world_load_preview );
-   vg_loader_start( skateshop_preview_loader_thread_and_end, reg );
+VG_STATIC void skateshop_load_world_preview( addon_reg *reg ){
+   vg_loader_start( skateshop_world_preview_loader_thread_and_end, reg );
 }
 
 /*
@@ -381,7 +208,7 @@ VG_STATIC void global_skateshop_preupdate(void)
 
    /* input */
    if( shop->type == k_skateshop_type_boardshop ){
-      if( skaterift.async_op != k_async_op_none ) return;
+      if( !vg_loader_availible() ) return;
 
       gui_helper_action( axis_display_string( k_sraxis_mbrowse_h ), "browse" );
       gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
@@ -405,7 +232,7 @@ VG_STATIC void global_skateshop_preupdate(void)
 
       if( button_down( k_srbind_mright ) ){
          if( global_skateshop.selected_board_id+1 < 
-               addon_count(k_workshop_file_type_board) )
+               addon_count(k_addon_type_board) )
          {
             global_skateshop.selected_board_id ++;
          }
@@ -421,45 +248,51 @@ VG_STATIC void global_skateshop_preupdate(void)
          vg_info( "chose board from skateshop (%u)\n", 
                      global_skateshop.selected_board_id );
 
-         struct addon_cache *cache = 
-            &addon_system.cache[k_workshop_file_type_board];
-         addon_cache_entry *entry = vg_pool_item( &cache->pool, cache_id );
-
-         if( localplayer.board_view_slot ){
-            vg_pool_unwatch( &cache->pool, localplayer.board_view_slot );
-         }
-
+         addon_cache_unwatch( k_addon_type_board, localplayer.board_view_slot );
+         addon_cache_watch( k_addon_type_board, cache_id );
          localplayer.board_view_slot = cache_id;
-         vg_pool_watch( &cache->pool, cache_id );
+
          global_skateshop_exit();
          skaterift_write_savedata();
          return;
       }
    }
    else if( shop->type == k_skateshop_type_charshop ){
+      if( !vg_loader_availible() ) return;
+
       gui_helper_action( axis_display_string( k_sraxis_mbrowse_h ), "browse" );
       gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
       gui_helper_action( button_display_string( k_srbind_maccept ), "pick" );
 
+      int changed = 0;
+
       if( button_down( k_srbind_mleft ) ){
-         if( k_playermdl_id > 0 ){
-            k_playermdl_id --;
+         if( global_skateshop.selected_player_id > 0 ){
+            global_skateshop.selected_player_id --;
          }
          else{
-            k_playermdl_id = 2; /* HACK */
+            global_skateshop.selected_player_id = 
+               addon_count(k_addon_type_player) -1;
          }
-         temp_update_playermodel(); /* HACK */
+
+         changed = 1;
       }
 
       if( button_down( k_srbind_mright ) ){
-         if( k_playermdl_id+1 < 3 ){
-            k_playermdl_id ++;
+         if( global_skateshop.selected_player_id+1 < 
+               addon_count(k_addon_type_player) ){
+            global_skateshop.selected_player_id ++;
          }
          else{
-            k_playermdl_id = 0;  /* HACK */
+            global_skateshop.selected_player_id = 0;
          }
-         temp_update_playermodel(); /* HACK */
-         /*lol*/
+
+         changed = 1;
+      }
+
+      if( changed ){
+         player__use_model( &localplayer, global_skateshop.selected_player_id );
+         skateshop_op_processview();
       }
 
       if( button_down( k_srbind_maccept ) ){
@@ -470,15 +303,12 @@ VG_STATIC void global_skateshop_preupdate(void)
       int browseable = 0,
           loadable = 0;
 
-      if( addon_count(k_workshop_file_type_world) &&
-            ((skaterift.async_op == k_async_op_none)||
-             (skaterift.async_op == k_async_op_world_load_preview))){
+      if( addon_count(k_addon_type_world) && vg_loader_availible() ){
          gui_helper_action( axis_display_string(k_sraxis_mbrowse_h), "browse" );
          browseable = 1;
       }
 
-      if( (skaterift.async_op == k_async_op_none) &&
-           global_skateshop.selected_world_id > 0 ){
+      if( vg_loader_availible() && global_skateshop.selected_world_id > 0 ){
          gui_helper_action( button_display_string(k_srbind_maccept), 
                             "open rift" );
          loadable = 1;
@@ -497,7 +327,7 @@ VG_STATIC void global_skateshop_preupdate(void)
 
          if( button_down( k_srbind_mright ) ){
             if( global_skateshop.selected_world_id+1 < 
-                     addon_count(k_workshop_file_type_world) )
+                     addon_count(k_addon_type_world) )
             {
                global_skateshop.selected_world_id ++;
                change = 1;
@@ -509,8 +339,8 @@ VG_STATIC void global_skateshop_preupdate(void)
          pointcloud_animate( k_pointcloud_anim_hiding );
       }
 
-      if( skaterift.async_op == k_async_op_none ){
-         addon_reg *reg = get_addon_from_index( k_workshop_file_type_world,
+      if( vg_loader_availible() ){
+         addon_reg *reg = get_addon_from_index( k_addon_type_world,
             global_skateshop.selected_world_id );
 
          /* automatically load in clouds */
@@ -568,7 +398,7 @@ VG_STATIC void skateshop_render_boardshop(void)
                                   mdl_entity_id_id(shop->boards.id_display));
 
    SDL_AtomicLock( &addon_system.sl_cache_using_resources );
-   struct addon_cache *cache = &addon_system.cache[k_workshop_file_type_board];
+   struct addon_cache *cache = &addon_system.cache[k_addon_type_board];
    
    /* Render loaded boards in the view slots */
    for( u32 i=0; i<slot_count; i++ ){
@@ -584,7 +414,7 @@ VG_STATIC void skateshop_render_boardshop(void)
          goto fade_out;
 
       struct player_board *board = 
-         addon_cache_item( k_workshop_file_type_board, slot->cache_id );
+         addon_cache_item( k_addon_type_board, slot->cache_id );
 
       mdl_transform xform;
       transform_identity( &xform );
@@ -602,9 +432,11 @@ VG_STATIC void skateshop_render_boardshop(void)
       q_nlerp( xform.q, mark_display->transform.q, t, xform.q );
       v3_lerp( xform.s, mark_display->transform.s, t, xform.s );
 
+      struct board_pose pose = {0};
       m4x3f mmdl;
       mdl_transform_m4x3( &xform, mmdl );
-      render_board( &main_camera, world, board, mmdl, k_board_shader_entity );
+      render_board( &main_camera, world, board, mmdl, 
+                    &pose, k_board_shader_entity );
 
 fade_out:;
       float rate = 5.0f*vg.time_delta;
@@ -641,12 +473,12 @@ fade_out:;
    mlocal[3][2] = -0.7f;
    m4x3_mul( mrack, mlocal, mmdl );
 
-   if( addon_count(k_workshop_file_type_board) ){
+   if( addon_count(k_addon_type_board) ){
       char buf[16];
       int i=0;
       i+=highscore_intl( buf+i, global_skateshop.selected_board_id+1, 3 );
       buf[i++] = '/';
-      i+=highscore_intl( buf+i, addon_count(k_workshop_file_type_board), 3 );
+      i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 );
       buf[i++] = '\0';
 
       font3d_simple_draw( &gui.font, 0, buf, &main_camera, mmdl );
@@ -735,7 +567,7 @@ VG_STATIC void skateshop_render_worldshop(void)
    if( global_skateshop.render.world_reg != global_skateshop.selected_world_id){
       global_skateshop.render.world_title = "";
 
-      addon_reg *reg = get_addon_from_index( k_workshop_file_type_world,
+      addon_reg *reg = get_addon_from_index( k_addon_type_world,
                                        global_skateshop.selected_world_id );
       vg_msg root = {0};
       root.buf = reg->metadata;
@@ -756,28 +588,27 @@ VG_STATIC void skateshop_render_worldshop(void)
    vg_strnull( &info, buftext, 128 );
    vg_strnull( &subtext, bufsubtext, 128 );
    
-   if( addon_count(k_workshop_file_type_world) ){
-      addon_reg *reg = get_addon_from_index( k_workshop_file_type_world,
+   if( addon_count(k_addon_type_world) ){
+      addon_reg *reg = get_addon_from_index( k_addon_type_world,
                            global_skateshop.selected_world_id );
 
       info.i+=highscore_intl( info.buffer+info.i, 
                               global_skateshop.selected_world_id+1, 3 );
       info.buffer[info.i++] = '/';
       info.i+=highscore_intl( info.buffer+info.i, 
-                              addon_count(k_workshop_file_type_world), 3 );
+                              addon_count(k_addon_type_world), 3 );
       info.buffer[info.i++] = ' ';
       info.buffer[info.i] = '\0';
 
       vg_strcat( &info, global_skateshop.render.world_title );
-      if( skaterift.async_op == k_async_op_world_loading ||
-          skaterift.async_op == k_async_op_world_preloading ){
+      if( !vg_loader_availible() ){
          vg_strcat( &subtext, "Loading..." );
       }
       else{
-         addon_reg *reg = get_addon_from_index( k_workshop_file_type_world,
+         addon_reg *reg = get_addon_from_index( k_addon_type_world,
                                           global_skateshop.selected_world_id );
 
-         if( reg->workshop_id )
+         if( reg->alias.workshop_id )
             vg_strcat( &subtext, "(Workshop) " );
 
          vg_strcat( &subtext, global_skateshop.render.world_loc );
@@ -857,7 +688,7 @@ VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call )
    vg_info( "skateshop_call\n" );
 
    if( menu.active ) return;
-   if( skaterift.async_op != k_async_op_none ) return;
+   if( !vg_loader_availible() ) return;
 
    if( call->function == k_ent_function_trigger ){
       if( localplayer.subsystem != k_player_subsystem_walk ){