+ 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 = "";
+
+ addon_reg *reg = get_addon_from_index( k_addon_type_world,
+ global_skateshop.selected_world_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 );
+ }
+ }
+
+ /* Text */
+ char buftext[128], bufsubtext[128];
+ vg_str info, subtext;
+ vg_strnull( &info, buftext, 128 );
+ vg_strnull( &subtext, bufsubtext, 128 );
+
+ 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_addon_type_world), 3 );
+ info.buffer[info.i++] = ' ';
+ info.buffer[info.i] = '\0';
+
+ 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 );
+
+ if( reg->alias.workshop_id )
+ vg_strcat( &subtext, "(Workshop) " );
+
+ vg_strcat( &subtext, global_skateshop.render.world_loc );
+ }
+ }
+ else{
+ vg_strcat( &info, "No 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 );
+
+ /* pointcloud */
+ m4x3f mmdl;
+ mdl_transform_m4x3( &mark_display->transform, mmdl );
+ m4x3_rotate_y( mmdl, vg.time * 0.2 );
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE);
+ glDisable(GL_DEPTH_TEST);
+ pointcloud_render( world, &skaterift.cam, mmdl );
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+}
+
+/*
+ * World: render event
+ */
+static 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
+ vg_fatal_error( "Unknown store (%u)\n", shop->type );
+}
+
+/*
+ * Entity logic: entrance event
+ */
+static void 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 ) return;
+ if( !vg_loader_availible() ) return;
+
+ if( call->function == k_ent_function_trigger ){
+ if( localplayer.subsystem != k_player_subsystem_walk ) return;
+
+ vg_info( "Entering skateshop\n" );
+
+ world_entity_focus( call->id );
+#if 0
+ localplayer.immobile = 1;
+ menu.disable_open = 1;
+ skaterift.activity = k_skaterift_skateshop;
+
+ v3_zero( localplayer.rb.v );
+ v3_zero( localplayer.rb.w );
+ localplayer._walk.move_speed = 0.0f;
+ global_skateshop.ptr_ent = shop;
+#endif
+
+ if( shop->type == k_skateshop_type_boardshop ){
+ skateshop_update_viewpage();
+ skateshop_op_board_scan();
+ }
+ else if( shop->type == k_skateshop_type_charshop ){
+
+ }
+ else if( shop->type == k_skateshop_type_worldshop ){
+ pointcloud_animate( k_pointcloud_anim_opening );
+ skateshop_op_world_scan();
+ }
+ }