Skip to content

Commit c986eac

Browse files
HarrisonHoughrYuuk
authored andcommitted
[SDK-600] Feature/avatar template element (#164)
- added avatar template element and other required logic and classes + prefabs
1 parent 5fc145b commit c986eac

39 files changed

+1658
-105
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
6+
namespace ReadyPlayerMe.AvatarCreator
7+
{
8+
/// <summary>
9+
/// This class can be used to fetch avatar template data including icon renders from the avatarAPI.
10+
/// </summary>
11+
public class AvatarTemplateFetcher
12+
{
13+
private readonly CancellationToken ctx;
14+
private readonly AvatarAPIRequests avatarAPIRequests;
15+
16+
public AvatarTemplateFetcher(CancellationToken ctx = default)
17+
{
18+
this.ctx = ctx;
19+
avatarAPIRequests = new AvatarAPIRequests(ctx);
20+
}
21+
22+
/// <summary>
23+
/// Fetches all avatar templates without the icon renders via the avatarAPI.
24+
/// </summary>
25+
/// <returns></returns>
26+
public async Task<List<AvatarTemplateData>> GetTemplates()
27+
{
28+
return await avatarAPIRequests.GetAvatarTemplates();
29+
}
30+
31+
/// <summary>
32+
/// Fetches all avatar template data with the icon renders via the avatarAPI.
33+
/// This will wait for all the icons to be downloaded.
34+
/// </summary>
35+
/// <returns></returns>
36+
public async Task<List<AvatarTemplateData>> GetTemplatesWithRenders()
37+
{
38+
var templates = await avatarAPIRequests.GetAvatarTemplates();
39+
return await FetchTemplateRenders(templates);
40+
}
41+
42+
/// <summary>
43+
/// Fetches the renders for all the templates provided.
44+
/// </summary>
45+
public async Task<List<AvatarTemplateData>> FetchTemplateRenders(List<AvatarTemplateData> templates)
46+
{
47+
var tasks = templates.Select(async templateData =>
48+
{
49+
templateData.Texture = await avatarAPIRequests.GetAvatarTemplateImage(templateData.ImageUrl);
50+
}).ToList();
51+
52+
while (!tasks.All(x => x.IsCompleted) &&
53+
!ctx.IsCancellationRequested)
54+
{
55+
await Task.Yield();
56+
}
57+
58+
return templates;
59+
}
60+
}
61+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace ReadyPlayerMe.AvatarCreator
2+
{
3+
public struct AssetLibrary
4+
{
5+
public PartnerAsset[] Assets;
6+
public Pagination Pagination;
7+
}
8+
9+
public struct Pagination
10+
{
11+
public int TotalPages;
12+
}
13+
}

Runtime/AvatarCreator/Data/TemplateData.cs renamed to Runtime/AvatarCreator/Data/AvatarTemplateData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace ReadyPlayerMe.AvatarCreator
77
{
88
[Serializable]
9-
public class TemplateData
9+
public class AvatarTemplateData
1010
{
1111
public string ImageUrl;
1212
[JsonConverter(typeof(GenderConverter))]
Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
using Newtonsoft.Json;
1+
using Newtonsoft.Json;
22
using ReadyPlayerMe.Core;
33

44
namespace ReadyPlayerMe.AvatarCreator
55
{
6-
public struct AssetData
7-
{
8-
public PartnerAsset[] Assets;
9-
public Pagination Pagination;
10-
}
11-
126
public struct PartnerAsset
137
{
148
public string Id;
@@ -17,15 +11,8 @@ public struct PartnerAsset
1711
[JsonConverter(typeof(GenderConverter))]
1812
public OutfitGender Gender;
1913
[JsonProperty("iconUrl")]
20-
public string Icon;
21-
[JsonProperty("maskUrl")]
22-
public string Mask;
14+
public string ImageUrl;
2315
[JsonProperty("lockedCategories")]
2416
public string[] LockedCategories;
2517
}
26-
27-
public struct Pagination
28-
{
29-
public int TotalPages;
30-
}
3118
}

Runtime/AvatarCreator/Data/PartnerAsset.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/AvatarCreator/PartnerAssetsManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public PartnerAssetsManager()
2929
assetsByCategory = new Dictionary<Category, List<PartnerAsset>>();
3030
}
3131

32-
public async Task<Dictionary<Category,List<PartnerAsset>>> GetAssets(BodyType bodyType, OutfitGender gender, CancellationToken token = default)
32+
public async Task<Dictionary<Category, List<PartnerAsset>>> GetAssets(BodyType bodyType, OutfitGender gender, CancellationToken token = default)
3333
{
3434
var startTime = Time.time;
3535

@@ -96,7 +96,7 @@ private async Task DownloadIcons(List<PartnerAsset> chunk, Action<string, Textur
9696

9797
foreach (var asset in chunk)
9898
{
99-
var url = asset.Category == Category.EyeColor ? asset.Mask + EYE_MASK_SIZE_SIZE : asset.Icon + ASSET_ICON_SIZE;
99+
var url = $"{asset.ImageUrl}{ASSET_ICON_SIZE}";
100100
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token);
101101
var iconTask = partnerAssetsRequests.GetAssetIcon(url, icon =>
102102
{
@@ -126,7 +126,7 @@ public PrecompileData GetPrecompileData(Category[] categories, int numberOfAsset
126126
.Select(kvp => kvp.Key)
127127
.ToArray();
128128

129-
var dictionary = categoriesFromMap.ToDictionary(category => category, category =>
129+
var dictionary = categoriesFromMap.ToDictionary(category => category, category =>
130130
GetAssetsByCategory(CategoryHelper.PartnerCategoryMap[category])
131131
.Take(numberOfAssetsPerCategory)
132132
.ToArray());

Samples~/AvatarCreatorSamples/Animation.meta renamed to Runtime/AvatarCreator/Prefabs/Buttons.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)