}
}
+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
* -----------------------------------------------------------------------------
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; type<k_addon_type_max; type++ ){
struct addon_cache *cache = &addon_system.cache[type];
addon_cache_entry *entry = vg_pool_item( &cache->pool, 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 );
}
/*
* -----------------------------------------------------------------------------
*/
+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){
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 ){
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 );
}
}
}