#include "save.h"
#include "network.h"
-struct global_skateshop global_skateshop =
+struct global_skateshop _skateshop =
{
- .render={.reg_id=0xffffffff,.world_reg=0xffffffff}
+ .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 )
+static void skateshop_update_viewpage(void)
{
- 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;
+ u32 page = _skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
- for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ ){
+ 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];
+ struct shop_view_slot *slot = &_skateshop.shop_view_slots[j];
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];
+ for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ )
+ {
+ struct shop_view_slot *slot = &_skateshop.shop_view_slots[i];
u32 request_id = page*SKATESHOP_VIEW_SLOT_MAX + i;
- slot->cache_id = addon_cache_create_viewer( k_addon_type_board,
- request_id );
+ slot->cache_id = addon_cache_create_viewer( k_addon_type_board, request_id );
}
}
-struct async_preview_load_thread_data{
+struct async_preview_load_thread_data
+{
void *data;
addon_reg *reg;
};
-static void skateshop_async_preview_imageload( void *data, u32 len ){
+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 );
+ glBindTexture( GL_TEXTURE_2D, _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;
+ skaterift.rt_textures[k_skaterift_rt_workshop_preview] = _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;
+ _skateshop.reg_loaded_preview = inf->reg;
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
}
vg_strnull( &folder, path_buf, sizeof(path_buf) );
SDL_AtomicLock( &addon_system.sl_cache_using_resources );
- addon_reg *reg_preview = global_skateshop.reg_preview;
+ addon_reg *reg_preview = _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;
+ _skateshop.reg_loaded_preview = reg_preview;
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
return;
}
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;
+ _skateshop.reg_loaded_preview = reg_preview;
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
}
}
if( vg_loader_availible() )
{
SDL_AtomicLock( &addon_system.sl_cache_using_resources );
- if( global_skateshop.reg_preview != global_skateshop.reg_loaded_preview )
+ if( _skateshop.reg_preview != _skateshop.reg_loaded_preview )
{
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
vg_loader_start( skateshop_update_preview_image_thread, NULL );
}
}
-/*
- * 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,
+static void skateshop_init_async(void *_data,u32 size)
+{
+ glGenTextures( 1, &_skateshop.tex_preview );
+ glBindTexture( GL_TEXTURE_2D, _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_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 );
{
if( addon_count(k_addon_type_board, 0,ADDON_REG_HIDDEN) )
{
- addon_reg *reg = get_addon_from_index(
- k_addon_type_board, global_skateshop.selected_board_id,
- 0, ADDON_REG_HIDDEN );
+ addon_reg *reg = get_addon_from_index( k_addon_type_board, _skateshop.selected_board_id, 0, ADDON_REG_HIDDEN );
return reg->cache_id;
}
else return 0;
}
-static void skateshop_server_helper_update(void){
+static void skateshop_server_helper_update(void)
+{
vg_str text;
- vg_strnull( &text, global_skateshop.helper_toggle->text,
- sizeof(global_skateshop.helper_toggle->text) );
+ vg_strnull( &text, _skateshop.helper_toggle->text, sizeof(_skateshop.helper_toggle->text) );
- if( skaterift.demo_mode ){
+ if( skaterift.demo_mode )
+ {
vg_strcat( &text, "Not availible in demo" );
}
- else {
+ else
+ {
if( network_client.user_intent == k_server_intent_online )
vg_strcat( &text, "Disconnect" );
else
}
}
-/*
- * VG event preupdate
- */
-void temp_update_playermodel(void);
-void ent_skateshop_preupdate( ent_focus_context *ctx )
+static void board_scan_thread( void *_args )
{
- if( !ctx->active )
- return;
+ 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();
+}
- world_instance *world = ctx->world;
- ent_skateshop *shop = af_arritm( &world->ent_skateshop, ctx->index );
+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 );
+}
- /* camera positioning */
- ent_camera *ref = af_arritm( &world->ent_camera,
- mdl_entity_id_id(shop->id_camera) );
-#if 0
- v3_copy( ref->r, world_static.focus_cam.angles );
-#endif
+static void ent_skateshop_helpers_pickable( const char *acceptance )
+{
+ vg_str text;
- v3f lookat;
- if( shop->type == k_skateshop_type_boardshop ||
- shop->type == k_skateshop_type_worldshop ){
- ent_marker *display = af_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->co, localplayer.rb.co, lookat );
+ if( gui_new_helper( input_button_list[k_srbind_mback], &text ))
+ vg_strcat( &text, "Exit" );
+
+ if( (_skateshop.helper_pick = gui_new_helper( input_button_list[k_srbind_maccept], &text))){
+ vg_strcat( &text, acceptance );
}
- else if( shop->type == k_skateshop_type_server ){
- ent_prop *prop = af_arritm( &world->ent_prop,
- mdl_entity_id_id(shop->server.id_lever) );
- v3_sub( prop->transform.co, localplayer.rb.co, lookat );
+
+ if( (_skateshop.helper_browse = gui_new_helper( input_axis_list[k_sraxis_mbrowse_h], &text ))){
+ vg_strcat( &text, "Browse" );
}
- 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]) );
+static void skateshop_playermod( bool immobile )
+{
+ localplayer.immobile = immobile;
+ menu.disable_open = immobile;
+ srinput.state = k_input_state_resume;
+}
-#if 0
- v3_copy( ref->co, world_static.focus_cam.pos );
- world_static.focus_cam.fov = ref->fov;
-#endif
+void ent_skateshop_update(void)
+{
+ if( _world.event != k_world_event_shop )
+ return;
- /* input */
- if( shop->type == k_skateshop_type_boardshop ){
- if( !vg_loader_availible() ) return;
+ if( _skateshop.open )
+ {
+ ent_skateshop *shop = _skateshop.current_shop;
+ world_instance *world = &_world.main;
- u16 cache_id = skateshop_selected_cache_id();
- global_skateshop.helper_pick->greyed = !cache_id;
+ if( button_down( k_srbind_mback ) )
+ {
+ _skateshop.open = 0;
- /*
- * Controls
- * ----------------------
- */
- u32 opage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
+ if( shop->type == k_skateshop_type_charshop )
+ network_send_item( k_netmsg_playeritem_player );
- if( button_down( k_srbind_mleft ) ){
- if( global_skateshop.selected_board_id > 0 ){
- global_skateshop.selected_board_id --;
- }
+ gui_helper_reset( k_gui_helper_mode_clear );
+
+ skateshop_playermod( 0 );
+ srinput.state = k_input_state_resume;
+ return;
}
- u32 valid_count = addon_count( k_addon_type_board, 0,0 );
- if( button_down( k_srbind_mright ) )
+ /* override camera positioning
+ * ------------------------------------------------------------------------ */
+ ent_camera *ref = af_arritm( &world->ent_camera, mdl_entity_id_id(shop->id_camera) );
+ v3f lookat = {1,0,0};
+ if( (shop->type == k_skateshop_type_boardshop) || (shop->type == k_skateshop_type_worldshop) )
{
- if( global_skateshop.selected_board_id+1 < valid_count )
- {
- global_skateshop.selected_board_id ++;
- }
+ ent_marker *display = af_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->co, localplayer.rb.co, lookat );
+ }
+ else if( shop->type == k_skateshop_type_server )
+ {
+ ent_prop *prop = af_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 );
- u32 npage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
+ q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f}, atan2f(lookat[0],lookat[2]) );
- 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 );
+ vg_camera temp;
+ ent_camera_unpack( ref, &temp );
+ world_set_entity_driven_camera( &temp );
- 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 );
+ /* input */
+ if( shop->type == k_skateshop_type_boardshop )
+ {
+ if( !vg_loader_availible() )
+ return;
- //world_entity_exit_modal();
- //world_entity_clear_focus();
- gui_helper_reset( k_gui_helper_mode_clear );
- return;
- }
- }
- else if( shop->type == k_skateshop_type_charshop )
- {
- if( !vg_loader_availible() ) return;
+ u16 cache_id = skateshop_selected_cache_id();
+ _skateshop.helper_pick->greyed = !cache_id;
- int changed = 0;
- u32 valid_count = addon_count( k_addon_type_player, 0, ADDON_REG_HIDDEN );
+ /*
+ * Controls
+ * ----------------------
+ */
+ u32 opage = _skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
- if( button_down( k_srbind_mleft ) ){
- if( global_skateshop.selected_player_id > 0 ){
- global_skateshop.selected_player_id --;
+ if( button_down( k_srbind_mleft ) )
+ {
+ if( _skateshop.selected_board_id > 0 )
+ _skateshop.selected_board_id --;
}
- else{
- global_skateshop.selected_player_id = valid_count-1;
+
+ u32 valid_count = addon_count( k_addon_type_board, 0,0 );
+ if( button_down( k_srbind_mright ) )
+ {
+ if( _skateshop.selected_board_id+1 < valid_count )
+ _skateshop.selected_board_id ++;
}
- changed = 1;
- }
+ u32 npage = _skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
- if( button_down( k_srbind_mright ) ){
- if( global_skateshop.selected_player_id+1 < valid_count ){
- global_skateshop.selected_player_id ++;
+ if( opage != npage )
+ skateshop_update_viewpage();
+ else if( cache_id && button_down( k_srbind_maccept ))
+ {
+ vg_info( "chose board from skateshop (%u)\n", _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 );
+ gui_helper_reset( k_gui_helper_mode_clear );
+ skateshop_playermod( 0 );
+ _skateshop.open = 0;
+ return;
}
- else{
- global_skateshop.selected_player_id = 0;
+ }
+ 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, 0, ADDON_REG_HIDDEN );
+
+ if( button_down( k_srbind_mleft ) )
+ {
+ if( _skateshop.selected_player_id > 0 )
+ _skateshop.selected_player_id --;
+ else
+ _skateshop.selected_player_id = valid_count-1;
+
+ changed = 1;
}
- changed = 1;
- }
+ if( button_down( k_srbind_mright ) )
+ {
+ if( _skateshop.selected_player_id+1 < valid_count )
+ _skateshop.selected_player_id ++;
+ else
+ _skateshop.selected_player_id = 0;
- if( changed )
- {
- addon_reg *addon = get_addon_from_index( k_addon_type_player, global_skateshop.selected_player_id,
- 0, ADDON_REG_HIDDEN );
- u32 real_id = get_index_from_addon( k_addon_type_player, addon,0,0 );
+ changed = 1;
+ }
- player__use_model( real_id );
- }
+ if( changed )
+ {
+ addon_reg *addon = get_addon_from_index( k_addon_type_player, _skateshop.selected_player_id,
+ 0, ADDON_REG_HIDDEN );
+ u32 real_id = get_index_from_addon( k_addon_type_player, addon,0,0 );
+ 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_reset( k_gui_helper_mode_clear );
+ if( button_down( k_srbind_maccept ) )
+ {
+ network_send_item( k_netmsg_playeritem_player );
+ gui_helper_reset( k_gui_helper_mode_clear );
+ skateshop_playermod( 0 );
+ _skateshop.open = 0;
+ }
}
- }
- else if( shop->type == k_skateshop_type_worldshop )
- {
+ else if( shop->type == k_skateshop_type_worldshop )
+ {
#if 0
- int browseable = 0,
- loadable = 0;
+ int browseable = 0,
+ loadable = 0;
- u32 valid_count = addon_count( k_addon_type_world, ADDON_REG_HIDDEN );
+ 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() )
+ browseable = 1;
- if( valid_count && vg_loader_availible() )
- loadable = 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;
+ _skateshop.helper_browse->greyed = !browseable;
+ _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;
+ int change = 0;
+ if( browseable ){
+ if( button_down( k_srbind_mleft ) ){
+ if( _skateshop.selected_world_id > 0 ){
+ _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;
+ if( button_down( k_srbind_mright ) ){
+ if( _skateshop.selected_world_id+1 < valid_count ){
+ _skateshop.selected_world_id ++;
+ change = 1;
+ }
}
- }
- selected_world = get_addon_from_index( k_addon_type_world,
- global_skateshop.selected_world_id, ADDON_REG_HIDDEN );
+ selected_world = get_addon_from_index( k_addon_type_world,
+ _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( change || (_skateshop.reg_preview == NULL) ){
+ SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+ _skateshop.reg_preview = selected_world;
+ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+ }
}
- }
- if( loadable )
- {
- if( button_down( k_srbind_maccept ) )
+ if( loadable )
{
- skaterift_switch_world_start( selected_world );
+ if( button_down( k_srbind_maccept ) )
+ {
+ skaterift_switch_world_start( selected_world );
+ }
}
- }
#endif
- }
- 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 if( shop->type == k_skateshop_type_server )
+ {
+ f64 delta = vg.time_real - network_client.last_intent_change;
+
+ if( (delta > 5.0) && (!skaterift.demo_mode) )
+ {
+ _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
+ _skateshop.helper_pick->greyed = 1;
}
+ else
+ vg_fatal_error( "Unknown store (%u)\n", shop->type );
}
- else{
- vg_fatal_error( "Unknown store (%u)\n", shop->type );
- }
-
- if( button_down( k_srbind_mback ) )
+ else
{
- if( shop->type == k_skateshop_type_charshop )
- network_send_item( k_netmsg_playeritem_player );
+ if( vg_loader_availible() )
+ {
+ if( button_down( k_srbind_use ) )
+ {
+ ent_skateshop *shop = _skateshop.current_shop;
+ if( shop->type == k_skateshop_type_boardshop )
+ {
+ skateshop_update_viewpage();
+ vg_loader_start( board_scan_thread, NULL );
+ }
-#if 0
- world_entity_exit_modal();
- world_entity_clear_focus();
-#endif
- gui_helper_reset( k_gui_helper_mode_clear );
- return;
+ gui_helper_reset( k_gui_helper_mode_clear );
+ ent_skateshop_helpers_pickable( "Pick" );
+ _skateshop.open = 1;
+
+ skateshop_playermod( 1 );
+ }
+ }
}
}
+#if 0
void skateshop_world_preupdate(void)
{
world_instance *world = &_world.main;
}
}
}
+#endif
-static void skateshop_render_boardshop( ent_skateshop *shop )
+static void skateshop_render_boardshop( ent_skateshop *shop, vg_camera *cam )
{
world_instance *world = &_world.main;
- u32 slot_count = VG_ARRAY_LEN(global_skateshop.shop_view_slots);
+ u32 slot_count = VG_ARRAY_LEN(_skateshop.shop_view_slots);
ent_marker *mark_rack = af_arritm( &world->ent_marker,
mdl_entity_id_id(shop->boards.id_rack)),
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++ ){
- struct shop_view_slot *slot = &global_skateshop.shop_view_slots[i];
+ for( u32 i=0; i<slot_count; i++ )
+ {
+ struct shop_view_slot *slot = &_skateshop.shop_view_slots[i];
float selected = 0.0f;
if( !slot->cache_id )
mdl_transform_mul( &mark_rack->transform, &xform, &xform );
- if( entry->reg_index == global_skateshop.selected_board_id ){
+ if( entry->reg_index == _skateshop.selected_board_id ){
selected = 1.0f;
}
struct player_board_pose pose = {0};
m4x3f mmdl;
mdl_transform_m4x3( &xform, mmdl );
- render_board( &g_render.cam, world, board, mmdl,
- &pose, k_board_shader_entity );
+ render_board( cam, world, board, mmdl, &pose, k_board_shader_entity );
fade_out:;
float rate = 5.0f*vg.time_delta;
float scale = 0.2f,
thickness = 0.03f;
- font3d_bind( &gui.font, k_font_shader_default, 0, world, &g_render.cam );
+ font3d_bind( &gui.font, k_font_shader_default, 0, world, cam );
shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
/* Selection counter
m4x3_mul( mrack, mlocal, mmdl );
u32 valid_count = addon_count(k_addon_type_board,0,0);
- if( valid_count ){
+ 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_strcati32( &str, _skateshop.selected_board_id+1 );
vg_strcatch( &str, '/' );
vg_strcati32( &str, valid_count );
- font3d_simple_draw( 0, buf, &g_render.cam, mmdl );
+ font3d_simple_draw( 0, buf, cam, mmdl );
}
else{
- font3d_simple_draw( 0, "Nothing installed", &g_render.cam, mmdl );
+ font3d_simple_draw( 0, "Nothing installed", cam, mmdl );
}
u16 cache_id = skateshop_selected_cache_id();
if( entry ) reg = entry->reg_ptr;
- if( !reg ){
+ if( !reg )
+ {
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
- global_skateshop.render.item_title = "";
- global_skateshop.render.item_desc = "";
+ _skateshop.render.item_title = "";
+ _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 = "";
+ if( _skateshop.render.reg_id != _skateshop.selected_board_id )
+ {
+ _skateshop.render.item_title = "";
+ _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;
+ if( title ) _skateshop.render.item_title = title;
const char *dsc = vg_msg_getkvstr( &msg, "author" );
- if( dsc ) global_skateshop.render.item_desc = dsc;
+ if( dsc ) _skateshop.render.item_desc = dsc;
vg_msg_skip_frame( &msg );
}
- global_skateshop.render.reg_id = global_skateshop.selected_board_id;
+ _skateshop.render.reg_id = _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] = -font3d_string_width( 0, _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,
- &g_render.cam, mmdl );
+ font3d_simple_draw( 0, _skateshop.render.item_title, 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] = -font3d_string_width( 0, _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,
- &g_render.cam, mmdl );
+ font3d_simple_draw( 0, _skateshop.render.item_desc, cam, mmdl );
SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
}
-static void skateshop_render_charshop( ent_skateshop *shop ){
+static void skateshop_render_charshop( ent_skateshop *shop, vg_camera *cam )
+{
}
-static void skateshop_render_worldshop( ent_skateshop *shop ){
+static void skateshop_render_worldshop( ent_skateshop *shop, vg_camera *cam )
+{
world_instance *world = &_world.main;
- ent_marker *mark_display = af_arritm( &world->ent_marker,
- mdl_entity_id_id(shop->worlds.id_display)),
- *mark_info = af_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";
+ ent_marker *mark_display = af_arritm( &world->ent_marker, mdl_entity_id_id(shop->worlds.id_display)),
+ *mark_info = af_arritm( &world->ent_marker, mdl_entity_id_id(shop->boards.id_info));
- addon_reg *reg = get_addon_from_index( k_addon_type_world,
- global_skateshop.selected_world_id, 0, ADDON_REG_HIDDEN );
+ if( _skateshop.render.world_reg != _skateshop.selected_world_id)
+ {
+ _skateshop.render.world_title = "missing: workshop.title";
+ addon_reg *reg = get_addon_from_index( k_addon_type_world, _skateshop.selected_world_id, 0, ADDON_REG_HIDDEN );
if( !reg )
goto none;
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;
+ _skateshop.render.world_loc = vg_msg_getkvstr(&msg,"location");
+ _skateshop.render.world_reg = _skateshop.selected_world_id;
if( vg_msg_seekframe( &msg, "workshop" ) )
{
- global_skateshop.render.world_title = vg_msg_getkvstr(&msg,"title");
+ _skateshop.render.world_title = vg_msg_getkvstr(&msg,"title");
vg_msg_skip_frame( &msg );
}
- else {
+ else
vg_warn( "No workshop body\n" );
- }
- }
- else {
- global_skateshop.render.world_title = reg->alias.foldername;
}
+ else
+ _skateshop.render.world_title = reg->alias.foldername;
}
none:;
u32 valid_count = addon_count(k_addon_type_world,0,ADDON_REG_HIDDEN);
if( valid_count )
{
- vg_strcati32( &info, global_skateshop.selected_world_id+1 );
+ vg_strcati32( &info, _skateshop.selected_world_id+1 );
vg_strcatch( &info, '/' );
vg_strcati32( &info, valid_count );
vg_strcatch( &info, ' ' );
- vg_strcat( &info, global_skateshop.render.world_title );
+ vg_strcat( &info, _skateshop.render.world_title );
if( !vg_loader_availible() )
{
}
else
{
- addon_reg *reg = get_addon_from_index( k_addon_type_world,
- global_skateshop.selected_world_id, 0, ADDON_REG_HIDDEN );
+ addon_reg *reg = get_addon_from_index( k_addon_type_world, _skateshop.selected_world_id, 0, ADDON_REG_HIDDEN );
if( reg->alias.workshop_id )
vg_strcat( &subtext, "(Workshop) " );
- vg_strcat( &subtext, global_skateshop.render.world_loc );
+ vg_strcat( &subtext, _skateshop.render.world_loc );
}
}
else
m4x3f mtext,mlocal,mtextmdl;
mdl_transform_m4x3( &mark_info->transform, mtext );
- font3d_bind( &gui.font, k_font_shader_default, 0, NULL, &g_render.cam );
+ font3d_bind( &gui.font, k_font_shader_default, 0, NULL, cam );
shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
float scale = 0.2f, thickness = 0.015f, scale1 = 0.08f;
mlocal[3][1] = 0.1f;
mlocal[3][2] = 0.0f;
m4x3_mul( mtext, mlocal, mtextmdl );
- font3d_simple_draw( 0, buftext, &g_render.cam, mtextmdl );
+ font3d_simple_draw( 0, buftext, 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, &g_render.cam, mtextmdl );
+ font3d_simple_draw( 0, bufsubtext, cam, mtextmdl );
}
-/*
- * World: render event
- */
-void skateshop_render( ent_skateshop *shop )
+void ent_skateshop_render( vg_camera *cam )
{
- 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 );
-}
+ bool dont_render_ghost = 0;
-void skateshop_render_nonfocused( world_instance *world, vg_camera *cam )
-{
- for( u32 j=0; j<af_arrcount( &world->ent_skateshop ); j ++ )
+ if( _world.event == k_world_event_shop )
{
- ent_skateshop *shop = af_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( _skateshop.open )
+ {
+ ent_skateshop *shop = _skateshop.current_shop;
+ if( shop->type == k_skateshop_type_boardshop )
+ skateshop_render_boardshop( shop, cam );
+ else if( shop->type == k_skateshop_type_charshop )
+ skateshop_render_charshop( shop, cam );
+ else if( shop->type == k_skateshop_type_worldshop )
+ skateshop_render_worldshop( shop, cam );
+ else if( shop->type == k_skateshop_type_server ){
+ }
+ else
+ vg_fatal_error( "Unknown store (%u)\n", shop->type );
- if( dist2 > maxdist*maxdist ) continue;
- ent_marker *mark_rack = af_arritm( &world->ent_marker,
- mdl_entity_id_id(shop->boards.id_rack));
+ dont_render_ghost = 1;
+ }
+ }
- if( !mark_rack )
- continue;
+ if( dont_render_ghost == 0 )
+ {
+ world_instance *world = &_world.main;
- u32 slot_count = VG_ARRAY_LEN(global_skateshop.shop_view_slots);
- for( u32 i=0; i<slot_count; i++ )
+ for( u32 j=0; j<af_arrcount( &world->ent_skateshop ); j ++ )
{
- struct player_board *board = &localplayer.fallback_board;
-
- mdl_transform xform;
- transform_identity( &xform );
+ ent_skateshop *shop = af_arritm(&world->ent_skateshop, j );
- xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f;
- mdl_transform_mul( &mark_rack->transform, &xform, &xform );
+ if( shop->type != k_skateshop_type_boardshop )
+ continue;
- 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;
+ f32 dist2 = v3_dist2( cam->pos, shop->transform.co ),
+ maxdist = 50.0f;
- if( gui_new_helper( input_button_list[k_srbind_mback], &text ))
- vg_strcat( &text, "Exit" );
+ if( dist2 > maxdist*maxdist ) continue;
+ ent_marker *mark_rack = af_arritm( &world->ent_marker, mdl_entity_id_id(shop->boards.id_rack));
- if( (global_skateshop.helper_pick = gui_new_helper(
- input_button_list[k_srbind_maccept], &text))){
- vg_strcat( &text, acceptance );
- }
+ if( !mark_rack )
+ continue;
- if( (global_skateshop.helper_browse = gui_new_helper(
- input_axis_list[k_sraxis_mbrowse_h], &text ))){
- vg_strcat( &text, "Browse" );
- }
-}
+ u32 slot_count = VG_ARRAY_LEN(_skateshop.shop_view_slots);
+ for( u32 i=0; i<slot_count; i++ )
+ {
+ struct player_board *board = &localplayer.fallback_board;
-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();
+ mdl_transform xform;
+ transform_identity( &xform );
- /* 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
-}
+ xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f;
+ mdl_transform_mul( &mark_rack->transform, &xform, &xform );
-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 );
+ struct player_board_pose pose = {0};
+ m4x3f mmdl;
+ mdl_transform_m4x3( &xform, mmdl );
+ render_board( cam, world, board, mmdl, &pose, k_board_shader_entity );
+ }
+ }
+ }
}
-/*
- * 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 = af_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( call->function == 0 ) /* view() */
{
- if( localplayer.subsystem != k_player_subsystem_walk )
- return k_entity_call_result_OK;
-
- vg_info( "Entering skateshop\n" );
-
-#if 0
- world_entity_set_focus( call->id );
- world_entity_focus_modal();
-#endif
- gui_helper_reset( k_gui_helper_mode_black_bars );
-
- if( shop->type == k_skateshop_type_boardshop )
+ if( localplayer.subsystem == k_player_subsystem_walk )
{
- 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 );
+ if( world_set_event( k_world_event_shop ) )
+ {
+ _skateshop.current_shop = shop;
+ gui_helper_reset( k_gui_helper_mode_black_bars );
+
+ vg_str text;
+ if( gui_new_helper( input_button_list[k_srbind_use], &text ))
+ vg_strcat( &text, "Open Shop" );
+ }
}
- else if( shop->type == k_skateshop_type_server )
+ return k_entity_call_result_OK;
+ }
+ else if( call->function == -1 ) /* unview() */
+ {
+ if( world_clear_event( k_world_event_shop ) )
{
- 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();
+ _skateshop.current_shop = NULL;
+ gui_helper_reset( k_gui_helper_mode_clear );
}
return k_entity_call_result_OK;
}
- else
+ else
return k_entity_call_result_unhandled;
}