X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=ent_skateshop.c;h=c10352d5ff0a53f33cfd4fea3161b1f15c4e032c;hb=1c56bc84c9ad3da49c9d2447ec97aaf7f6038601;hp=962edf4b28f092a6562bb087f23f2569fcc6c6cb;hpb=d3021395f97b2ae244835c6656008386c8874343;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/ent_skateshop.c b/ent_skateshop.c index 962edf4..c10352d 100644 --- a/ent_skateshop.c +++ b/ent_skateshop.c @@ -44,6 +44,76 @@ static void skateshop_update_viewpage(void){ } } +struct async_preview_load_thread_data{ + void *data; + addon_reg *reg; +}; + +static void skateshop_async_preview_imageload( void *data, u32 len ){ + struct async_preview_load_thread_data *inf = data; + + if( inf->data ){ + glBindTexture( GL_TEXTURE_2D, global_skateshop.tex_preview ); + glTexSubImage2D( GL_TEXTURE_2D, 0,0,0, + WORKSHOP_PREVIEW_WIDTH, WORKSHOP_PREVIEW_HEIGHT, + GL_RGB, GL_UNSIGNED_BYTE, inf->data ); + glGenerateMipmap( GL_TEXTURE_2D ); + stbi_image_free( inf->data ); + + skaterift.rt_textures[k_skaterift_rt_workshop_preview] = + global_skateshop.tex_preview; + } + else { + skaterift.rt_textures[k_skaterift_rt_workshop_preview] = + global_skateshop.tex_preview_err; + } + + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + global_skateshop.reg_loaded_preview = inf->reg; + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); +} + +static void skateshop_update_preview_image_thread(void *_args){ + char path_buf[4096]; + vg_str folder; + vg_strnull( &folder, path_buf, sizeof(path_buf) ); + + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + addon_reg *reg_preview = global_skateshop.reg_preview; + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); + + if( !addon_get_content_folder( reg_preview, &folder, 1 ) ){ + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + global_skateshop.reg_loaded_preview = reg_preview; + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); + return; + } + + vg_strcat( &folder, "/preview.jpg" ); + vg_async_item *call = + vg_async_alloc( sizeof(struct async_preview_load_thread_data) ); + struct async_preview_load_thread_data *inf = call->payload; + + inf->reg = reg_preview; + + if( vg_strgood( &folder ) ){ + stbi_set_flip_vertically_on_load(1); + int x, y, nc; + inf->data = stbi_load( folder.buffer, &x, &y, &nc, 3 ); + + if( inf->data ){ + if( (x != WORKSHOP_PREVIEW_WIDTH) || (y != WORKSHOP_PREVIEW_HEIGHT) ){ + vg_error( "Resolution does not match framebuffer, so we can't" + " show it\n" ); + stbi_image_free( inf->data ); + inf->data = NULL; + } + } + + vg_async_dispatch( call, skateshop_async_preview_imageload ); + } +} + /* * op/subroutine: k_workshop_op_item_load * ----------------------------------------------------------------------------- @@ -84,6 +154,12 @@ static void skateshop_autostart_loading(void){ if( !vg_loader_availible() ) return; SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + if( global_skateshop.reg_preview != global_skateshop.reg_loaded_preview ){ + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); + vg_loader_start( skateshop_update_preview_image_thread, NULL ); + return; + } + for( u32 type=0; typepool, id ); if( entry->state == k_addon_cache_state_load_request ){ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - goto launch; + vg_loader_start( board_processview_thread, NULL ); + return; } } } SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - return; -launch: - vg_loader_start( board_processview_thread, NULL ); } /* @@ -106,10 +180,30 @@ launch: * ----------------------------------------------------------------------------- */ +static void skateshop_init_async(void *_data,u32 size){ + glGenTextures( 1, &global_skateshop.tex_preview ); + glBindTexture( GL_TEXTURE_2D, global_skateshop.tex_preview ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, + WORKSHOP_PREVIEW_WIDTH, WORKSHOP_PREVIEW_HEIGHT, + 0, GL_RGB, GL_UNSIGNED_BYTE, NULL ); + + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); +} + /* * VG event init */ static void skateshop_init(void){ + vg_async_call( skateshop_init_async, NULL, 0 ); + vg_tex2d_replace_with_error( &global_skateshop.tex_preview_err ); + vg_async_stall(); + + skaterift.rt_textures[ k_skaterift_rt_workshop_preview ] = + global_skateshop.tex_preview_err; } static u16 skateshop_selected_cache_id(void){ @@ -264,8 +358,9 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ global_skateshop.helper_browse->greyed = !browseable; global_skateshop.helper_pick->greyed = !loadable; - int change = 0; + addon_reg *selected_world = NULL; + int change = 0; if( browseable ){ if( button_down( k_srbind_mleft ) ){ if( global_skateshop.selected_world_id > 0 ){ @@ -280,14 +375,20 @@ static void ent_skateshop_preupdate( ent_skateshop *shop, int active ){ change = 1; } } + + selected_world = get_addon_from_index( k_addon_type_world, + global_skateshop.selected_world_id, ADDON_REG_HIDDEN ); + + if( change || (global_skateshop.reg_preview == NULL) ){ + SDL_AtomicLock( &addon_system.sl_cache_using_resources ); + global_skateshop.reg_preview = selected_world; + SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); + } } if( loadable ){ if( button_down( k_srbind_maccept ) ){ - skaterift_change_world_start( - get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id, - ADDON_REG_HIDDEN )); + skaterift_change_world_start( selected_world ); } } }