From 4e4ec9940f1fb07d9da994354070a37830054c61 Mon Sep 17 00:00:00 2001 From: David Back Date: Thu, 7 Feb 2019 18:16:08 -0800 Subject: [PATCH 1/4] copy external texture dependencies --- .../Assets/Editor/AvatarExporter.cs | 35 +++++++++++++++--- tools/unity-avatar-exporter/Assets/README.txt | 2 +- .../avatarExporter.unitypackage | Bin 13046 -> 13314 bytes 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 8f4d5a7962..2d0148b25e 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -14,13 +14,14 @@ using System.Collections.Generic; class AvatarExporter : MonoBehaviour { // update version number for every PR that changes this file, also set updated version in README file - static readonly string AVATAR_EXPORTER_VERSION = "0.1"; + static readonly string AVATAR_EXPORTER_VERSION = "0.2"; static readonly float HIPS_GROUND_MIN_Y = 0.01f; static readonly float HIPS_SPINE_CHEST_MIN_SEPARATION = 0.001f; static readonly int MAXIMUM_USER_BONE_COUNT = 256; static readonly string EMPTY_WARNING_TEXT = "None"; + // TODO: use regex static readonly string[] RECOMMENDED_UNITY_VERSIONS = new string[] { "2018.2.12f1", "2018.2.11f1", @@ -262,8 +263,7 @@ class AvatarExporter : MonoBehaviour { static string assetPath = ""; static string assetName = ""; static HumanDescription humanDescription; - - + [MenuItem("High Fidelity/Export New Avatar")] static void ExportNewAvatar() { ExportSelectedAvatar(false); @@ -301,7 +301,7 @@ class AvatarExporter : MonoBehaviour { " the Rig section of it's Inspector window.", "Ok"); return; } - + humanDescription = modelImporter.humanDescription; SetUserBoneInformation(); @@ -479,6 +479,26 @@ class AvatarExporter : MonoBehaviour { } } + static void CopyExternalTextures(string texturesDirectory) { + List texturePaths = new List(); + + // build the list of all local asset paths for textures that Unity considers dependencies of the model + string[] dependencies = AssetDatabase.GetDependencies(assetPath); + foreach (string dependencyPath in dependencies) { + UnityEngine.Object textureObject = AssetDatabase.LoadAssetAtPath(dependencyPath, typeof(Texture2D)); + if (textureObject != null) { + texturePaths.Add(dependencyPath); + } + } + + // copy the found dependency textures from the local asset folder to the textures folder in the target export project + foreach (string texturePath in texturePaths) { + string textureName = Path.GetFileName(texturePath); + string targetPath = texturesDirectory + "\\" + textureName; + File.Copy(texturePath, targetPath); + } + } + static void OnExportProjectWindowClose(string projectDirectory, string projectName, string warnings) { // copy the fbx from the Unity Assets folder to the project directory string exportModelPath = projectDirectory + assetName + ".fbx"; @@ -494,15 +514,18 @@ class AvatarExporter : MonoBehaviour { string exportFstPath = projectDirectory + "avatar.fst"; WriteFST(exportFstPath, projectName); + // copy any external texture files to the project's texture directory that are considered dependencies of the model + texturesDirectory = texturesDirectory.Replace("\\\\", "\\"); + CopyExternalTextures(texturesDirectory); + // remove any double slashes in texture directory path, display success dialog with any // bone warnings previously mentioned, and suggest user to copy external textures over - texturesDirectory = texturesDirectory.Replace("\\\\", "\\"); string successDialog = "Avatar successfully exported!\n\n"; if (warnings != EMPTY_WARNING_TEXT) { successDialog += "Warnings:\n" + warnings; } successDialog += "Note: If you are using any external textures with your model, " + - "please copy those textures to " + texturesDirectory; + "please ensure those textures are copied to " + texturesDirectory; EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); } diff --git a/tools/unity-avatar-exporter/Assets/README.txt b/tools/unity-avatar-exporter/Assets/README.txt index f02bc688ae..b81a620406 100644 --- a/tools/unity-avatar-exporter/Assets/README.txt +++ b/tools/unity-avatar-exporter/Assets/README.txt @@ -1,6 +1,6 @@ High Fidelity, Inc. Avatar Exporter -Version 0.1 +Version 0.2 Note: It is recommended to use Unity versions between 2017.4.17f1 and 2018.2.12f1 for this Avatar Exporter. diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index 5e825bd0d97489f916b40aced9d764df74a7ae20..96a801496686bfb8536dc9fd97d65d8e68868791 100644 GIT binary patch literal 13314 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 +y}Fp9RlB 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 Date: Thu, 14 Feb 2019 16:09:48 -0800 Subject: [PATCH 2/4] error handling, warnings for duplicate textures --- .../Assets/Editor/AvatarExporter.cs | 166 +++++++++++------- .../avatarExporter.unitypackage | Bin 13314 -> 13655 bytes 2 files changed, 106 insertions(+), 60 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 2d0148b25e..624b365c17 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -263,6 +263,7 @@ class AvatarExporter : MonoBehaviour { static string assetPath = ""; static string assetName = ""; static HumanDescription humanDescription; + static Dictionary dependencyTextures = new Dictionary(); [MenuItem("High Fidelity/Export New Avatar")] static void ExportNewAvatar() { @@ -304,51 +305,38 @@ class AvatarExporter : MonoBehaviour { humanDescription = modelImporter.humanDescription; SetUserBoneInformation(); + string textureWarnings = SetTextureDependencies(); + + // generate the list of bone rule failure strings for any bone rules that are not satisfied by this avatar + SetFailedBoneRules(); + + // check if we should be substituting a bone for a missing UpperChest mapping + AdjustUpperChestMapping(); // format resulting bone rule failure strings // consider export-blocking bone rules to be errors and show them in an error dialog, - // and also include any other bone rule failures as warnings in the dialog + // and also include any other bone rule failures plus texture warnings as warnings in the dialog string boneErrors = ""; - string boneWarnings = ""; + string warnings = ""; foreach (var failedBoneRule in failedBoneRules) { if (Array.IndexOf(EXPORT_BLOCKING_BONE_RULES, failedBoneRule.Key) >= 0) { boneErrors += failedBoneRule.Value + "\n\n"; } else { - boneWarnings += failedBoneRule.Value + "\n\n"; + warnings += failedBoneRule.Value + "\n\n"; } } + warnings += textureWarnings; if (!string.IsNullOrEmpty(boneErrors)) { // if there are both errors and warnings then warnings will be displayed with errors in the error dialog - if (!string.IsNullOrEmpty(boneWarnings)) { + if (!string.IsNullOrEmpty(warnings)) { boneErrors = "Errors:\n\n" + boneErrors; - boneErrors += "Warnings:\n\n" + boneWarnings; + boneErrors += "Warnings:\n\n" + warnings; } // remove ending newlines from the last rule failure string that was added above boneErrors = boneErrors.Substring(0, boneErrors.LastIndexOf("\n\n")); EditorUtility.DisplayDialog("Error", boneErrors, "Ok"); return; } - - if (!humanoidToUserBoneMappings.ContainsKey("UpperChest")) { - // if parent of Neck is not Chest then map the parent to UpperChest - string neckUserBone; - if (humanoidToUserBoneMappings.TryGetValue("Neck", out neckUserBone)) { - UserBoneInformation neckParentBoneInfo; - string neckParentUserBone = userBoneInfos[neckUserBone].parentName; - if (userBoneInfos.TryGetValue(neckParentUserBone, out neckParentBoneInfo) && !neckParentBoneInfo.HasHumanMapping()) { - neckParentBoneInfo.humanName = "UpperChest"; - humanoidToUserBoneMappings.Add("UpperChest", neckParentUserBone); - } - } - // if there is still no UpperChest bone but there is a Chest bone then we remap Chest to UpperChest - string chestUserBone; - if (!humanoidToUserBoneMappings.ContainsKey("UpperChest") && - humanoidToUserBoneMappings.TryGetValue("Chest", out chestUserBone)) { - userBoneInfos[chestUserBone].humanName = "UpperChest"; - humanoidToUserBoneMappings.Remove("Chest"); - humanoidToUserBoneMappings.Add("UpperChest", chestUserBone); - } - } string documentsFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments); string hifiFolder = documentsFolder + "\\High Fidelity Projects"; @@ -407,7 +395,13 @@ class AvatarExporter : MonoBehaviour { return; } else if (option == 0) { // Yes - copy model to Unity project // copy the fbx from the project folder to Unity Assets, overwriting the existing fbx, and re-import it - File.Copy(exportModelPath, assetPath, true); + try { + File.Copy(exportModelPath, assetPath, true); + } catch { + EditorUtility.DisplayDialog("Error", "Failed to copy existing file " + exportModelPath + " to " + assetPath + + ". Please check the location and try again.", "Ok"); + return; + } AssetDatabase.ImportAsset(assetPath); // set model to Humanoid animation type and force another refresh on it to process Humanoid @@ -455,12 +449,21 @@ class AvatarExporter : MonoBehaviour { } // write out a new fst file in place of the old file - WriteFST(exportFstPath, projectName); + if (!WriteFST(exportFstPath, projectName)) { + return; + } + + // copy any external texture files to the project's texture directory that are + // considered dependencies of the model, and overwrite any existing ones + string texturesDirectory = Path.GetDirectoryName(exportFstPath) + "\\textures"; + if (!CopyExternalTextures(texturesDirectory, true)) { + return; + } // display success dialog with any bone rule warnings string successDialog = "Avatar successfully updated!"; - if (!string.IsNullOrEmpty(boneWarnings)) { - successDialog += "\n\nWarnings:\n" + boneWarnings; + if (!string.IsNullOrEmpty(warnings)) { + successDialog += "\n\nWarnings:\n" + warnings; } EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); } else { // Export New Avatar menu option @@ -469,33 +472,13 @@ class AvatarExporter : MonoBehaviour { Directory.CreateDirectory(hifiFolder); } - if (string.IsNullOrEmpty(boneWarnings)) { - boneWarnings = EMPTY_WARNING_TEXT; + if (string.IsNullOrEmpty(warnings)) { + warnings = EMPTY_WARNING_TEXT; } // open a popup window to enter new export project name and project location ExportProjectWindow window = ScriptableObject.CreateInstance(); - window.Init(hifiFolder, boneWarnings, OnExportProjectWindowClose); - } - } - - static void CopyExternalTextures(string texturesDirectory) { - List texturePaths = new List(); - - // build the list of all local asset paths for textures that Unity considers dependencies of the model - string[] dependencies = AssetDatabase.GetDependencies(assetPath); - foreach (string dependencyPath in dependencies) { - UnityEngine.Object textureObject = AssetDatabase.LoadAssetAtPath(dependencyPath, typeof(Texture2D)); - if (textureObject != null) { - texturePaths.Add(dependencyPath); - } - } - - // copy the found dependency textures from the local asset folder to the textures folder in the target export project - foreach (string texturePath in texturePaths) { - string textureName = Path.GetFileName(texturePath); - string targetPath = texturesDirectory + "\\" + textureName; - File.Copy(texturePath, targetPath); + window.Init(hifiFolder, warnings, OnExportProjectWindowClose); } } @@ -512,11 +495,15 @@ class AvatarExporter : MonoBehaviour { // write out the avatar.fst file to the project directory string exportFstPath = projectDirectory + "avatar.fst"; - WriteFST(exportFstPath, projectName); + if (!WriteFST(exportFstPath, projectName)) { + return; + } // copy any external texture files to the project's texture directory that are considered dependencies of the model texturesDirectory = texturesDirectory.Replace("\\\\", "\\"); - CopyExternalTextures(texturesDirectory); + if (!CopyExternalTextures(texturesDirectory, false)) { + return; + } // remove any double slashes in texture directory path, display success dialog with any // bone warnings previously mentioned, and suggest user to copy external textures over @@ -529,7 +516,7 @@ class AvatarExporter : MonoBehaviour { EditorUtility.DisplayDialog("Success!", successDialog, "Ok"); } - static void WriteFST(string exportFstPath, string projectName) { + static bool WriteFST(string exportFstPath, string projectName) { // write out core fields to top of fst file try { File.WriteAllText(exportFstPath, "name = " + projectName + "\ntype = body+head\nscale = 1\nfilename = " + @@ -537,7 +524,7 @@ class AvatarExporter : MonoBehaviour { } catch { EditorUtility.DisplayDialog("Error", "Failed to write file " + exportFstPath + ". Please check the location and try again.", "Ok"); - return; + return false; } // write out joint mappings to fst file @@ -596,6 +583,8 @@ class AvatarExporter : MonoBehaviour { // open File Explorer to the project directory once finished System.Diagnostics.Process.Start("explorer.exe", "/select," + exportFstPath); + + return true; } static void SetUserBoneInformation() { @@ -625,9 +614,6 @@ class AvatarExporter : MonoBehaviour { } } } - - // generate the list of bone rule failure strings for any bone rules that are not satisfied by this avatar - SetFailedBoneRules(); } static void TraverseUserBoneTree(Transform modelBone) { @@ -675,6 +661,29 @@ class AvatarExporter : MonoBehaviour { return result; } + static void AdjustUpperChestMapping() { + if (!humanoidToUserBoneMappings.ContainsKey("UpperChest")) { + // if parent of Neck is not Chest then map the parent to UpperChest + string neckUserBone; + if (humanoidToUserBoneMappings.TryGetValue("Neck", out neckUserBone)) { + UserBoneInformation neckParentBoneInfo; + string neckParentUserBone = userBoneInfos[neckUserBone].parentName; + if (userBoneInfos.TryGetValue(neckParentUserBone, out neckParentBoneInfo) && !neckParentBoneInfo.HasHumanMapping()) { + neckParentBoneInfo.humanName = "UpperChest"; + humanoidToUserBoneMappings.Add("UpperChest", neckParentUserBone); + } + } + // if there is still no UpperChest bone but there is a Chest bone then we remap Chest to UpperChest + string chestUserBone; + if (!humanoidToUserBoneMappings.ContainsKey("UpperChest") && + humanoidToUserBoneMappings.TryGetValue("Chest", out chestUserBone)) { + userBoneInfos[chestUserBone].humanName = "UpperChest"; + humanoidToUserBoneMappings.Remove("Chest"); + humanoidToUserBoneMappings.Add("UpperChest", chestUserBone); + } + } + } + static void SetFailedBoneRules() { failedBoneRules.Clear(); @@ -888,6 +897,43 @@ class AvatarExporter : MonoBehaviour { appendage + " (" + rightCount + ")."); } } + + static string SetTextureDependencies() { + string textureWarnings = ""; + dependencyTextures.Clear(); + + // build the list of all local asset paths for textures that Unity considers dependencies of the model + // for any textures that have duplicate names, return a string of duplicate name warnings + string[] dependencies = AssetDatabase.GetDependencies(assetPath); + foreach (string dependencyPath in dependencies) { + UnityEngine.Object textureObject = AssetDatabase.LoadAssetAtPath(dependencyPath, typeof(Texture2D)); + if (textureObject != null) { + string textureName = Path.GetFileName(dependencyPath); + if (dependencyTextures.ContainsKey(textureName)) { + textureWarnings += "There is more than one texture with the name " + textureName + ".\n\n"; + } else { + dependencyTextures.Add(textureName, dependencyPath); + } + } + } + + return textureWarnings; + } + + static bool CopyExternalTextures(string texturesDirectory, bool overwriteExisting) { + // copy the found dependency textures from the local asset folder to the textures folder in the target export project + foreach (var texture in dependencyTextures) { + string targetPath = texturesDirectory + "\\" + texture.Key; + try { + File.Copy(texture.Value, targetPath, overwriteExisting); + } catch { + EditorUtility.DisplayDialog("Error", "Failed to copy texture file " + texture.Value + " to " + targetPath + + ". Please check the location and try again.", "Ok"); + return false; + } + } + return true; + } } class ExportProjectWindow : EditorWindow { diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index 96a801496686bfb8536dc9fd97d65d8e68868791..3c331ce9e0b03e35850ca6138b53a5689e0e8db0 100644 GIT binary patch literal 13655 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 Date: Thu, 14 Feb 2019 17:51:32 -0800 Subject: [PATCH 3/4] always overwrite, tweak warning --- .../Assets/Editor/AvatarExporter.cs | 14 +++++++------- .../avatarExporter.unitypackage | Bin 13655 -> 13638 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 624b365c17..1ee1596373 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -453,10 +453,9 @@ class AvatarExporter : MonoBehaviour { return; } - // copy any external texture files to the project's texture directory that are - // considered dependencies of the model, and overwrite any existing ones + // copy any external texture files to the project's texture directory that are considered dependencies of the model string texturesDirectory = Path.GetDirectoryName(exportFstPath) + "\\textures"; - if (!CopyExternalTextures(texturesDirectory, true)) { + if (!CopyExternalTextures(texturesDirectory)) { return; } @@ -501,7 +500,7 @@ class AvatarExporter : MonoBehaviour { // copy any external texture files to the project's texture directory that are considered dependencies of the model texturesDirectory = texturesDirectory.Replace("\\\\", "\\"); - if (!CopyExternalTextures(texturesDirectory, false)) { + if (!CopyExternalTextures(texturesDirectory)) { return; } @@ -910,7 +909,8 @@ class AvatarExporter : MonoBehaviour { if (textureObject != null) { string textureName = Path.GetFileName(dependencyPath); if (dependencyTextures.ContainsKey(textureName)) { - textureWarnings += "There is more than one texture with the name " + textureName + ".\n\n"; + textureWarnings += "There is more than one texture with the name " + textureName + + " referenced in the selected avatar.\n\n"; } else { dependencyTextures.Add(textureName, dependencyPath); } @@ -920,12 +920,12 @@ class AvatarExporter : MonoBehaviour { return textureWarnings; } - static bool CopyExternalTextures(string texturesDirectory, bool overwriteExisting) { + static bool CopyExternalTextures(string texturesDirectory) { // copy the found dependency textures from the local asset folder to the textures folder in the target export project foreach (var texture in dependencyTextures) { string targetPath = texturesDirectory + "\\" + texture.Key; try { - File.Copy(texture.Value, targetPath, overwriteExisting); + File.Copy(texture.Value, targetPath, true); } catch { EditorUtility.DisplayDialog("Error", "Failed to copy texture file " + texture.Value + " to " + targetPath + ". Please check the location and try again.", "Ok"); diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index 3c331ce9e0b03e35850ca6138b53a5689e0e8db0..86a47f744e43c7bd7fe88539c3c8de4901f68606 100644 GIT binary patch delta 12560 zcmV+rG4IaTYQ}1RABzYG=^AES1OQ=jV`y|`ZE!AhVR8WM9ocf*z%8%!S1@{L>_(AA zQD@w=ak-1d0$2cx zy_&hl&%JLyd;HUEwwt|P5B}0){1w0bpdI*azY}!)XHDOKZ}!^Hyw0=l@GR3TTs#8| z{x_eM{GW%}%`Ci)o;~~lpey*_&GEn0^_$PU@4}P+asKb7X_TeU{{Q@sKB$|6$#~Rh z`TbtYZ;$$IzkfAqhP_G9??tVDjs9=J&;RTH@A0hUe~1d=*`uCP{qJ`=LARy&?{^`8 z&}#i(|9_W%=kI_0+xE8S?S2V?48yPUWRXRS#wgv`-rm3udy6Q{qOo^%@9l?Q;<5L$ zaP-+rW?rlB9VcJBR@3jZjLH0d5ntbAl;pjKpWfSe98KfwzV02&MhyXSKTfkne6>Wd z%h@w?F#{}zv+H;k z?HEbpI7=2H>FhquqFeK=ad47L*h{9h^c;=lBclVEml#yxz(a++M2P_^Zv*|s&FR&rIzuGjW^FCVm+wwbE{^vvj}DG6e+wm>jix`@ zSykxl!@=?Ja_{}{?3_xT4L|Ij?w&*C3`7wOXk6wU?f&NA=;G+|;tX*9*$Dyy6waY! ztJB>nYw+;s!})J7f4zHpd~p2k@_hIkEL1yAW)W|!;LG{R{>f`^nMMHOI{I1y^Y@>B zfZBT}M@Pfs{o(%Q#qj~uzzKN<&}Y$|%!z#GPYpXyqt)~&eZ0lWu^L!fh(2TW~cU?saCs$g;vpM*m#fyNS}QR`+UWbI_Q6?OR>@_#QBUZ}d0!C7!47h5njf4x>rt z9e^$PO4cEqLN-c#AI`><9uyUT|3Q`BM&lT?omH$=SnR_h`5NCkYVsXL4&y9;n??@Y zKE$)n_d#I^139Z)tFWBJ&MM==?kFCQo!GGtK|zrc^w{TCQ9*^DUC4#tDM*k5JxmUY zvfHSsLal;A60Ljz7gFapU{xJhQF>5Rpb#(m+A1n0F|&#|P#fMOWbxDf{x(Ul_sQQz z4hdba$4p$-tge-@^W z242kP26FJznMokV-!0URqtR#hOn=QUr{JDi8i%DSl~Y*65CXektFWLH1G|uK7qayZ zOIC`fxQrV`rFx1>N*wJ{4jgUmL&>)Ku?v+U$-Xw`OB7=ynF}$(BY_?wi_wKw(JJ9Q6B8c7TwA zM$j9y+ui7u--34-#5B9jAb?k@)qu&oS{o(+X|{tw+lNw31PVioUeIfH8MYl5%C!c) z4q$78wB2DBApqxox7q1YYukfnzuE6&Mfl>kT7v<-V9S~Te6eb9*)qEx0vEIgErgBG zx~+hy@`_&CK@(|z!g6){LC3BqZ~6-A=yzL#fY;&oIt(nm1i(m92k^daw#D|)3#({0 zJ6%?T4|sQE4TDb5?C~1<9jLmbhSlT(wgkOai?gNEZgo16EuDV9Cu(iCgI2q^qB43h zK6F}rUP%uiNiOt)c30HV>I}MFyAEbVSCFgU^ZWe{r&lX~Xg8?}dg(Nq*glpk2>L-$ z6_x1a_xx^$)2rX=^{H8}=%v+dw?wVoZnHZmu4t8fbvlEAkm0u9gbD>8f^JW8r~~{r zW!N6V6m^nr(DZo)gI>4Yk)6cv5!aav`kij8sDcW_YWAV0bU5Du^^WZGD8{l;op!I; zE2?IdXte-;{}yja6Ka&Q)dN)`Uk2^IZ}Y<*SlKmnyTEdS3gN_lA4tb(6?B_`w~*dJ zvj-}&u!hyd>H^?yiz!HdFo0f9Y`{uE6A%?KR{*br98c__TVY$eAV0h1`ejY7a(x{yCtk!&}#!T)k`mD>dZl` z+o1p<5Bklv;8rv6JMB(C;BLeKM4kNxtrzsbPT4Z4M!e1%f_@t~#%)il15zU7qSNbj zdy+JNz|Sq`h`9*w7LvKmv`)|W12B&4ce4f3HxS$e@d;R8wa3tj?ze+Z4;WlIp5fw2+wTdQ zU_Hv~YPSMm`SF=-RSJICRX{^}0%IIr^pw}tY)a!F1Wn-0R)tWBgIL{Ox65rWaHBha zP)=7L9!@OiIXJYb99OYh;&*#6^UuKr0T?LhbM@HZiZY>tKiR4jgmH*g7rH`65XJ8? zKY~$c&>09a_6B|Eg)1XAIrv=g{T@fP*#fJkh9zB+X_7urguso80UnoF0iOlWK~5#h z{Q%4yZ(XN}-d2TZkOO{8(PGdA_Dg4f3*1!Uumbr|Y*)vQa`4I50`)I^EnrDc`dU6P znzLsBy&W34RW;INS2GBt_4fxL#iAWx{0Dq6)D2*92da@OVJSyLU@Xw{g`*Ytny1wP zy77jTE1iumuK2zG(ZXMPqCx77`#p9QW%XQ2G7R!doY z=oKv&Crdmna1PE4&ClYp*M#Lu=ubP~ zmiSrBwQ7?l;lEpf@~ntf{Aa6^>k8!oV3W}c^#waT+4}{P%M679Rg+N-p#-rG<0q5$ z4J!fhvmy?U0e`=avl|e|;nxhdK%w=Q6>9*F5|Gk^TfQyn)_8kkenr^3R9=Gw7?`C^U?p13`^#VQNPwaPzX2ub(fpiwSP843B2z6k8qG6MZG^L! znbY(8dE`CMk#AT3+91>L$VO$XB`;D>!uAk2HcE{Jn16!V@Ya25wC4^YjZo8wU?(`N zfZ7gb>6|=I7^ls~$z5gAiJz7o1W_|dna`l0oJE<_0hc+1UCx-L{52arGA);J^SLkV zX&j}N&&S8I*SLcZbSRNw3Kk05kG>llqmq{aka%q@qzGFRDMx-BJWDb!1w7M9OdBfM zm?$LWtbaG`t?s!LV>Y^h-~r0t9aN72J%9x<14acu#wEHBCmJS!qS91lypZ1T^|b z(%*svLjwEcjj1!#HRza`ZGD7T#&kK3kPB?UYky$}^~|TsREUO*Ea*`NtPTqEnsP!# z5Qhv&H(v8B+n_t33&Oe3v@*bFf+=U`+utmZ@=czb~NLM(rk^#Ga|=!##${0ca-oe1G@j z1^E#74XQHTluZMSeyTV0b-tk{^t_ZNVA^S;JDQs*C|>A-(In&sD@zEpH|K=$CIk|Y zqY#9u3UUg+5$JFY&ekL)cahP~(LiqA-lp8S&&l8k;DxUFhj126H*04McEf;LtLsz( zp@gqWDi!~Xn)Cq|Ve{7aL9o9>?o*!9T(wCeT!T{vzLl;QmW&3O9#x-`B z8O$)DTSDi`gfo?kehM|ts&N1orT~1lFK}$kD?C0W#F7|%`b->V+K!-6UIb5`A0}bd zEXe}C4;t(|zGaal*2G^gVwT2r5YiRh8kuf~Yixk5QI#R;6jpHaJb!WF_!DPEWy&t$ z1N*XWv!qa|Qt5>M$w`^zXaf1Kvks&X$6N2n;^bPj~SQ%NMif$;?s7|j>RokR_ z*WdD$RQ8y$P{e-xoqt8_5q!@}k}b3qMX~|KD%AQYF+(c>*T3%V#nRv0Ea)L`e)qI-A_%}p3+kdsO`%w*Y%MS4%k7t$l z0|7(|`&RaVs>&VLdhRDTTf>6YlvZM^)l(vsDwuD??n4>Y&+g~s?&08Lguf`jiM#$G zsCnZ-ju_Pf%JC>lQwgG|&ZnK}$vT>XfDwqDd&|p}O z)H$o-sa%RhL{32>7370_i~_$>;0}0Wi`Mp$HD`oOUVo800-ix-hjVR{FVya8k$8xM z`3*X$N>HYrQAsl01E>+3A)DPBR-DhLh1ZLS%$+p(kuvD2mz#OYgEG?EE}a^_UnF^xftK^)jT50ioreQNrwfl+6J zQk+si5r5ONxI`H+B>*|AfQ@BIYQ1JMnNV-c5|bkp;+iB;`_!I%0P~*|?vnlEKP23h z=NiKu7RWHpO6H?AVPmUgB8FG=!JfjSQR>^XbCcqAJ^G1JtcnQgZ!T5FRTi%04X0un zlrTey(T6cF)D-tvgzDsK1UVfKY#eLrAb4|`nSYS=+Y2gE8U0%;A}C5bf`HFa6ApR9 z!~(}ntGXv5C7-f|^%5g=mHGTEjhxK|9CBLJK@3rv^$(nVVDn`neFAg3_u?St=e3=u znEo}ZeEEjO1>|II^{L#_o_@w^d0wlV70TY0ch!)lYAI>)yrGh1+7;sECMs9X$FUD= zZ+`Pj&#VsYdm>q)Xj9nK|I>O@9+ubG&*XJ+7H8fv{=LD@p;VJ0=`OnnVrR zxiZY;@VRrUTPf^~mD4eKJPYPr)^R%Z6=!yrjZlI;p`lS;7}sTEa41%-HMTLa+hZAy zybh+iD}Z1b5yI-uZkwGdrShnlbhLdABobc$*bt7#nv%fHYeAzGY-shPotENNuzwr> z4o-?gnCvvUR-yJ09`qjJf8f(ocp}y4!`4p`g~rM93db3+Wa=iOUSrc@j%-=wu4wSd zbCLQ8w^`!d5-Ip0Xh385IHph(fVzgA?rd`(9|GDuOIeWQA#M)|7WzHtpX9_(qW9co z;*hT8F3(DL=i5ecVc7B-z4i_!6n|I=7yKwxr^u#6Va&)^#n-*kxtiLX4Ow87JCp_) z1$!c4afzP8>R&#Tw#9R&+8&ci?peL`>`tkp<+V|bJd!s=D}@nXK8n$BS|~Wae|ZC|E=lOeR+~;1BdfO^-l2P}dqpd(}N_dkoDe`2@q}M@Lnd0?RMn`&MqmauE$^kYv4c z<+HIt5p7s<7#at;(ylWq7_U5`5!H(VMboOVo`B~$!68rXAB=DGe8En$fx|3 zT42o>G{k4eB6l5-Y##7i2Z>y>IVN*6hRN54*eI(Wd(y#_C&!T65I0zHb`OCI;`F9o zZJp?*=XHq~Iw%nHT1J&eWojF?1b)idqPJ9SUw5v`GIo!fvZKD(ZGYEGf!HnZz!_*& z$?_^z0w*;vGbRz<gOI36=<;>tdNH6C#azSGiJ6%W8R|jblO;rE^3S1l* zZ90W$3j}1bo|Ic8F%;pGA+}RsC~4=$Y4pcs4CAd2B=WR|a5g^FKJ3m$FltB;uBkB# zW(OTWpIf@e?(SLmnU*!l0SxaMXxNknh@q>q0Ly5(K-lE(z<*o~ZPSUon~+9YtdB5y zQH7NW@LtG;r4#JDpO_RWUX{qEUHY_KT8mIqB3mXMKYCMK<0EI!(z|fZLR(Wf^Y;}j zUck*gn-t^PLJtEkg;eS9h-N|>Dyj9Il zrDr1-ohIUVL)xNK5(R}R)De!5W^sC>_OFO-Rxq@>o+T-aaMQ*Iw)ClS2Jwh&vnDqG zG@`F`&&oF24pYyKv+R(k8V=C}{7y+MxoGi=E_bHWxqk*mdl$ASLJFM z!z^m3z}1;YIgX$sC->SC3;jmc2AfIXxSd8RL}Nygb!@_65{@CoUb9xGb#uvN(}t<< z7kmdK;eRzzQT2`;PQ7g%C`xXcIBo5iWIyLLywF&-nFHPcLeEl^8eUoz-)CewxMhd* zSw)LDosnlrkvsF!A7TxkkJOf;#W)bpXzTO>!v{+Pt z>Xma!g8A|b)TnUCZ$+nEd<;q%3dWz9;2M0&;(wxr^tW)tsh`wEIW<#WVSq{{)Dcvx zVi4u-Gjw?vREE%BAq*hD6k4*EFHOHhFYu|MA0+1X&q};*V{l9aQ6pp3AcdIyl%b}R zynxyj)Z^}WtfOX-tGZ+Jt>9=KcMm=nJ(k6UF`WotE0SwXhp5aAmAtdzI?{oi43Wud z;C}^Hr$BLU#6$x{3f7o{YMY{WRma^*BLKPxNzX$tl+LpiT~%$?rBdD-g&1v2#FfwXzd0IIdX=HwD_;DY@j=!y8aa<8CJfd=TAQ{$=cj8O7~pR!fIEGzj8 ztc$=u;NCKvQh18$XZ^(XX<%j}k@Jakf{g$drhGUmE3WEliS}+G*~Fgh_)igGLw`6x z&hnU(9+Kl|?39-3S7UCpplom^cn0Hpr9YdTWWv-pF z55zT%H@Z9IZQ^)3rb9&G&yO{BP=9uQV(ZJ7vFLfF&Z{g!;9soDGbf3tOAh5a~%bp^KQ4lcoxjAiZ#*3mPxKkUvB~cAG@qE zEYL;cK_dh6mIkJX{$A3h{DewmO1qwu0$5Lx<=lUAo+ zHNr2Zygs_8A@4TUAg3Yu1cQmbiQJZ2EV9Bf8^u1Y!S)gyPjP9LL~m=YvX;2y8kRHg zD=i-BO8YcFLrqT1Z+5KDKKN;#3XI%G&!u=oeQ6ffuJSCnoTea$_0Mln<^iARKy>^fykxU21hiaUZ3KCgszCLaa@#OgeB52|;Hu#52 z#>5I#(_fND@?G&CJv~ddemP~~Vr~J@u9%OitK8A}_(@hM@aWT5Nr^S3~F{xCP6p6R4wxZRgkEvWq zWr|kV#O0qMMt}C*KkJASngunYQ-iZCG1(^xWlPoL7blj6z^o;Gg}dji8&t5cy%15) zQGQ4p&snKcn7c8cYI!z}YzzFXt)w&iuJllY`wV4xnjO+`R+X&;k1HKRFCLO>d-<_Wk?c%b^I-U6SWw`51< zMp}eKPJbhyw?s7MXFx}I7OmKT#1DN}c7;dntj8YbQUKbqBDLB&F#=JkiProC6qRpw zBu)pMn|D}k6Lrv*gZt*qYGV$MNgX#txIsiNS$JAwwc0`&N9CyKm?OZB&Y8>6wj5Gt zn2w#iF~R!}bAl*_qxVt9Yo*W}pZ}#9FfN}sihm+3j4Knohsql<#TD{bUn_+D*Ykh8 z100)*_E1y93-N7gKdED1-K7j()wc^v58g&Dx6TNB{ z4}m-i3%s1N)H{Ih>zZMJ`AC<=b?NC7Fi~p^yfLfyC`8rut9k6y(iK`A4H;QJpkdXR z{eK}Vrx3JZ(-P|k0YBvh%TDxsZeWfpfu5W73FTA-z%2j6AFfk=O;)}* zY7a3-+9{^bEn583NC9&5?@Ea$Z)39fH|6|O8@Ak~&P4$;wf{U)tGIrv)~B(ya9SzH z8=-rfv^Gw}dA7)l&p>g$&8fRne=pF0Onip+kVp5+G-m;I>H_FDk1Qnn&xPJ(i z{Zg*)lx}08s65R=LLDS2XAs#LUhcggo}H7poDDzhp3)w#HT#k|dPP&>&L><}m9LPM z|AbCUSQhqL`dXpex*$`#3L(?i3Xt_l?DK^2@QtY^Ua>~3p(i*{KJZSMK)lI=k?>hl z)_{*fp%BK2foqu6#7pmfyh_Lz|9^`g1Lt)B|0im_dfo`i9&Odj=<;+GgT`=GPGq+# zX9Dt6mFIN*NNU&cJ1hG01ggY0ifvus{NrJK8)vVJu6mGt+%-v-HrT}2%86q!D|WQ| zn}ef^qsxo4;VHX1aSx36`Qs*#y$l-#E7@_w|DN>VaD{3rl-+cV!?&{T0%(4^*4(wGobz^Im*wcgDDcOs~W5K0U z$B?ArfA&D3@)}labCh{>h_!KRJwcLV9ORw>9(netaA|(gua0WzM%OA~mO?)2wW!2# z9*AJ_$`dpNxQCup=Rn}Xl7FNJ34_%pDHLXH>ouT2?5$HGa{1&^_S|y5r`=?v7WJ`J z_v{8VwLqiFB76_@V9Yo27=Tlc)@Oh)GvPK@=Tl*J9{|9R7XawA20cu<@~idpq%jYs zsJ>#Ff2n$AP_Ej_C-?|N?DB641qv^gdsBHUUDBW#c5b8eNz}}V zjj2V8ky#@IRwPftVOVV@^tBF^4E^sviOIFI3asQbmzzRHaj_ku_aE?reWlgopi;HDxpJyXy3Auw&^4{eM6_=5}?;MbM zd9wQ+HFc+^y=Y!QfRYx)i@X#Do}XQBH&osqEk5A_`YJcOtLqI!K^mjgd41|it$*5$ zNW>Igxqmv;*}z7>O-tdmmSuZ_)1LDuKCgCw90#I7U}7`{sdC;5@|qKmy)xR8HOk0E z|MkJ~{>iT|e|@lj{vL#&(`@dzbG#oOynBBRS=wDI%g-*(&rgmo-=4ssMP~=U8$vF> zo6mH(`?KNUiadDo{N>w&;o-iSv0a=|A=a|+8h@Uio}8MHTKPQU(EGE!)04wP1bFk*<{tu?%MaUu+MZmW{I1%ISN*R|$tJUfF^WpZTEdr#f$DXOF6gusK# zW^p!+&{e=wTg2ud>yjsBlWn=uDIl|%B4J zK)C1Xw!aBZ@Le1LL+<%ispL<;gCt-DU4Jvh)}-?bZ{(B!W;ugGw80+^Fvs7Vvhvd= z{D4!@LFuwQiky0(#ssL!_+lxr9lN?|coj{{Yojb$W%Qn}i|N7As*ug)HDQjoc-e!h zjY{P!b1GC<5sYPw-$(3ZFk8FYNHXP9i5}85V`cI<=C$;WEBg#1-cxG#UIM3yLVq#( z+kgXXoCWS+2m7xVcwix!O1l9<=ABJYfHd?)i4_>#!x?4C9j{QY_AtDM*feZx!K-il zX2C%7gSrQd3mrKU@oc_igClm!hXe2-W(If2zEA9Rt*!~9syJt%6sU6{Uz@s)rs_2i zk8GiEl%ArM0#w&-VzPEOOOqj`23Drg2ECv0&1_$!;j-^kHL6EKXsm5nWq6)f9d)2N_^_n}5`c?H6_L z#mA2?DjbBYbMG`7GtI#yhjM3j_x*{ zCF)v%U&rI@#_*uF>Q$#zTz`*(%xvJMb5yWZ!bQ!WvIt?9fx}9)=01wqOcC<#jiKyn`ME*_<ALFi2VXQ^vDvX1a*4L%oJN7l&8)qgoq-~eyhqZq?9 zYW!bQ{jiJL1q1P1H=;b7NH>U2@jTiX%8^<@NCvrtkct2+Pd)rK+N3DPU8S0R_C^qL zgbi&h{2`*&TtV`C+{f`4CSIsvEF1gG!(t;Cw0#D`2{{h0;6$Q)yBbst-?$PvZ+Xx0 zn*^|zMQv}1qUT8duX4xZZh_!OBqiz z`;YcrGqLs=e(2yzWpKMp`D_B-S`+_q8FBr9?xMJKJ-ZR9Ora=kfsA(D#cy5qn{Q}N z`fSS9c14wT?3x3sG=*P-;UwTX<`?Rx?C_XSc`p#kmXW(8fqy?C22`S<=OoMCzK`o&7l=Z6LCXy`BD6gIAUt9hj{_9?g|)qu?u zcC(GlP`9pbmVdZVKVw%&T}2f25I28{GGZ*npK>;j@Q6O~2Xf^?FbjJ^8=Qpc_2%gSOvpLe91i`P;tVedaZv zeTQd>=IL4UyVUh>_+W71EiLI4M@)LHjq7DRe(kLijg6yZmK@yDEzb+sv>|U#W~&?0 z*WRD8TYtg=Ep{sYSgXMkF6*h7_lNAi|3pCGjB~mM3y%Q>EFdi&VW~gU6-JQtU>}kJ zG_9<}fR|UitVR?Eew;KQ9dS z^?yG=f|>uvpdq_W!!#bf+-2N3B>f}-MKR4{o|NM^`|D#Yx z|C<YH z@Bd&C;rGAqoB4kf`Uoy35Hvv=fq8IONV5uXLS)qw{d6t9Lof6>ee@v2=M|Qcgn$lmdV|n*f@d0K`x?Up??Vd zu&^e6ByUvS5qZh0zj&1qG z`3~~w@rx#5|;(UQ6Xqi5k37FDp=W5+B@`fInTr}4lKudJV zY>=(8u_qhhEx-ZP$9Eeq&2{aLI4F6IrYGF->0$i?d%9#Z!MK3pha=tdO@DB=lugP$ z68YS@w!c7=c{`Zknrln7LgNdNxOw0Q+Q4}NffMv-$yxB=qC=^aKY0j zpyf;j3^`}E)lYM^*)?C=I)A1w!Q8#*VyWjwoD`>A0&3gD9afa)#TrNP;mE)y5h{)_ zyzrpmKLaMTk3whC#^<=sL3rCzOt-8Sf%Kd7VM|edWe(vqtO8Wlc#Io3Rt))s`#?lA zPq#cyqj5C3uWLxqFrPy~MeYH}nZz-Hm(yIZI|I|#OuPW_`O&f>f}+@|2%hp{SQu> m@jnL1^}nyn%d1aIQa_*gsc*=TAwz~<2>k+Bsr=Fa5CH&Pi?nF~ delta 12576 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 CG=KsC From 348ac3167ffb8ba20a25e86b5a6a69407598d36d Mon Sep 17 00:00:00 2001 From: David Back Date: Fri, 15 Feb 2019 12:58:30 -0800 Subject: [PATCH 4/4] move failed bone rules call, add get texture directory --- .../Assets/Editor/AvatarExporter.cs | 19 +++++++++++------- .../avatarExporter.unitypackage | Bin 13638 -> 13667 bytes 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 1ee1596373..7b90145223 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -307,9 +307,6 @@ class AvatarExporter : MonoBehaviour { SetUserBoneInformation(); string textureWarnings = SetTextureDependencies(); - // generate the list of bone rule failure strings for any bone rules that are not satisfied by this avatar - SetFailedBoneRules(); - // check if we should be substituting a bone for a missing UpperChest mapping AdjustUpperChestMapping(); @@ -454,7 +451,7 @@ class AvatarExporter : MonoBehaviour { } // copy any external texture files to the project's texture directory that are considered dependencies of the model - string texturesDirectory = Path.GetDirectoryName(exportFstPath) + "\\textures"; + string texturesDirectory = GetTextureDirectory(exportFstPath); if (!CopyExternalTextures(texturesDirectory)) { return; } @@ -487,7 +484,7 @@ class AvatarExporter : MonoBehaviour { File.Copy(assetPath, exportModelPath); // create empty Textures and Scripts folders in the project directory - string texturesDirectory = projectDirectory + "\\textures"; + string texturesDirectory = GetTextureDirectory(projectDirectory); string scriptsDirectory = projectDirectory + "\\scripts"; Directory.CreateDirectory(texturesDirectory); Directory.CreateDirectory(scriptsDirectory); @@ -499,7 +496,6 @@ class AvatarExporter : MonoBehaviour { } // copy any external texture files to the project's texture directory that are considered dependencies of the model - texturesDirectory = texturesDirectory.Replace("\\\\", "\\"); if (!CopyExternalTextures(texturesDirectory)) { return; } @@ -613,6 +609,9 @@ class AvatarExporter : MonoBehaviour { } } } + + // generate the list of bone rule failure strings for any bone rules that are not satisfied by this avatar + SetFailedBoneRules(); } static void TraverseUserBoneTree(Transform modelBone) { @@ -897,6 +896,12 @@ class AvatarExporter : MonoBehaviour { } } + static string GetTextureDirectory(string basePath) { + string textureDirectory = Path.GetDirectoryName(basePath) + "\\textures"; + textureDirectory = textureDirectory.Replace("\\\\", "\\"); + return textureDirectory; + } + static string SetTextureDependencies() { string textureWarnings = ""; dependencyTextures.Clear(); @@ -910,7 +915,7 @@ class AvatarExporter : MonoBehaviour { string textureName = Path.GetFileName(dependencyPath); if (dependencyTextures.ContainsKey(textureName)) { textureWarnings += "There is more than one texture with the name " + textureName + - " referenced in the selected avatar.\n\n"; + " referenced in the selected avatar.\n\n"; } else { dependencyTextures.Add(textureName, dependencyPath); } diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index 86a47f744e43c7bd7fe88539c3c8de4901f68606..95c000e7c61b7623e0da0a1f9974e0744375014e 100644 GIT binary patch literal 13667 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 B&65BC literal 13638 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