Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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));
        }
Example #7
0
        /// <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
        }