public void InitPreview(GallerySample g, string code, GalleryAvatarState state, bool customizationEnabled) { Debug.LogFormat("Initializing preview..."); avatarCode = code; gallery = g; isCustomizationEnabled = customizationEnabled; AvatarSdkMgr.SpawnCoroutine(UpdateImageAsync()); editButton.gameObject.SetActive(customizationEnabled); avatarName.gameObject.SetActive(customizationEnabled); UpdatePreview(avatarCode, state); }
/// <summary> /// Delete avatar record on the server (does not delete local files). /// </summary> public virtual AsyncWebRequest DeleteAvatarAsync(AvatarData avatar) { var request = new AsyncWebRequest(AvatarSdkMgr.Str(Strings.DeletingAvatarOnServer)); Func <UnityWebRequest> webRequestFactory = () => { var webRequest = UnityWebRequest.Delete(avatar.url); SetAuthHeaders(webRequest); webRequest.downloadHandler = new DownloadHandlerBuffer(); return(webRequest); }; AvatarSdkMgr.SpawnCoroutine(AwaitWebRequest(webRequestFactory, request)); return(request); }
/// <summary> /// Register unique player UID that is used later to sign the requests. /// </summary> /// <param name="comment">Arbitrary data associated with player UID.</param> public virtual AsyncWebRequest <Player> RegisterPlayerAsync(string comment = "") { var r = new AsyncWebRequest <Player> (AvatarSdkMgr.Str(Strings.RegisteringPlayerID)); var form = new Dictionary <string, string> () { { "comment", comment }, }; Func <UnityWebRequest> webRequestFactory = () => { var webRequest = HttpPost(GetUrl("players"), form); SetAuthHeaders(webRequest); return(webRequest); }; AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, r)); return(r); }
/// <summary> /// Request to get available resources for the pipeline /// </summary> public virtual AsyncWebRequest <string> GetResourcesAsync(PipelineType pipelineType, AvatarResourcesSubset resourcesSubset) { string subsetStr = "available"; if (resourcesSubset == AvatarResourcesSubset.DEFAULT) { subsetStr = "default"; } var url = GetUrl("resources", subsetStr, pipelineType.GetPipelineTypeName()); url = UrlWithParams(url, "pipeline_subtype", pipeline_subtype); var request = new AsyncWebRequest <string>(Strings.GettingResourcesList); AvatarSdkMgr.SpawnCoroutine(AwaitStringDataAsync(() => HttpGet(url), request)); return(request); }
/// <summary> /// Upload photo to server, wait until avatar is calculated, download and save the results. /// If this function does not suit the requirements of your application precisely, feel free to use it as /// a sample and implement your own version in a separate class (for finer control over details). /// </summary> /// <param name="connection">Connection session.</param> /// <param name="name">Name of avatar.</param> /// <param name="description">Description of avatar.</param> /// <param name="photoBytes">Photo bytes (jpg or png encoded).</param> /// <param name="withHaircutPointClouds">If set to true then download all haircut point clouds too.</param> /// <param name="withBlendshapes">If set to true then download blendshapes too.</param> /// <param name="forcePowerOfTwoTexture">In case of true, generated texture resolution will be power of 2</param> public static AsyncRequest <AvatarData> GenerateAndSaveAvatarAsync( Connection connection, string name, string description, byte[] photoBytes, bool withHaircutPointClouds, bool withBlendshapes, bool forcePowerOfTwoTexture = false ) { Debug.LogWarning("This method is obsolete. Use CloudAvatarProvider instead."); var request = new AsyncRequest <AvatarData> (AvatarSdkMgr.Str(Strings.GeneratingAvatar)); AvatarSdkMgr.SpawnCoroutine(GenerateAndSaveAvatarFunc( connection, name, description, photoBytes, withHaircutPointClouds, withBlendshapes, forcePowerOfTwoTexture, request )); return(request); }
public void InitItems(string avatarCode, List <string> items, IAvatarProvider avatarProvider) { AvatarSdkMgr.StopCoroutine("DisplayPreviews"); this.avatarCode = avatarCode; this.avatarProvider = avatarProvider; InitItems(items); List <Toggle> previewToggles = new List <Toggle>(); foreach (Toggle t in toggles) { Text statusText = Utils.FindSubobjectByName(t.gameObject, "StatusText").GetComponentInChildren <Text>(); string haircutId = t.GetComponentInChildren <ToggleId>().Id; if (haircutId == BALD_HAIRCUT_NAME) { statusText.text = "none"; } else { statusText.text = "Loading..."; previewToggles.Add(t); } t.onValueChanged.AddListener(isOn => { if (isOn && isShown) { OnDoneClick(); } }); } AvatarSdkMgr.SpawnCoroutine(DisplayPreviews(previewToggles)); }
/// <summary> /// Upload photo and create avatar instance on the server. Calculations will start right away after the photo is uploaded. /// </summary> public virtual AsyncWebRequest <AvatarData> CreateAvatarWithPhotoAsync( string name, string description, byte[] photoBytes, bool forcePowerOfTwoTexture = false, PipelineType pipeline = PipelineType.FACE, AvatarResources resources = null ) { var request = new AsyncWebRequest <AvatarData> (AvatarSdkMgr.Str(Strings.UploadingPhoto), TrackProgress.UPLOAD); #if UNITY_2017_1_OR_NEWER Func <UnityWebRequest> webRequestFactory = () => { List <IMultipartFormSection> formData = new List <IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("name", name)); if (!string.IsNullOrEmpty(description)) { formData.Add(new MultipartFormDataSection("description", description)); } formData.Add(new MultipartFormFileSection("photo", photoBytes, "photo.jpg", "application/octet-stream")); formData.Add(new MultipartFormDataSection("preserve_original_texture", (!forcePowerOfTwoTexture).ToString())); formData.Add(new MultipartFormDataSection("pipeline", pipeline.GetPipelineTypeName())); if (resources != null) { formData.Add(new MultipartFormDataSection("pipeline_subtype", pipeline_subtype)); formData.Add(new MultipartFormDataSection("resources", CoreTools.GetAvatarCalculationParamsJson(resources))); } var webRequest = UnityWebRequest.Post(GetUrl("avatars"), formData); webRequest.chunkedTransfer = false; SetAuthHeaders(webRequest); return(webRequest); }; Debug.LogFormat("Uploading photo..."); AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, request)); return(request); #else // Unity 5.5.0 (and probably earlier versions) have a weird bug in default multipart form data // implementation, which causes incorrect boundaries between data fields. To work around this bug the // multipart request body is constructed manually, see below. byte[] requestBodyData = null; using (var requestBody = new MultipartBody()) { requestBody.WriteTextField("name", name); requestBody.WriteTextField("description", description); requestBody.WriteFileField("photo", "photo.jpg", photoBytes); requestBody.WriteTextField("preserve_original_texture", (!forcePowerOfTwoTexture).ToString()); requestBody.WriteTextField("pipeline", pipeline.GetPipelineTypeName()); if (resources != null) { requestBody.WriteTextField("pipeline_subtype", pipeline_subtype); requestBody.WriteTextField("resources", CoreTools.GetAvatarCalculationParamsJson(resources)); } requestBody.WriteFooter(); requestBodyData = requestBody.GetRequestBodyData(); Func <UnityWebRequest> webRequestFactory = () => { var webRequest = UnityWebRequest.Post(GetUrl("avatars"), " "); webRequest.uploadHandler = new UploadHandlerRaw(requestBodyData); webRequest.SetRequestHeader( "Content-Type", string.Format("multipart/form-data; boundary=\"{0}\"", requestBody.Boundary) ); webRequest.chunkedTransfer = false; SetAuthHeaders(webRequest); return(webRequest); }; Debug.LogFormat("Uploading photo..."); AvatarSdkMgr.SpawnCoroutine(AwaitJsonWebRequest(webRequestFactory, request)); return(request); } #endif }