From 6caf4ec80a4b1bcc22a741fe9b8ad01d6c2e1ad1 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 1 May 2025 19:20:09 +0100 Subject: [PATCH] profile images --- content_skaterift/textures/no_avatar.qoi | Bin 0 -> 4210 bytes src/board_maker.c | 2 +- src/compass.c | 2 +- src/menu.c | 2 +- src/user_profile.c | 63 ++++++++++++++++++++--- src/workshop.c | 8 +-- src/world_map.c | 2 +- 7 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 content_skaterift/textures/no_avatar.qoi diff --git a/content_skaterift/textures/no_avatar.qoi b/content_skaterift/textures/no_avatar.qoi new file mode 100644 index 0000000000000000000000000000000000000000..7b56daf8f708f248f606b8f1414489d3305c9c2d GIT binary patch literal 4210 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 Z1u+&6lOs_eg!G_}e=+=r!Tattachments[0].id ); + ui_image( ctx, rect, &g_render.fb_compass->attachments[0].id, 0 ); vg_ui.colour[3] = 1.0f; } diff --git a/src/menu.c b/src/menu.c index 0c39c1e..6c3dff8 100644 --- a/src/menu.c +++ b/src/menu.c @@ -716,7 +716,7 @@ void menu_gui( ui_context *ctx ) ui_rect img; ui_split( panel, k_ui_axis_h, 456, 0, img, panel ); - ui_image( ctx, img, &menu.prem_tex ); + ui_image( ctx, img, &menu.prem_tex, 0 ); ui_rect end = { panel[0], panel[1] + panel[3] - 48, panel[2], 48 }, a,b; ui_split_ratio( end, k_ui_axis_v, 0.5f, 2, a, b ); diff --git a/src/user_profile.c b/src/user_profile.c index 36e2586..79f1801 100644 --- a/src/user_profile.c +++ b/src/user_profile.c @@ -28,7 +28,8 @@ struct v2f country_coords; - GLuint cc_tex, map_tex, icon_tex; + bool has_avatar; + GLuint cc_tex, map_tex, icon_tex, no_avatar_tex, avatar_tex; } _user_profile = { .country_coords = {0.5f, 0.5f} }; @@ -45,6 +46,8 @@ void _user_profile_init(void) vg_tex2d_load_qoi_async_file( "textures/cc.qoi", VG_TEX2D_CLAMP, &_user_profile.cc_tex ); vg_tex2d_load_qoi_async_file( "textures/world_map.qoi", VG_TEX2D_CLAMP, &_user_profile.map_tex ); vg_tex2d_load_qoi_async_file( "textures/menu_icons.qoi", VG_TEX2D_CLAMP, &_user_profile.icon_tex ); + vg_tex2d_load_qoi_async_file( "textures/no_avatar.qoi", VG_TEX2D_CLAMP, &_user_profile.no_avatar_tex ); + vg_tex2d_load_qoi_async_file( "textures/no_avatar.qoi", VG_TEX2D_CLAMP, &_user_profile.avatar_tex ); } static void _profile_download_callback( void *data, u32 data_size, u64 userdata, enum request_status status ) @@ -93,12 +96,14 @@ void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ) { _user_profile.timer -= vg.time_frame_delta; + bool waiting = 0; + if( (steamid != _user_profile.current_steamid) || (_user_profile.state == k_user_profile_state_none) ) { if( _user_profile.timer < 0.0f ) { _user_profile.state = k_user_profile_state_downloading; - + _user_profile.has_avatar = 0; _user_profile.current_steamid = steamid; _user_profile.timer = 1.0f; @@ -111,7 +116,48 @@ void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ) vg_msg_wkvstr( &data, "endpoint", "profile" ); vg_msg_wkvnum( &data, "steamid", k_vg_msg_u64, 1, &steamid ); network_send_request( packet, &data, _profile_download_callback, steamid ); + + u64 me_id = SteamAPI_ISteamUser_GetSteamID( SteamAPI_SteamUser() ); + bool isme = 0; + if( (steamid == 0) || (steamid == me_id) ) + { + steamid = me_id; + isme = 1; + } + + ISteamFriends *hSteamFriends = SteamAPI_SteamFriends(); + ISteamUtils *hSteamUtils = SteamAPI_SteamUtils(); + if( isme || SteamAPI_ISteamFriends_HasFriend( hSteamFriends, steamid, k_EFriendFlagImmediate ) ) + { + i32 avatar_handle = SteamAPI_ISteamFriends_GetMediumFriendAvatar( hSteamFriends, steamid ); + if( avatar_handle ) + { + u32 w, h; + if( SteamAPI_ISteamUtils_GetImageSize( hSteamUtils, avatar_handle, &w, &h ) ) + { + if( w == 64 && h == 64 ) + { + u8 *tmp = malloc( w*h*4 ); + + if( SteamAPI_ISteamUtils_GetImageRGBA( hSteamUtils, avatar_handle, tmp, w*h*4 ) ) + { + glBindTexture( GL_TEXTURE_2D, _user_profile.avatar_tex ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 64, 64, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp ); + _user_profile.has_avatar = 1; + } + else vg_warn( "GetImageRGBA failed\n" ); + + free(tmp); + } + else vg_warn( "Image wrong size\n" ); + } + else vg_warn( "GetImageSize failed\n" ); + } + else vg_warn( "Avatar handle is 0\n" ); + } } + else + waiting = 1; } ui_fill( ctx, box, ui_opacity( GUI_COL_DARK, 0.36f ) ); @@ -131,7 +177,7 @@ void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ) inner[1] += p; inner[3] -= p*2; - if( _user_profile.state != k_user_profile_state_open ) + if( waiting || (_user_profile.state != k_user_profile_state_open) ) { bool download = _user_profile.state == k_user_profile_state_downloading; ctx->font = &vgf_default_title; @@ -146,12 +192,12 @@ void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ) ui_rect flag = {0,0, pfpw-p, ((pfpw-p)*2)/3 }; ui_rect_center( flagbox, flag ); + vg_ui.frosting = 0.015f; + ui_flush( ctx, k_ui_shader_colour, NULL ); + vg_ui.frosting = 0.0f; + if( _user_profile.country_index ) { - vg_ui.frosting = 0.015f; - ui_flush( ctx, k_ui_shader_colour, NULL ); - vg_ui.frosting = 0.0f; - u32 i = _user_profile.country_index-1, x = (i & 0xf)*16, y = ((i>>4) & 0xf)*16; @@ -161,7 +207,8 @@ void _user_profile_ui( ui_context *ctx, ui_rect box, u64 steamid ) ui_flush( ctx, k_ui_shader_image, &inf ); } - ui_fill( ctx, pfp, ui_colour( ctx, k_ui_blue ) ); + ui_image( ctx, pfp, _user_profile.has_avatar? &_user_profile.avatar_tex: &_user_profile.no_avatar_tex, 1 ); + ui_outline( ctx, pfp, 1, ui_colour( ctx, k_ui_fg ), 0 ); ui_rect a2 = { inner[0] + pfpw + p, inner[1], inner[2] - (pfpw+p), inner[3] }; ui_rect title_box; diff --git a/src/workshop.c b/src/workshop.c index 89d86c0..0ac1927 100644 --- a/src/workshop.c +++ b/src/workshop.c @@ -1100,18 +1100,14 @@ static void workshop_form_gui_draw_preview( ui_context *ctx, ui_rect img_box ) enum addon_type type = workshop_form.submission.type; if( workshop_form.file_intent == k_workshop_form_file_intent_keep_old ) { - ui_image( ctx, - img_box, &g_render.fb_workshop_preview->attachments[0].id ); + ui_image( ctx, img_box, &g_render.fb_workshop_preview->attachments[0].id, 0 ); } else if( workshop_form.file_intent == k_workshop_form_file_intent_new ) { - ui_image( ctx, - img_box, &g_render.fb_workshop_preview->attachments[0].id ); + ui_image( ctx, img_box, &g_render.fb_workshop_preview->attachments[0].id, 0 ); if( type == k_addon_type_world ) - { return; - } int hover = ui_inside_rect( img_box, ctx->mouse ), target = ui_inside_rect( img_box, ctx->mouse_click ); diff --git a/src/world_map.c b/src/world_map.c index 6c1120d..05b5b42 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -857,7 +857,7 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al planet_box[0] += 4; planet_box[2] = WORKSHOP_PREVIEW_WIDTH; planet_box[3] = WORKSHOP_PREVIEW_HEIGHT; - ui_image( ctx, planet_box, &g_render.fb_workshop_preview->attachments[0].id ); + ui_image( ctx, planet_box, &g_render.fb_workshop_preview->attachments[0].id, 0 ); ui_rect planet_box_title; ui_split( planet_box, k_ui_axis_h, 28, 0, planet_box_title, planet_box ); -- 2.25.1