X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=ent_skateshop.c;h=7b41857f38e71228bfbb3ff4403d33a8d5beaf6e;hb=HEAD;hp=1065d4b58ab6a1095cd7d3d7f26e2cf1a5261780;hpb=f01a25e33a54c92e4d6bca0889b76f33af5e51eb;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/ent_skateshop.c b/ent_skateshop.c deleted file mode 100644 index 1065d4b..0000000 --- a/ent_skateshop.c +++ /dev/null @@ -1,849 +0,0 @@ -#include "vg/vg_steam_ugc.h" -#include "vg/vg_msg.h" -#include "vg/vg_tex.h" -#include "vg/vg_image.h" -#include "vg/vg_loader.h" -#include "ent_skateshop.h" -#include "world.h" -#include "player.h" -#include "gui.h" -#include "menu.h" -#include "steam.h" -#include "addon.h" -#include "save.h" -#include "network.h" - -struct global_skateshop global_skateshop = -{ - .render={.reg_id=0xffffffff,.world_reg=0xffffffff} -}; - -/* - * Checks string equality but does a hash check first - */ -static inline int const_str_eq( u32 hash, const char *str, const char *cmp ) -{ - if( hash == vg_strdjb2(cmp) ) - if( !strcmp( str, cmp ) ) - return 1; - return 0; -} - -static void skateshop_update_viewpage(void){ - u32 page = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX; - - for( u32 i=0; icache_id ); - } - - for( u32 i=0; icache_id = addon_cache_create_viewer( k_addon_type_board, - request_id ); - } -} - -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] = vg.tex_missing; - } - - 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 ); - } - else - { - vg_error( "Path too long to workshop preview image.\n" ); - - SDL_AtomicLock( &addon_system.sl_cache_using_resources ); - global_skateshop.reg_loaded_preview = reg_preview; - SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - } -} - -void skateshop_world_preview_preupdate(void) -{ - /* try to load preview image if we availible to do. */ - if( vg_loader_availible() ) - { - 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 ); - } - else SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - } -} - -/* - * op/subroutine: k_workshop_op_item_load - * ----------------------------------------------------------------------------- - */ - -/* - * Regular stuff - * ----------------------------------------------------------------------------- - */ - -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 ); - - skaterift.rt_textures[ k_skaterift_rt_workshop_preview ] = vg.tex_missing; - skaterift.rt_textures[ k_skaterift_rt_server_status ] = vg.tex_missing; - render_server_status_gui(); -} - -/* - * VG event init - */ -void skateshop_init(void) -{ - vg_async_call( skateshop_init_async, NULL, 0 ); -} - -static u16 skateshop_selected_cache_id(void){ - if( addon_count(k_addon_type_board, ADDON_REG_HIDDEN) ){ - addon_reg *reg = get_addon_from_index( - k_addon_type_board, global_skateshop.selected_board_id, - ADDON_REG_HIDDEN ); - return reg->cache_id; - } - else return 0; -} - -static void skateshop_server_helper_update(void){ - vg_str text; - vg_strnull( &text, global_skateshop.helper_toggle->text, - sizeof(global_skateshop.helper_toggle->text) ); - - if( skaterift.demo_mode ){ - vg_strcat( &text, "Not availible in demo" ); - } - else { - if( network_client.user_intent == k_server_intent_online ) - vg_strcat( &text, "Disconnect" ); - else - vg_strcat( &text, "Go Online" ); - } -} - -/* - * VG event preupdate - */ -void temp_update_playermodel(void); -void ent_skateshop_preupdate( ent_skateshop *shop, int active ) -{ - if( !active ) return; - - /* input filter */ - world_instance *world = world_current_instance(); - - /* camera positioning */ - ent_camera *ref = mdl_arritm( &world->ent_camera, - mdl_entity_id_id(shop->id_camera) ); - - v3f dir = {0.0f,-1.0f,0.0f}; - mdl_transform_vector( &ref->transform, dir, dir ); - v3_angles( dir, world_static.focus_cam.angles ); - - v3f lookat; - if( shop->type == k_skateshop_type_boardshop || - shop->type == k_skateshop_type_worldshop ){ - ent_marker *display = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_display) ); - v3_sub( display->transform.co, localplayer.rb.co, lookat ); - } - else if( shop->type == k_skateshop_type_charshop ){ - v3_sub( ref->transform.co, localplayer.rb.co, lookat ); - } - else if( shop->type == k_skateshop_type_server ){ - ent_prop *prop = mdl_arritm( &world->ent_prop, - mdl_entity_id_id(shop->server.id_lever) ); - v3_sub( prop->transform.co, localplayer.rb.co, lookat ); - } - else - vg_fatal_error( "Unknown store (%u)\n", shop->type ); - - q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, - atan2f(lookat[0],lookat[2]) ); - - v3_copy( ref->transform.co, world_static.focus_cam.pos ); - world_static.focus_cam.fov = ref->fov; - - /* input */ - if( shop->type == k_skateshop_type_boardshop ){ - if( !vg_loader_availible() ) return; - - u16 cache_id = skateshop_selected_cache_id(); - global_skateshop.helper_pick->greyed = !cache_id; - - /* - * Controls - * ---------------------- - */ - u32 opage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX; - - if( button_down( k_srbind_mleft ) ){ - if( global_skateshop.selected_board_id > 0 ){ - global_skateshop.selected_board_id --; - } - } - - u32 valid_count = addon_count( k_addon_type_board, 0 ); - if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_board_id+1 < valid_count ){ - global_skateshop.selected_board_id ++; - } - } - - u32 npage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX; - - if( opage != npage ){ - skateshop_update_viewpage(); - } - else if( cache_id && button_down( k_srbind_maccept )){ - vg_info( "chose board from skateshop (%u)\n", - global_skateshop.selected_board_id ); - - 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; - network_send_item( k_netmsg_playeritem_board ); - - world_entity_exit_modal(); - world_entity_clear_focus(); - gui_helper_clear(); - skaterift_autosave(1); - return; - } - } - else if( shop->type == k_skateshop_type_charshop ){ - if( !vg_loader_availible() ) return; - - int changed = 0; - u32 valid_count = addon_count( k_addon_type_player, ADDON_REG_HIDDEN ); - - if( button_down( k_srbind_mleft ) ){ - if( global_skateshop.selected_player_id > 0 ){ - global_skateshop.selected_player_id --; - } - else{ - global_skateshop.selected_player_id = valid_count-1; - } - - changed = 1; - } - - if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_player_id+1 < valid_count ){ - global_skateshop.selected_player_id ++; - } - else{ - global_skateshop.selected_player_id = 0; - } - - changed = 1; - } - - if( changed ){ - addon_reg *addon = get_addon_from_index( - k_addon_type_player, global_skateshop.selected_player_id, - ADDON_REG_HIDDEN ); - - u32 real_id = get_index_from_addon( - k_addon_type_player, addon ); - - player__use_model( real_id ); - } - - if( button_down( k_srbind_maccept ) ){ - network_send_item( k_netmsg_playeritem_player ); - world_entity_exit_modal(); - world_entity_clear_focus(); - gui_helper_clear(); - } - } - else if( shop->type == k_skateshop_type_worldshop ){ - int browseable = 0, - loadable = 0; - - u32 valid_count = addon_count( k_addon_type_world, ADDON_REG_HIDDEN ); - - if( valid_count && vg_loader_availible() ) - browseable = 1; - - if( valid_count && vg_loader_availible() ) - loadable = 1; - - global_skateshop.helper_browse->greyed = !browseable; - global_skateshop.helper_pick->greyed = !loadable; - - addon_reg *selected_world = NULL; - - int change = 0; - if( browseable ){ - if( button_down( k_srbind_mleft ) ){ - if( global_skateshop.selected_world_id > 0 ){ - global_skateshop.selected_world_id --; - change = 1; - } - } - - if( button_down( k_srbind_mright ) ){ - if( global_skateshop.selected_world_id+1 < valid_count ){ - global_skateshop.selected_world_id ++; - 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( selected_world ); - } - } - } - else if( shop->type == k_skateshop_type_server ){ - f64 delta = vg.time_real - network_client.last_intent_change; - - if( (delta > 5.0) && (!skaterift.demo_mode) ){ - global_skateshop.helper_pick->greyed = 0; - if( button_down( k_srbind_maccept ) ){ - network_client.user_intent = !network_client.user_intent; - network_client.last_intent_change = vg.time_real; - skateshop_server_helper_update(); - render_server_status_gui(); - } - } - else { - global_skateshop.helper_pick->greyed = 1; - } - } - else{ - vg_fatal_error( "Unknown store (%u)\n", shop->type ); - } - - if( button_down( k_srbind_mback ) ) - { - if( shop->type == k_skateshop_type_charshop ) - network_send_item( k_netmsg_playeritem_player ); - - world_entity_exit_modal(); - world_entity_clear_focus(); - gui_helper_clear(); - return; - } -} - -void skateshop_world_preupdate( world_instance *world ) -{ - for( u32 i=0; ient_skateshop); i++ ){ - ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, i ); - - if( shop->type == k_skateshop_type_server ){ - f32 a = network_client.user_intent; - - vg_slewf( &network_client.fintent, a, vg.time_frame_delta ); - a = (vg_smoothstepf( network_client.fintent ) - 0.5f) * (VG_PIf/2.0f); - - ent_prop *lever = mdl_arritm( &world->ent_prop, - mdl_entity_id_id(shop->server.id_lever) ); - - /* we need parent transforms now? */ - q_axis_angle( lever->transform.q, (v3f){0,0,1}, a ); - } - } -} - -static void skateshop_render_boardshop( ent_skateshop *shop ){ - world_instance *world = world_current_instance(); - u32 slot_count = vg_list_size(global_skateshop.shop_view_slots); - - ent_marker *mark_rack = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_rack)), - *mark_display = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_display)); - - SDL_AtomicLock( &addon_system.sl_cache_using_resources ); - struct addon_cache *cache = &addon_system.cache[k_addon_type_board]; - - /* Render loaded boards in the view slots */ - for( u32 i=0; icache_id ) - goto fade_out; - - addon_cache_entry *entry = vg_pool_item( &cache->pool, slot->cache_id ); - - if( entry->state != k_addon_cache_state_loaded ) - goto fade_out; - - struct player_board *board = - addon_cache_item( k_addon_type_board, slot->cache_id ); - - mdl_transform xform; - transform_identity( &xform ); - - xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f; - mdl_transform_mul( &mark_rack->transform, &xform, &xform ); - - - if( entry->reg_index == global_skateshop.selected_board_id ){ - selected = 1.0f; - } - - float t = slot->view_blend; - v3_lerp( xform.co, mark_display->transform.co, t, xform.co ); - q_nlerp( xform.q, mark_display->transform.q, t, xform.q ); - v3_lerp( xform.s, mark_display->transform.s, t, xform.s ); - - struct player_board_pose pose = {0}; - m4x3f mmdl; - mdl_transform_m4x3( &xform, mmdl ); - render_board( &skaterift.cam, world, board, mmdl, - &pose, k_board_shader_entity ); - -fade_out:; - float rate = 5.0f*vg.time_delta; - slot->view_blend = vg_lerpf( slot->view_blend, selected, rate ); - } - - ent_marker *mark_info = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_info)); - m4x3f mtext, mrack; - mdl_transform_m4x3( &mark_info->transform, mtext ); - mdl_transform_m4x3( &mark_rack->transform, mrack ); - - m4x3f mlocal, mmdl; - m4x3_identity( mlocal ); - - float scale = 0.2f, - thickness = 0.03f; - - font3d_bind( &gui.font, k_font_shader_default, 0, world, &skaterift.cam ); - shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); - - /* Selection counter - * ------------------------------------------------------------------ */ - m3x3_zero( mlocal ); - v3_zero( mlocal[3] ); - mlocal[0][0] = -scale*2.0f; - mlocal[1][2] = -scale*2.0f; - mlocal[2][1] = -thickness; - mlocal[3][2] = -0.7f; - m4x3_mul( mrack, mlocal, mmdl ); - - u32 valid_count = addon_count(k_addon_type_board,0); - if( valid_count ){ - char buf[16]; - vg_str str; - vg_strnull( &str, buf, sizeof(buf) ); - vg_strcati32( &str, global_skateshop.selected_board_id+1 ); - vg_strcatch( &str, '/' ); - vg_strcati32( &str, valid_count ); - font3d_simple_draw( 0, buf, &skaterift.cam, mmdl ); - } - else{ - font3d_simple_draw( 0, "Nothing installed", &skaterift.cam, mmdl ); - } - - u16 cache_id = skateshop_selected_cache_id(); - struct addon_cache_entry *entry = vg_pool_item( &cache->pool, cache_id ); - addon_reg *reg = NULL; - - if( entry ) reg = entry->reg_ptr; - - if( !reg ){ - SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); - global_skateshop.render.item_title = ""; - global_skateshop.render.item_desc = ""; - return; - } - - if( global_skateshop.render.reg_id != global_skateshop.selected_board_id ){ - global_skateshop.render.item_title = ""; - global_skateshop.render.item_desc = ""; - vg_msg msg; - vg_msg_init( &msg, reg->metadata, reg->metadata_len ); - - if( vg_msg_seekframe( &msg, "workshop" ) ){ - const char *title = vg_msg_getkvstr( &msg, "title" ); - if( title ) global_skateshop.render.item_title = title; - - const char *dsc = vg_msg_getkvstr( &msg, "author" ); - if( dsc ) global_skateshop.render.item_desc = dsc; - vg_msg_skip_frame( &msg ); - } - - global_skateshop.render.reg_id = global_skateshop.selected_board_id; - } - - /* Skin title - * ----------------------------------------------------------------- */ - m3x3_zero( mlocal ); - m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } ); - mlocal[3][0] = -font3d_string_width( 0, global_skateshop.render.item_title ); - mlocal[3][0] *= scale*0.5f; - mlocal[3][1] = 0.1f; - mlocal[3][2] = 0.0f; - m4x3_mul( mtext, mlocal, mmdl ); - font3d_simple_draw( 0, global_skateshop.render.item_title, - &skaterift.cam, mmdl ); - - /* Author name - * ----------------------------------------------------------------- */ - scale *= 0.4f; - m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } ); - mlocal[3][0] = -font3d_string_width( 0, global_skateshop.render.item_desc ); - mlocal[3][0] *= scale*0.5f; - mlocal[3][1] = 0.0f; - mlocal[3][2] = 0.0f; - m4x3_mul( mtext, mlocal, mmdl ); - font3d_simple_draw( 0, global_skateshop.render.item_desc, - &skaterift.cam, mmdl ); - - SDL_AtomicUnlock( &addon_system.sl_cache_using_resources ); -} - -static void skateshop_render_charshop( ent_skateshop *shop ){ -} - -static void skateshop_render_worldshop( ent_skateshop *shop ){ - world_instance *world = world_current_instance(); - - ent_marker *mark_display = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->worlds.id_display)), - *mark_info = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_info)); - - if( global_skateshop.render.world_reg != global_skateshop.selected_world_id){ - global_skateshop.render.world_title = "missing: workshop.title"; - - addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id, ADDON_REG_HIDDEN ); - - if( !reg ) - goto none; - - if( reg->alias.workshop_id ) - { - vg_msg msg; - vg_msg_init( &msg, reg->metadata, reg->metadata_len ); - - global_skateshop.render.world_loc = vg_msg_getkvstr(&msg,"location"); - global_skateshop.render.world_reg = global_skateshop.selected_world_id; - - if( vg_msg_seekframe( &msg, "workshop" ) ) - { - global_skateshop.render.world_title = vg_msg_getkvstr(&msg,"title"); - vg_msg_skip_frame( &msg ); - } - else { - vg_warn( "No workshop body\n" ); - } - } - else { - global_skateshop.render.world_title = reg->alias.foldername; - } - } - -none:; - - /* Text */ - char buftext[128], bufsubtext[128]; - vg_str info, subtext; - vg_strnull( &info, buftext, 128 ); - vg_strnull( &subtext, bufsubtext, 128 ); - - u32 valid_count = addon_count(k_addon_type_world,ADDON_REG_HIDDEN); - if( valid_count ) - { - vg_strcati32( &info, global_skateshop.selected_world_id+1 ); - vg_strcatch( &info, '/' ); - vg_strcati32( &info, valid_count ); - vg_strcatch( &info, ' ' ); - vg_strcat( &info, global_skateshop.render.world_title ); - - if( !vg_loader_availible() ) - { - vg_strcat( &subtext, "Loading..." ); - } - else - { - addon_reg *reg = get_addon_from_index( k_addon_type_world, - global_skateshop.selected_world_id, ADDON_REG_HIDDEN ); - - if( reg->alias.workshop_id ) - vg_strcat( &subtext, "(Workshop) " ); - - vg_strcat( &subtext, global_skateshop.render.world_loc ); - } - } - else - { - vg_strcat( &info, "No workshop worlds installed" ); - } - - m4x3f mtext,mlocal,mtextmdl; - mdl_transform_m4x3( &mark_info->transform, mtext ); - - font3d_bind( &gui.font, k_font_shader_default, 0, NULL, &skaterift.cam ); - shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} ); - - float scale = 0.2f, thickness = 0.015f, scale1 = 0.08f; - m3x3_zero( mlocal ); - m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } ); - mlocal[3][0] = -font3d_string_width( 0, buftext ); - mlocal[3][0] *= scale*0.5f; - mlocal[3][1] = 0.1f; - mlocal[3][2] = 0.0f; - m4x3_mul( mtext, mlocal, mtextmdl ); - font3d_simple_draw( 0, buftext, &skaterift.cam, mtextmdl ); - - m3x3_setdiagonalv3( mlocal, (v3f){ scale1, scale1, thickness } ); - mlocal[3][0] = -font3d_string_width( 0, bufsubtext ); - mlocal[3][0] *= scale1*0.5f; - mlocal[3][1] = -scale1*0.3f; - m4x3_mul( mtext, mlocal, mtextmdl ); - font3d_simple_draw( 0, bufsubtext, &skaterift.cam, mtextmdl ); -} - -/* - * World: render event - */ -void skateshop_render( ent_skateshop *shop ) -{ - if( shop->type == k_skateshop_type_boardshop ) - skateshop_render_boardshop( shop ); - else if( shop->type == k_skateshop_type_charshop ) - skateshop_render_charshop( shop ); - else if( shop->type == k_skateshop_type_worldshop ) - skateshop_render_worldshop( shop ); - else if( shop->type == k_skateshop_type_server ){ - } - else - vg_fatal_error( "Unknown store (%u)\n", shop->type ); -} - -void skateshop_render_nonfocused( world_instance *world, vg_camera *cam ) -{ - for( u32 j=0; jent_skateshop ); j ++ ) - { - ent_skateshop *shop = mdl_arritm(&world->ent_skateshop, j ); - - if( shop->type != k_skateshop_type_boardshop ) continue; - - f32 dist2 = v3_dist2( cam->pos, shop->transform.co ), - maxdist = 50.0f; - - if( dist2 > maxdist*maxdist ) continue; - ent_marker *mark_rack = mdl_arritm( &world->ent_marker, - mdl_entity_id_id(shop->boards.id_rack)); - - if( !mark_rack ) - continue; - - u32 slot_count = vg_list_size(global_skateshop.shop_view_slots); - for( u32 i=0; itransform, &xform, &xform ); - - struct player_board_pose pose = {0}; - m4x3f mmdl; - mdl_transform_m4x3( &xform, mmdl ); - render_board( cam, world, board, mmdl, &pose, k_board_shader_entity ); - } - } -} - -static void ent_skateshop_helpers_pickable( const char *acceptance ) -{ - vg_str text; - - if( gui_new_helper( input_button_list[k_srbind_mback], &text )) - vg_strcat( &text, "exit" ); - - if( (global_skateshop.helper_pick = gui_new_helper( - input_button_list[k_srbind_maccept], &text))){ - vg_strcat( &text, acceptance ); - } - - if( (global_skateshop.helper_browse = gui_new_helper( - input_axis_list[k_sraxis_mbrowse_h], &text ))){ - vg_strcat( &text, "browse" ); - } -} - -static void board_scan_thread( void *_args ) -{ - 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(); - - /* 04.03.24 - * REVIEW: This is removed as it *should* be done on the preupdate of the - * addon system. - * - * Verify that it works the same. - */ -#if 0 - board_processview_thread(NULL); -#endif -} - -static void world_scan_thread( void *_args ) -{ - addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" ); - addon_mount_workshop_items(); - vg_async_call( async_addon_reg_update, NULL, 0 ); -} - -/* - * Entity logic: entrance event - */ -entity_call_result ent_skateshop_call( world_instance *world, ent_call *call ) -{ - u32 index = mdl_entity_id_id( call->id ); - ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, index ); - vg_info( "skateshop_call\n" ); - - if( (skaterift.activity != k_skaterift_default) || - !vg_loader_availible() ) - return k_entity_call_result_invalid; - - if( call->function == k_ent_function_trigger ) - { - if( localplayer.subsystem != k_player_subsystem_walk ) - return k_entity_call_result_OK; - - vg_info( "Entering skateshop\n" ); - - world_entity_set_focus( call->id ); - world_entity_focus_modal(); - gui_helper_clear(); - - if( shop->type == k_skateshop_type_boardshop ) - { - skateshop_update_viewpage(); - vg_loader_start( board_scan_thread, NULL ); - ent_skateshop_helpers_pickable( "pick" ); - } - else if( shop->type == k_skateshop_type_charshop ) - { - ent_skateshop_helpers_pickable( "pick" ); - } - else if( shop->type == k_skateshop_type_worldshop ) - { - ent_skateshop_helpers_pickable( "open rift" ); - vg_loader_start( world_scan_thread, NULL ); - } - else if( shop->type == k_skateshop_type_server ) - { - vg_str text; - global_skateshop.helper_pick = gui_new_helper( - input_button_list[k_srbind_maccept], &text); - if( gui_new_helper( input_button_list[k_srbind_mback], &text )) - vg_strcat( &text, "exit" ); - skateshop_server_helper_update(); - } - return k_entity_call_result_OK; - } - else - return k_entity_call_result_unhandled; -}