From d7e5f658b0c4794eaa73ba6aaacaa950af39d7d0 Mon Sep 17 00:00:00 2001 From: PUM4CH3N <18906012399@163.com> Date: Mon, 17 Apr 2023 10:15:28 +0800 Subject: [PATCH] Add Coroutine API --- Editor/API/HDAProcessor.cs | 62 +++++++++++++++++++++++++++-- Editor/Parm.cs | 43 +++++++++++++++++++- Editor/Utils.cs | 1 + Editor/Window/HDAProcessorWindow.cs | 30 ++------------ package.json | 2 +- 5 files changed, 106 insertions(+), 32 deletions(-) diff --git a/Editor/API/HDAProcessor.cs b/Editor/API/HDAProcessor.cs index 1f2d71e..6c2b56d 100644 --- a/Editor/API/HDAProcessor.cs +++ b/Editor/API/HDAProcessor.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using System.IO; using System.IO.Compression; +using DotLiquid.Util; using Newtonsoft.Json; using Unity.EditorCoroutines.Editor; using UnityEditor; @@ -36,10 +37,29 @@ public static void GetHDAHeaderAsync(string hdaName, Action completed, { Debug.LogError(request.error); failed?.Invoke(); - } + } }); } + public static IEnumerator GetHDAHeaderRoutine(string hdaName, Action completed, Action failed = null) + { + Uri uri = GetUri(hdaName); + using (UnityWebRequest get = UnityWebRequest.Get(uri)) + { + var request = get.SendWebRequest(); + while (!request.isDone) + yield return null; + if (get.result != UnityWebRequest.Result.Success) + { + if (failed == null) + Debug.LogError(get.error); + else + failed?.Invoke(); + } + completed?.Invoke(JsonConvert.DeserializeObject(get.downloadHandler.text)); + } + } + public static void ProcessHDAAsync(this HDAProcessorPreset preset, Action completed, Action failed = null, int timeout = 120) { ProcessHDAAsync(preset.hda, preset.parms, completed, failed, timeout); @@ -55,7 +75,7 @@ public static void ProcessHDAAsync(string hda, IEnumerable parms, Actio formData.Add(parm.formSection); } - string downloadedFile = Path.Combine(Path.GetDirectoryName(Application.dataPath), "Temp", $"Harpoon_Response{DateTime.Now.Ticks}.zip"); + string downloadedFile = Path.Combine(Path.GetDirectoryName(Application.temporaryCachePath), "Temp", $"Harpoon_Response{DateTime.Now.Ticks}.zip"); UnityWebRequest post = UnityWebRequest.Post(uri, formData); post.useHttpContinue = false; post.timeout = timeout; @@ -68,14 +88,50 @@ public static void ProcessHDAAsync(string hda, IEnumerable parms, Actio { completed?.Invoke(zipArchive); } + File.Delete(downloadedFile); } else { - Debug.LogError(request.error); failed?.Invoke(); } }); } + + public static IEnumerator ProcessHDARoutine(string hda, IEnumerable parms, Action completed, + Action failed = null, int timeout = 120) + { + Uri uri = GetUri(hda); + List formData = new List(); + foreach (var parm in parms) + { + formData.Add(parm.formSection); + } + string downloadedFile = Path.Combine(Path.GetDirectoryName(Application.temporaryCachePath), "Temp", $"Harpoon_Response{DateTime.Now.Ticks}.zip"); + using (UnityWebRequest post = UnityWebRequest.Post(uri, formData)) + { + post.useHttpContinue = false; + post.timeout = timeout; + post.downloadHandler = new DownloadHandlerFile(downloadedFile); + var request = post.SendWebRequest(); + while (!request.isDone) + yield return null; + if (post.result == UnityWebRequest.Result.Success) + { + using (var zipArchive = ZipFile.OpenRead(downloadedFile)) + { + completed?.Invoke(zipArchive); + } + } + else + { + if (failed == null) + Debug.LogError(post.error); + else + failed?.Invoke(); + } + File.Delete(downloadedFile); + } + } } } diff --git a/Editor/Parm.cs b/Editor/Parm.cs index 9df0b6b..e8112fe 100644 --- a/Editor/Parm.cs +++ b/Editor/Parm.cs @@ -9,6 +9,7 @@ using UnityEditor.Formats.Fbx.Exporter; using UnityEngine; using UnityEngine.Networking; +using Object = UnityEngine.Object; namespace Harpoon { @@ -19,6 +20,36 @@ public abstract class HouParm public abstract void GUILayout(); public abstract IMultipartFormSection formSection { get; } + public string name => parmTemplate.name; + + public static IEnumerable CreateParms(dynamic hdaHeader) + { + IEnumerable parmTemplates = hdaHeader.parmTemplateGroup.parmTemplates; + foreach (var parmTemplate in parmTemplates) + { + ParmTemplate template = parmTemplate.ToObject(); + if (template.isHidden) + continue; + switch (template.dataType) + { + case (ParmData.Int): + { + yield return new IntParm(parmTemplate.ToObject()); + break; + } + case (ParmData.Float): + { + yield return new FloatParm(parmTemplate.ToObject()); + break; + } + case (ParmData.String): + { + yield return new StringParm(parmTemplate.ToObject()); + break; + } + } + } + } } [Serializable] @@ -166,12 +197,22 @@ byte[] rawModel } string path = Path.Combine(Application.temporaryCachePath, $"{template.name}_{model.GetInstanceID()}.fbx"); - ExportBinaryFBX(path, model); + ExportFBX(path, model); var rawFBX = File.ReadAllBytes(path); File.WriteAllBytes(Path.Combine(Application.temporaryCachePath, "TMP.fbx"), rawFBX); return rawFBX; } } + + private static void ExportFBX(string path, GameObject model) + { + model = GameObject.Instantiate(model); + ExportModelOptions exportSettings = new ExportModelOptions(); + exportSettings.ExportFormat = ExportFormat.Binary; + exportSettings.EmbedTextures = true; + ModelExporter.ExportObject(path, model, exportSettings); + Object.DestroyImmediate(model); + } private static void ExportBinaryFBX (string filePath, UnityEngine.Object singleObject) { diff --git a/Editor/Utils.cs b/Editor/Utils.cs index 9030c5e..3efecd3 100644 --- a/Editor/Utils.cs +++ b/Editor/Utils.cs @@ -23,6 +23,7 @@ private static IEnumerator SendWebRequestRoutine(UnityWebRequest request, Action { yield return request.SendWebRequest(); completed?.Invoke(request); + request.Dispose(); } } } diff --git a/Editor/Window/HDAProcessorWindow.cs b/Editor/Window/HDAProcessorWindow.cs index f490a28..df4bc9b 100644 --- a/Editor/Window/HDAProcessorWindow.cs +++ b/Editor/Window/HDAProcessorWindow.cs @@ -19,7 +19,7 @@ public class HDAProcessorWindow : EditorWindow private int hdaIdx = 0; private string[] hdas = new string[0]; private string[] hdaNames = new string[0]; - private List parms; + private HouParm[] parms; private float progress = 1.0f; private string hda => hdas[hdaIdx]; @@ -51,32 +51,8 @@ void UpdateHDAParms() { HDAProcessor.GetHDAHeaderAsync(hda, (hdaHeader) => { - var parmTemplates = hdaHeader.parmTemplateGroup.parmTemplates; - parms = new List(); - for (int i = 0; i < parmTemplates.Count; ++i) - { - ParmTemplate parmTemplate = parmTemplates[i].ToObject(); - if (parmTemplate.isHidden) - continue; - switch (parmTemplate.dataType) - { - case (ParmData.Int): - { - parms.Add(new IntParm(parmTemplates[i].ToObject())); - break; - } - case (ParmData.Float): - { - parms.Add(new FloatParm(parmTemplates[i].ToObject())); - break; - } - case (ParmData.String): - { - parms.Add(new StringParm(parmTemplates[i].ToObject())); - break; - } - } - } + IEnumerable _parms = HouParm.CreateParms(hdaHeader); + parms = _parms.ToArray(); }); } diff --git a/package.json b/package.json index a0756b7..efd3fb4 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "licenseUrl": "", "dependencies": { "com.unity.editorcoroutines": "1.0.0", - "com.unity.formats.fbx": "4.1.3" + "com.unity.formats.fbx": "5.0.0" }, "keywords": [], "author": {