From d063825269485e8ea09e937fd6e39dd2a17c41ca Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 6 Mar 2019 12:17:19 -0800 Subject: [PATCH 1/3] export unity material data to materialMap in fst --- .../Assets/Editor/AvatarExporter.cs | 430 +++++++++++++----- tools/unity-avatar-exporter/Assets/README.txt | 2 +- .../avatarExporter.unitypackage | Bin 13667 -> 15949 bytes 3 files changed, 317 insertions(+), 115 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 7b90145223..40994c8f46 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -14,12 +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.2"; + static readonly string AVATAR_EXPORTER_VERSION = "0.3.1"; 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"; + static readonly string TEXTURES_DIRECTORY = "textures"; + static readonly string DEFAULT_MATERIAL_NAME = "No Name"; // TODO: use regex static readonly string[] RECOMMENDED_UNITY_VERSIONS = new string[] { @@ -195,8 +197,17 @@ class AvatarExporter : MonoBehaviour { " Thumb Intermediate", " Thumb Proximal", }; + + static readonly string STANDARD_SHADER = "Standard"; + static readonly string STANDARD_ROUGHNESS_SHADER = "Standard (Roughness setup)"; + static readonly string STANDARD_SPECULAR_SHADER = "Standard (Specular setup)"; + static readonly string[] SUPPORTED_SHADERS = new string[] { + STANDARD_SHADER, + STANDARD_ROUGHNESS_SHADER, + STANDARD_SPECULAR_SHADER, + }; - enum BoneRule { + enum AvatarRule { RecommendedUnityVersion, SingleRoot, NoDuplicateMapping, @@ -215,14 +226,14 @@ class AvatarExporter : MonoBehaviour { HipsNotOnGround, HipsSpineChestNotCoincident, TotalBoneCountUnderLimit, - BoneRuleEnd, + AvatarRuleEnd, }; // rules that are treated as errors and prevent exporting, otherwise rules will show as warnings - static readonly BoneRule[] EXPORT_BLOCKING_BONE_RULES = new BoneRule[] { - BoneRule.HipsMapped, - BoneRule.SpineMapped, - BoneRule.ChestMapped, - BoneRule.HeadMapped, + static readonly AvatarRule[] EXPORT_BLOCKING_AVATAR_RULES = new AvatarRule[] { + AvatarRule.HipsMapped, + AvatarRule.SpineMapped, + AvatarRule.ChestMapped, + AvatarRule.HeadMapped, }; class UserBoneInformation { @@ -255,15 +266,67 @@ class AvatarExporter : MonoBehaviour { } } - static Dictionary userBoneInfos = new Dictionary(); - static Dictionary humanoidToUserBoneMappings = new Dictionary(); - static BoneTreeNode userBoneTree = new BoneTreeNode(); - static Dictionary failedBoneRules = new Dictionary(); + class MaterialData { + public Color albedo; + public string albedoMap; + public double metallic; + public string metallicMap; + public double roughness; + public string roughnessMap; + public string normalMap; + public string heightMap; + public string occlusionMap; + public Color emissive; + public string emissiveMap; + + public string getJSON() { + string json = "{ \"materialVersion\": 1, \"materials\": { "; + json += "\"albedo\": [" + albedo.r + ", " + albedo.g + ", " + albedo.b + "], "; + if (!string.IsNullOrEmpty(albedoMap)) { + json += "\"albedoMap\": \"" + albedoMap + "\", "; + } + json += "\"metallic\": " + metallic + ", "; + if (!string.IsNullOrEmpty(metallicMap)) { + json += "\"metallicMap\": \"" + metallicMap + "\", "; + } + json += "\"roughness\": " + roughness + ", "; + if (!string.IsNullOrEmpty(roughnessMap)) { + json += "\"roughnessMap\": \"" + roughnessMap + "\", "; + } + if (!string.IsNullOrEmpty(normalMap)) { + json += "\"normalMap\": \"" + normalMap + "\", "; + } + if (!string.IsNullOrEmpty(heightMap)) { + json += "\"heightMap\": \"" + heightMap + "\", "; + } + if (!string.IsNullOrEmpty(occlusionMap)) { + json += "\"occlusionMap\": \"" + occlusionMap + "\", "; + } + json += "\"emissive\": [" + emissive.r + ", " + emissive.g + ", " + emissive.b + "] "; + if (!string.IsNullOrEmpty(emissiveMap)) { + json += "\", emissiveMap\": \"" + emissiveMap + "\""; + } + json += "} }"; + return json; + } + } static string assetPath = ""; static string assetName = ""; + + static ModelImporter modelImporter; static HumanDescription humanDescription; - static Dictionary dependencyTextures = new Dictionary(); + static Dictionary userBoneInfos = new Dictionary(); + static Dictionary humanoidToUserBoneMappings = new Dictionary(); + static BoneTreeNode userBoneTree = new BoneTreeNode(); + static Dictionary failedAvatarRules = new Dictionary(); + + static Dictionary textureDependencies = new Dictionary(); + static Dictionary materialMappings = new Dictionary(); + static Dictionary materialDatas = new Dictionary(); + static List materialAlternateStandardShader = new List(); + static Dictionary materialUnsupportedShader = new Dictionary(); + static List normalMapAndHeightMapNotBoth = new List(); [MenuItem("High Fidelity/Export New Avatar")] static void ExportNewAvatar() { @@ -280,7 +343,10 @@ class AvatarExporter : MonoBehaviour { EditorUtility.DisplayDialog("About", "High Fidelity, Inc.\nAvatar Exporter\nVersion " + AVATAR_EXPORTER_VERSION, "Ok"); } - static void ExportSelectedAvatar(bool updateAvatar) { + static void ExportSelectedAvatar(bool updateAvatar) { + // ensure everything is saved to file before exporting + AssetDatabase.SaveAssets(); + string[] guids = Selection.assetGUIDs; if (guids.Length != 1) { if (guids.Length == 0) { @@ -292,7 +358,7 @@ class AvatarExporter : MonoBehaviour { } assetPath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]); assetName = Path.GetFileNameWithoutExtension(assetPath); - ModelImporter modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter; + modelImporter = ModelImporter.GetAtPath(assetPath) as ModelImporter; if (Path.GetExtension(assetPath).ToLower() != ".fbx" || modelImporter == null) { EditorUtility.DisplayDialog("Error", "Please select an .fbx model asset to export.", "Ok"); return; @@ -302,26 +368,37 @@ class AvatarExporter : MonoBehaviour { " the Rig section of it's Inspector window.", "Ok"); return; } - + humanDescription = modelImporter.humanDescription; - SetUserBoneInformation(); string textureWarnings = SetTextureDependencies(); + SetBoneAndMaterialInformation(); // 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 plus texture warnings as warnings in the dialog + // format resulting avatar rule failure strings + // consider export-blocking avatar rules to be errors and show them in an error dialog, + // and also include any other avatar rule failures plus texture warnings as warnings in the dialog string boneErrors = ""; string warnings = ""; - foreach (var failedBoneRule in failedBoneRules) { - if (Array.IndexOf(EXPORT_BLOCKING_BONE_RULES, failedBoneRule.Key) >= 0) { - boneErrors += failedBoneRule.Value + "\n\n"; + foreach (var failedAvatarRule in failedAvatarRules) { + if (Array.IndexOf(EXPORT_BLOCKING_AVATAR_RULES, failedAvatarRule.Key) >= 0) { + boneErrors += failedAvatarRule.Value + "\n\n"; } else { - warnings += failedBoneRule.Value + "\n\n"; + warnings += failedAvatarRule.Value + "\n\n"; } } + foreach (string materialName in materialAlternateStandardShader) { + warnings += "The material " + materialName + " is not using the recommended variation of the Standard shader. " + + "We recommend you change it to Standard (Roughness setup) shader for improved performance.\n\n"; + } + foreach (var material in materialUnsupportedShader) { + warnings += "The material " + material.Key + " is using an unsupported shader " + material.Value + + ". Please change it to a Standard shader type.\n\n"; + } + foreach (string materialName in normalMapAndHeightMapNotBoth) { + warnings += "The material " + materialName + " has both a normal map and a height map assigned but can only use 1.\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 @@ -408,9 +485,9 @@ class AvatarExporter : MonoBehaviour { modelImporter.SaveAndReimport(); // redo parent names, joint mappings, and user bone positions due to the fbx change - // as well as re-check the bone rules for failures + // as well as re-check the avatar rules for failures humanDescription = modelImporter.humanDescription; - SetUserBoneInformation(); + SetBoneAndMaterialInformation(); } } } else { @@ -456,7 +533,7 @@ class AvatarExporter : MonoBehaviour { return; } - // display success dialog with any bone rule warnings + // display success dialog with any avatar rule warnings string successDialog = "Avatar successfully updated!"; if (!string.IsNullOrEmpty(warnings)) { successDialog += "\n\nWarnings:\n" + warnings; @@ -575,6 +652,27 @@ class AvatarExporter : MonoBehaviour { jointOffset.y + ", " + jointOffset.z + ", " + jointOffset.w + ")\n"); } } + + // if there is any material data to save then write out all materials in JSON material format to the materialMap field + if (materialDatas.Count > 0) { + string materialJson = "{ "; + foreach (var materialData in materialDatas) { + // if this is the only material in the mapping and it is the default name No Name mapped to No Name, + // then the avatar has no embedded materials and this material should be applied to all meshes + string materialName = materialData.Key; + if (materialMappings.Count == 1 && materialName == DEFAULT_MATERIAL_NAME && + materialMappings[materialName] == DEFAULT_MATERIAL_NAME) { + materialJson += "\"all\": "; + } else { + materialJson += "\"[mat::" + materialName + "]\": "; + } + materialJson += materialData.Value.getJSON(); + materialJson += ", "; + } + materialJson = materialJson.Substring(0, materialJson.LastIndexOf(", ")); + materialJson += " }"; + File.AppendAllText(exportFstPath, "materialMap = " + materialJson); + } // open File Explorer to the project directory once finished System.Diagnostics.Process.Start("explorer.exe", "/select," + exportFstPath); @@ -582,11 +680,18 @@ class AvatarExporter : MonoBehaviour { return true; } - static void SetUserBoneInformation() { + static void SetBoneAndMaterialInformation() { userBoneInfos.Clear(); humanoidToUserBoneMappings.Clear(); userBoneTree = new BoneTreeNode(); + materialDatas.Clear(); + materialAlternateStandardShader.Clear(); + materialUnsupportedShader.Clear(); + normalMapAndHeightMapNotBoth.Clear(); + + SetMaterialMappings(); + // instantiate a game object of the user avatar to traverse the bone tree to gather // bone parents and positions as well as build a bone tree, then destroy it UnityEngine.Object avatarResource = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object)); @@ -610,20 +715,26 @@ class AvatarExporter : MonoBehaviour { } } - // generate the list of bone rule failure strings for any bone rules that are not satisfied by this avatar - SetFailedBoneRules(); + // generate the list of avatar rule failure strings for any avatar rules that are not satisfied by this avatar + SetFailedAvatarRules(); } static void TraverseUserBoneTree(Transform modelBone) { GameObject gameObject = modelBone.gameObject; // check if this transform is a node containing mesh, light, or camera instead of a bone - bool mesh = gameObject.GetComponent() != null || gameObject.GetComponent() != null; + MeshRenderer meshRenderer = gameObject.GetComponent(); + SkinnedMeshRenderer skinnedMeshRenderer = gameObject.GetComponent(); + bool mesh = meshRenderer != null || skinnedMeshRenderer != null; bool light = gameObject.GetComponent() != null; bool camera = gameObject.GetComponent() != null; - // if it is in fact a bone, add it to the bone tree as well as user bone infos list with position and parent name - if (!mesh && !light && !camera) { + // if this is a mesh and the model is using external materials then store its material data to be exported + if (mesh && modelImporter.materialLocation == ModelImporterMaterialLocation.External) { + Material[] materials = skinnedMeshRenderer != null ? skinnedMeshRenderer.sharedMaterials : meshRenderer.sharedMaterials; + StoreMaterialData(materials); + } else if (!light && !camera) { + // if it is in fact a bone, add it to the bone tree as well as user bone infos list with position and parent name UserBoneInformation userBoneInfo = new UserBoneInformation(); userBoneInfo.position = modelBone.position; // bone's absolute position @@ -682,8 +793,8 @@ class AvatarExporter : MonoBehaviour { } } - static void SetFailedBoneRules() { - failedBoneRules.Clear(); + static void SetFailedAvatarRules() { + failedAvatarRules.Clear(); string hipsUserBone = ""; string spineUserBone = ""; @@ -692,60 +803,60 @@ class AvatarExporter : MonoBehaviour { Vector3 hipsPosition = new Vector3(); - // iterate over all bone rules in order and add any rules that fail - // to the failed bone rules map with appropriate error or warning text - for (BoneRule boneRule = 0; boneRule < BoneRule.BoneRuleEnd; ++boneRule) { - switch (boneRule) { - case BoneRule.RecommendedUnityVersion: + // iterate over all avatar rules in order and add any rules that fail + // to the failed avatar rules map with appropriate error or warning text + for (AvatarRule avatarRule = 0; avatarRule < AvatarRule.AvatarRuleEnd; ++avatarRule) { + switch (avatarRule) { + case AvatarRule.RecommendedUnityVersion: if (Array.IndexOf(RECOMMENDED_UNITY_VERSIONS, Application.unityVersion) == -1) { - failedBoneRules.Add(boneRule, "The current version of Unity is not one of the recommended Unity " + - "versions. If you are using a version of Unity later than 2018.2.12f1, " + - "it is recommended to apply Enforce T-Pose under the Pose dropdown " + - "in Humanoid configuration."); + failedAvatarRules.Add(avatarRule, "The current version of Unity is not one of the recommended Unity " + + "versions. If you are using a version of Unity later than 2018.2.12f1, " + + "it is recommended to apply Enforce T-Pose under the Pose dropdown " + + "in Humanoid configuration."); } break; - case BoneRule.SingleRoot: - // bone rule fails if the root bone node has more than one child bone + case AvatarRule.SingleRoot: + // avatar rule fails if the root bone node has more than one child bone if (userBoneTree.children.Count > 1) { - failedBoneRules.Add(boneRule, "There is more than one bone at the top level of the selected avatar's " + - "bone hierarchy. Please ensure all bones for Humanoid mappings are " + - "under the same bone hierarchy."); + failedAvatarRules.Add(avatarRule, "There is more than one bone at the top level of the selected avatar's " + + "bone hierarchy. Please ensure all bones for Humanoid mappings are " + + "under the same bone hierarchy."); } break; - case BoneRule.NoDuplicateMapping: - // bone rule fails if any user bone is mapped to more than one Humanoid bone + case AvatarRule.NoDuplicateMapping: + // avatar rule fails if any user bone is mapped to more than one Humanoid bone foreach (var userBoneInfo in userBoneInfos) { string boneName = userBoneInfo.Key; int mappingCount = userBoneInfo.Value.mappingCount; if (mappingCount > 1) { string text = "The " + boneName + " bone is mapped to more than one bone in Humanoid."; - if (failedBoneRules.ContainsKey(boneRule)) { - failedBoneRules[boneRule] += "\n" + text; + if (failedAvatarRules.ContainsKey(avatarRule)) { + failedAvatarRules[avatarRule] += "\n" + text; } else { - failedBoneRules.Add(boneRule, text); + failedAvatarRules.Add(avatarRule, text); } } } break; - case BoneRule.NoAsymmetricalLegMapping: - CheckAsymmetricalMappingRule(boneRule, LEG_MAPPING_SUFFIXES, "leg"); + case AvatarRule.NoAsymmetricalLegMapping: + CheckAsymmetricalMappingRule(avatarRule, LEG_MAPPING_SUFFIXES, "leg"); break; - case BoneRule.NoAsymmetricalArmMapping: - CheckAsymmetricalMappingRule(boneRule, ARM_MAPPING_SUFFIXES, "arm"); + case AvatarRule.NoAsymmetricalArmMapping: + CheckAsymmetricalMappingRule(avatarRule, ARM_MAPPING_SUFFIXES, "arm"); break; - case BoneRule.NoAsymmetricalHandMapping: - CheckAsymmetricalMappingRule(boneRule, HAND_MAPPING_SUFFIXES, "hand"); + case AvatarRule.NoAsymmetricalHandMapping: + CheckAsymmetricalMappingRule(avatarRule, HAND_MAPPING_SUFFIXES, "hand"); break; - case BoneRule.HipsMapped: - hipsUserBone = CheckHumanBoneMappingRule(boneRule, "Hips"); + case AvatarRule.HipsMapped: + hipsUserBone = CheckHumanBoneMappingRule(avatarRule, "Hips"); break; - case BoneRule.SpineMapped: - spineUserBone = CheckHumanBoneMappingRule(boneRule, "Spine"); + case AvatarRule.SpineMapped: + spineUserBone = CheckHumanBoneMappingRule(avatarRule, "Spine"); break; - case BoneRule.SpineDescendantOfHips: - CheckUserBoneDescendantOfHumanRule(boneRule, spineUserBone, "Hips"); + case AvatarRule.SpineDescendantOfHips: + CheckUserBoneDescendantOfHumanRule(avatarRule, spineUserBone, "Hips"); break; - case BoneRule.ChestMapped: + case AvatarRule.ChestMapped: if (!humanoidToUserBoneMappings.TryGetValue("Chest", out chestUserBone)) { // check to see if there is a child of Spine that we can suggest to be mapped to Chest string spineChild = ""; @@ -755,54 +866,54 @@ class AvatarExporter : MonoBehaviour { spineChild = spineTreeNode.children[0].boneName; } } - failedBoneRules.Add(boneRule, "There is no Chest bone mapped in Humanoid for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no Chest bone mapped in Humanoid for the selected avatar."); // if the only found child of Spine is not yet mapped then add it as a suggestion for Chest mapping if (!string.IsNullOrEmpty(spineChild) && !userBoneInfos[spineChild].HasHumanMapping()) { - failedBoneRules[boneRule] += " It is suggested that you map bone " + spineChild + - " to Chest in Humanoid."; + failedAvatarRules[avatarRule] += " It is suggested that you map bone " + spineChild + + " to Chest in Humanoid."; } } break; - case BoneRule.ChestDescendantOfSpine: - CheckUserBoneDescendantOfHumanRule(boneRule, chestUserBone, "Spine"); + case AvatarRule.ChestDescendantOfSpine: + CheckUserBoneDescendantOfHumanRule(avatarRule, chestUserBone, "Spine"); break; - case BoneRule.NeckMapped: - CheckHumanBoneMappingRule(boneRule, "Neck"); + case AvatarRule.NeckMapped: + CheckHumanBoneMappingRule(avatarRule, "Neck"); break; - case BoneRule.HeadMapped: - headUserBone = CheckHumanBoneMappingRule(boneRule, "Head"); + case AvatarRule.HeadMapped: + headUserBone = CheckHumanBoneMappingRule(avatarRule, "Head"); break; - case BoneRule.HeadDescendantOfChest: - CheckUserBoneDescendantOfHumanRule(boneRule, headUserBone, "Chest"); + case AvatarRule.HeadDescendantOfChest: + CheckUserBoneDescendantOfHumanRule(avatarRule, headUserBone, "Chest"); break; - case BoneRule.EyesMapped: + case AvatarRule.EyesMapped: bool leftEyeMapped = humanoidToUserBoneMappings.ContainsKey("LeftEye"); bool rightEyeMapped = humanoidToUserBoneMappings.ContainsKey("RightEye"); if (!leftEyeMapped || !rightEyeMapped) { if (leftEyeMapped && !rightEyeMapped) { - failedBoneRules.Add(boneRule, "There is no RightEye bone mapped in Humanoid " + - "for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no RightEye bone mapped in Humanoid " + + "for the selected avatar."); } else if (!leftEyeMapped && rightEyeMapped) { - failedBoneRules.Add(boneRule, "There is no LeftEye bone mapped in Humanoid " + - "for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no LeftEye bone mapped in Humanoid " + + "for the selected avatar."); } else { - failedBoneRules.Add(boneRule, "There is no LeftEye or RightEye bone mapped in Humanoid " + - "for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no LeftEye or RightEye bone mapped in Humanoid " + + "for the selected avatar."); } } break; - case BoneRule.HipsNotOnGround: + case AvatarRule.HipsNotOnGround: // ensure the absolute Y position for the bone mapped to Hips (if its mapped) is at least HIPS_GROUND_MIN_Y if (!string.IsNullOrEmpty(hipsUserBone)) { UserBoneInformation hipsBoneInfo = userBoneInfos[hipsUserBone]; hipsPosition = hipsBoneInfo.position; if (hipsPosition.y < HIPS_GROUND_MIN_Y) { - failedBoneRules.Add(boneRule, "The bone mapped to Hips in Humanoid (" + hipsUserBone + - ") should not be at ground level."); + failedAvatarRules.Add(avatarRule, "The bone mapped to Hips in Humanoid (" + hipsUserBone + + ") should not be at ground level."); } } break; - case BoneRule.HipsSpineChestNotCoincident: + case AvatarRule.HipsSpineChestNotCoincident: // ensure the bones mapped to Hips, Spine, and Chest are all not in the same position, // check Hips to Spine and Spine to Chest lengths are within HIPS_SPINE_CHEST_MIN_SEPARATION if (!string.IsNullOrEmpty(spineUserBone) && !string.IsNullOrEmpty(chestUserBone) && @@ -813,34 +924,34 @@ class AvatarExporter : MonoBehaviour { Vector3 spineToChest = spineBoneInfo.position - chestBoneInfo.position; if (hipsToSpine.magnitude < HIPS_SPINE_CHEST_MIN_SEPARATION && spineToChest.magnitude < HIPS_SPINE_CHEST_MIN_SEPARATION) { - failedBoneRules.Add(boneRule, "The bone mapped to Hips in Humanoid (" + hipsUserBone + - "), the bone mapped to Spine in Humanoid (" + spineUserBone + - "), and the bone mapped to Chest in Humanoid (" + chestUserBone + - ") should not be coincidental."); + failedAvatarRules.Add(avatarRule, "The bone mapped to Hips in Humanoid (" + hipsUserBone + + "), the bone mapped to Spine in Humanoid (" + spineUserBone + + "), and the bone mapped to Chest in Humanoid (" + chestUserBone + + ") should not be coincidental."); } } break; - case BoneRule.TotalBoneCountUnderLimit: + case AvatarRule.TotalBoneCountUnderLimit: int userBoneCount = userBoneInfos.Count; if (userBoneCount > MAXIMUM_USER_BONE_COUNT) { - failedBoneRules.Add(boneRule, "The total number of bones in the avatar (" + userBoneCount + - ") exceeds the maximum bone limit (" + MAXIMUM_USER_BONE_COUNT + ")."); + failedAvatarRules.Add(avatarRule, "The total number of bones in the avatar (" + userBoneCount + + ") exceeds the maximum bone limit (" + MAXIMUM_USER_BONE_COUNT + ")."); } break; } } } - static string CheckHumanBoneMappingRule(BoneRule boneRule, string humanBoneName) { + static string CheckHumanBoneMappingRule(AvatarRule avatarRule, string humanBoneName) { string userBoneName = ""; - // bone rule fails if bone is not mapped in Humanoid + // avatar rule fails if bone is not mapped in Humanoid if (!humanoidToUserBoneMappings.TryGetValue(humanBoneName, out userBoneName)) { - failedBoneRules.Add(boneRule, "There is no " + humanBoneName + " bone mapped in Humanoid for the selected avatar."); + failedAvatarRules.Add(avatarRule, "There is no " + humanBoneName + " bone mapped in Humanoid for the selected avatar."); } return userBoneName; } - static void CheckUserBoneDescendantOfHumanRule(BoneRule boneRule, string userBoneName, string descendantOfHumanName) { + static void CheckUserBoneDescendantOfHumanRule(AvatarRule avatarRule, string userBoneName, string descendantOfHumanName) { if (string.IsNullOrEmpty(userBoneName)) { return; } @@ -867,13 +978,13 @@ class AvatarExporter : MonoBehaviour { } } - // bone rule fails if no ancestor of given user bone matched the descendant of name (no early return) - failedBoneRules.Add(boneRule, "The bone mapped to " + userBoneInfo.humanName + " in Humanoid (" + userBoneName + - ") is not a child of the bone mapped to " + descendantOfHumanName + " in Humanoid (" + - descendantOfUserBoneName + ")."); + // avatar rule fails if no ancestor of given user bone matched the descendant of name (no early return) + failedAvatarRules.Add(avatarRule, "The bone mapped to " + userBoneInfo.humanName + " in Humanoid (" + userBoneName + + ") is not a child of the bone mapped to " + descendantOfHumanName + " in Humanoid (" + + descendantOfUserBoneName + ")."); } - static void CheckAsymmetricalMappingRule(BoneRule boneRule, string[] mappingSuffixes, string appendage) { + static void CheckAsymmetricalMappingRule(AvatarRule avatarRule, string[] mappingSuffixes, string appendage) { int leftCount = 0; int rightCount = 0; // add Left/Right to each mapping suffix to make Humanoid mapping names, @@ -888,23 +999,23 @@ class AvatarExporter : MonoBehaviour { ++rightCount; } } - // bone rule fails if number of left appendage mappings doesn't match number of right appendage mappings + // avatar rule fails if number of left appendage mappings doesn't match number of right appendage mappings if (leftCount != rightCount) { - failedBoneRules.Add(boneRule, "The number of bones mapped in Humanoid for the left " + appendage + " (" + - leftCount + ") does not match the number of bones mapped in Humanoid for the right " + - appendage + " (" + rightCount + ")."); + failedAvatarRules.Add(avatarRule, "The number of bones mapped in Humanoid for the left " + appendage + " (" + + leftCount + ") does not match the number of bones mapped in Humanoid for the right " + + appendage + " (" + rightCount + ")."); } } static string GetTextureDirectory(string basePath) { - string textureDirectory = Path.GetDirectoryName(basePath) + "\\textures"; + string textureDirectory = Path.GetDirectoryName(basePath) + "\\" + TEXTURES_DIRECTORY; textureDirectory = textureDirectory.Replace("\\\\", "\\"); return textureDirectory; } static string SetTextureDependencies() { string textureWarnings = ""; - dependencyTextures.Clear(); + textureDependencies.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 @@ -913,11 +1024,11 @@ class AvatarExporter : MonoBehaviour { UnityEngine.Object textureObject = AssetDatabase.LoadAssetAtPath(dependencyPath, typeof(Texture2D)); if (textureObject != null) { string textureName = Path.GetFileName(dependencyPath); - if (dependencyTextures.ContainsKey(textureName)) { + if (textureDependencies.ContainsKey(textureName)) { textureWarnings += "There is more than one texture with the name " + textureName + " referenced in the selected avatar.\n\n"; } else { - dependencyTextures.Add(textureName, dependencyPath); + textureDependencies.Add(textureName, dependencyPath); } } } @@ -927,7 +1038,7 @@ class AvatarExporter : MonoBehaviour { 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) { + foreach (var texture in textureDependencies) { string targetPath = texturesDirectory + "\\" + texture.Key; try { File.Copy(texture.Value, targetPath, true); @@ -939,6 +1050,97 @@ class AvatarExporter : MonoBehaviour { } return true; } + + static void StoreMaterialData(Material[] materials) { + // store each material's info in the materialDatas list to be written out later to the FST if it is a supported shader + foreach (Material material in materials) { + string materialName = material.name; + string shaderName = material.shader.name; + + Debug.Log("material1 " + materialName); + + // don't store any material data for unsupported shader types + if (Array.IndexOf(SUPPORTED_SHADERS, shaderName) == -1) { + if (!materialUnsupportedShader.ContainsKey(materialName)) { + materialUnsupportedShader.Add(materialName, shaderName); + } + continue; + } + + MaterialData materialData = new MaterialData(); + materialData.albedo = material.GetColor("_Color"); + materialData.albedoMap = GetMaterialTexture(material, "_MainTex"); + materialData.roughness = material.GetFloat("_Glossiness"); + materialData.roughnessMap = GetMaterialTexture(material, "_SpecGlossMap"); + materialData.normalMap = GetMaterialTexture(material, "_BumpMap"); + materialData.heightMap = GetMaterialTexture(material, "_ParallaxMap"); + materialData.occlusionMap = GetMaterialTexture(material, "_OcclusionMap"); + materialData.emissive = material.GetColor("_EmissionColor"); + materialData.emissiveMap = GetMaterialTexture(material, "_EmissionMap"); + + // for specular setups we will treat the metallic value as the average of the specular RGB intensities + if (shaderName == STANDARD_SPECULAR_SHADER) { + Color specular = material.GetColor("_SpecColor"); + materialData.metallic = (specular.r + specular.g + specular.b) / 3.0f; + } else { + materialData.metallic = material.GetFloat("_Metallic"); + materialData.metallicMap = GetMaterialTexture(material, "_MetallicGlossMap"); + } + + // for non-roughness Standard shaders give a warning that is not the recommended Standard shader, + // and invert smoothness for roughness + if (shaderName == STANDARD_SHADER || shaderName == STANDARD_SPECULAR_SHADER) { + if (!materialAlternateStandardShader.Contains(materialName)) { + materialAlternateStandardShader.Add(materialName); + } + materialData.roughness = 1.0f - materialData.roughness; + } + + // materials can not have both a normal map and a height map set + if (!string.IsNullOrEmpty(materialData.normalMap) && !string.IsNullOrEmpty(materialData.heightMap) && !normalMapAndHeightMapNotBoth.Contains(materialName)) { + normalMapAndHeightMapNotBoth.Add(materialName); + } + + // remap the material name from the Unity material name to the fbx material name that it overrides + if (materialMappings.ContainsKey(materialName)) { + materialName = materialMappings[materialName]; + } + if (!materialDatas.ContainsKey(materialName)) { + materialDatas.Add(materialName, materialData); + } + } + } + + static string GetMaterialTexture(Material material, string textureProperty) { + // ensure the texture property name exists in this material and return its texture directory path if so + string[] textureNames = material.GetTexturePropertyNames(); + if (Array.IndexOf(textureNames, textureProperty) >= 0) { + Texture texture = material.GetTexture(textureProperty); + if (texture) { + foreach (var textureDependency in textureDependencies) { + string textureFile = textureDependency.Key; + if (Path.GetFileNameWithoutExtension(textureFile) == texture.name) { + return TEXTURES_DIRECTORY + "/" + textureFile; + } + } + } + } + return ""; + } + + static void SetMaterialMappings() { + materialMappings.Clear(); + + // store the mappings from fbx material name to the Unity material name overriding it using external fbx mapping + var objectMap = modelImporter.GetExternalObjectMap(); + foreach (var mapping in objectMap) { + var material = mapping.Value as UnityEngine.Material; + if (material != null) { + materialMappings.Add(material.name, mapping.Key.name); + //Debug.Log("materialMapping " + material.name + " " + mapping.Key.name); + } + } + } } class ExportProjectWindow : EditorWindow { diff --git a/tools/unity-avatar-exporter/Assets/README.txt b/tools/unity-avatar-exporter/Assets/README.txt index c84cec2978..2aa1e5f02b 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.2 +Version 0.3.1 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 95c000e7c61b7623e0da0a1f9974e0744375014e..ab39e1ed8f7d25ceb210c8ee59897c88aae20abb 100644 GIT binary patch literal 15949 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 B&65BC From 9cc1a7aaaa36838d1a22cfce097065987dfb1157 Mon Sep 17 00:00:00 2001 From: David Back Date: Wed, 6 Mar 2019 13:39:40 -0800 Subject: [PATCH 2/3] CR changes --- .../Assets/Editor/AvatarExporter.cs | 22 ++---------------- .../avatarExporter.unitypackage | Bin 15949 -> 15720 bytes 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs index 40994c8f46..f8728f9e7e 100644 --- a/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs +++ b/tools/unity-avatar-exporter/Assets/Editor/AvatarExporter.cs @@ -274,7 +274,6 @@ class AvatarExporter : MonoBehaviour { public double roughness; public string roughnessMap; public string normalMap; - public string heightMap; public string occlusionMap; public Color emissive; public string emissiveMap; @@ -296,9 +295,6 @@ class AvatarExporter : MonoBehaviour { if (!string.IsNullOrEmpty(normalMap)) { json += "\"normalMap\": \"" + normalMap + "\", "; } - if (!string.IsNullOrEmpty(heightMap)) { - json += "\"heightMap\": \"" + heightMap + "\", "; - } if (!string.IsNullOrEmpty(occlusionMap)) { json += "\"occlusionMap\": \"" + occlusionMap + "\", "; } @@ -326,7 +322,6 @@ class AvatarExporter : MonoBehaviour { static Dictionary materialDatas = new Dictionary(); static List materialAlternateStandardShader = new List(); static Dictionary materialUnsupportedShader = new Dictionary(); - static List normalMapAndHeightMapNotBoth = new List(); [MenuItem("High Fidelity/Export New Avatar")] static void ExportNewAvatar() { @@ -396,9 +391,6 @@ class AvatarExporter : MonoBehaviour { warnings += "The material " + material.Key + " is using an unsupported shader " + material.Value + ". Please change it to a Standard shader type.\n\n"; } - foreach (string materialName in normalMapAndHeightMapNotBoth) { - warnings += "The material " + materialName + " has both a normal map and a height map assigned but can only use 1.\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 @@ -664,7 +656,7 @@ class AvatarExporter : MonoBehaviour { materialMappings[materialName] == DEFAULT_MATERIAL_NAME) { materialJson += "\"all\": "; } else { - materialJson += "\"[mat::" + materialName + "]\": "; + materialJson += "\"mat::" + materialName + "\": "; } materialJson += materialData.Value.getJSON(); materialJson += ", "; @@ -688,7 +680,6 @@ class AvatarExporter : MonoBehaviour { materialDatas.Clear(); materialAlternateStandardShader.Clear(); materialUnsupportedShader.Clear(); - normalMapAndHeightMapNotBoth.Clear(); SetMaterialMappings(); @@ -1057,8 +1048,6 @@ class AvatarExporter : MonoBehaviour { string materialName = material.name; string shaderName = material.shader.name; - Debug.Log("material1 " + materialName); - // don't store any material data for unsupported shader types if (Array.IndexOf(SUPPORTED_SHADERS, shaderName) == -1) { if (!materialUnsupportedShader.ContainsKey(materialName)) { @@ -1073,7 +1062,6 @@ class AvatarExporter : MonoBehaviour { materialData.roughness = material.GetFloat("_Glossiness"); materialData.roughnessMap = GetMaterialTexture(material, "_SpecGlossMap"); materialData.normalMap = GetMaterialTexture(material, "_BumpMap"); - materialData.heightMap = GetMaterialTexture(material, "_ParallaxMap"); materialData.occlusionMap = GetMaterialTexture(material, "_OcclusionMap"); materialData.emissive = material.GetColor("_EmissionColor"); materialData.emissiveMap = GetMaterialTexture(material, "_EmissionMap"); @@ -1095,12 +1083,7 @@ class AvatarExporter : MonoBehaviour { } materialData.roughness = 1.0f - materialData.roughness; } - - // materials can not have both a normal map and a height map set - if (!string.IsNullOrEmpty(materialData.normalMap) && !string.IsNullOrEmpty(materialData.heightMap) && !normalMapAndHeightMapNotBoth.Contains(materialName)) { - normalMapAndHeightMapNotBoth.Add(materialName); - } - + // remap the material name from the Unity material name to the fbx material name that it overrides if (materialMappings.ContainsKey(materialName)) { materialName = materialMappings[materialName]; @@ -1137,7 +1120,6 @@ class AvatarExporter : MonoBehaviour { var material = mapping.Value as UnityEngine.Material; if (material != null) { materialMappings.Add(material.name, mapping.Key.name); - //Debug.Log("materialMapping " + material.name + " " + mapping.Key.name); } } } diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index ab39e1ed8f7d25ceb210c8ee59897c88aae20abb..aada1d3515d3ee1a165a97e0eee41c92a058e6b0 100644 GIT binary patch literal 15720 zcmV-uJ(t2CiwFq!J%C&U0AX@tXmn+5a4vLVasccd*>c;+G0*x6m=9SgmTBIHwMvR> z(Y6v@A*Cc+YnKWlAqg=BFa&8^N&IDb$S36&(%o|(06|I4Q3-2nEzHr=)6>(}Ts7-g zx4vKg?D4-^tySxGyYMgljDN-7^=7M8t2H~_4wS3c>$T3$g7(k;1;16c3>QBG4E{HN zYsY^cE^m|YF8bNSe*kpN_;;-FZ*&@sp9TMtG5H@K|3Q{T%j{?W|NW2tP&PNOr;~Q0 z-s?8%tx2y{?_Eu5VfVV(>qd=#kNj`c+s*&W|9{1A?f8c%Ab$3!U!nYOfb{RQ)%dsS zP`=rycm6N`{}sP~{O#{AUk1V8QwU@jewn9>WwfYHvaOddw=m=NA_|w$G`PAC4#H3I zH25K$d<@bgX!L@U^i$BN)qAX9I=^4UH@8bl3f{q=!JBv*&En<#Zg7}PssiLeoGlme z)e6C`l4-OEmbXzbn1>Vi=O~^;Nfzw}zl#=GjO|owRjM|QA}Sb8Ch6TgOzz|4Cb*7g zQ0MUV@MJs;(nWB)T+Uy;eEIqF=W0j*tLftA<%|K%UhdN~jHGG2Ocx?)e4j0&JM*i0cxolQPG_@dvIN|->f0!Z7V%_nYilxtiDZ#EcoiI{ zN%}){3zSV)i{LL?0sNq|tN9eD9(>|7NLF`OQ2ZJ?7(v>7a5e%`gv(%Z8zwhV1|M-o zwAc;8S(XMcWjTzg1QI8~XgD}H9#TPS30Qv_PXZX?X`0OL;d_A{8T@W=J{VmN|8RCX zIvWVB4^K~m{h(5-Hmmi@9@X}OxSpke*So{B@#Wjm>BY&xNT=!u3W^i!?-5das4+lq=Cxhc5Yc@Cu??lUjC(cg~PG1G9ECN6`(U$_qKYa)Q znbYIr;mN`9;PT?+@cc(Hh+}9Vi9XAc$aDNx!HHXKRO^lFdS%y5uKSZ~-sHYFwdYOk zdQ&^z)V4RZ8|;{JQaU%Q;oei^*GI3Apw9v)ntpI*K@d~(j%N zb7FbMkwujikN&0d`ZmgzmEE8+o`bZmSHA9QnePA-$fJL)oOqr=4*hH997Wg5;1KlC z7t&1O42n_WyD*tjdNZ#A{2#>lT{MkB(mK@|xz)}V>6iG<(^B12rfgW5?n`3TwcubDFf)7X(XELDk|+$shWxD^|@6(t+EmFjLKSMIQ6C3y1d z_)%1%C%>k|(XHjd(Um@w?1~?^QW26Y--D$qf!u07G?ffeRg@6QtB{W%=6cYxMl&u7~%-vQU%Ok9xT9JM!)sy3wUqL;SMw(q^ybg z+f@jxm_X_;!S8u991Txi4=+cj=Ywa?5Jy8+nR?MAm1 zz39Tni%zxM?za2Uiw=C%s{MYa-EUp*Xf)-vsS6Zbnp(ftgSvf$)T}nU{Z^|Jy{I?f z8=RP0r`Bx3C$(z8WLB*U6M)oO&3>y6wQ2|yT#IhATk9}v+u+JI`rS5Q>wtRFqQExQ*efq$j)tZpwwBXZaZaW07+3GhCHbUz(nnaZs^wDb8 zkS45Dr`K$|?bxa>r;T2x(QooL>fJU2OCL=bNYMt2eaq~NYoX^hQLD8(tc5z@-Igu% z+s#^+x6o@t(*-T8Cl?G$v)gF!VQIG-?Y112cCXhJt+ratMk~LeB6_iLXg7MikuE@z zqtI=(I--q6yWi=!Z7?OehFraFz1M4VdNrD@8Z|*5?OF}{$4WJuy=Gn$rRY`f);n!Z zuU@0uqi(&Rk4C4}5UqAPwN5|3p>_P#Zuk3whgtknSg z8@wkqXi@T37etBt=(l=xcRXCj%59<3fguN|*g~V%1JZF?H9IxHTX1i`)&&un+roNc zbpUXu!31Qz--lUG!+?!~Bp@ncsV02(tub+3x7@yTfPZ*jy1jO{!MoC~!3fkvS332& zHA|$c_tg4Gc!e%p4Bhr&Sx<<;W(THno#EbZHkxfAsbKR5EdJC?nkdiGKLNV^ZmY&; zSRHt=BgV1O?RNxc!tge2`D!|(e&C?WyG;bn|85BF*6g-mFx5xbQgx;i>o+KX$(y}e zON>^nS#P)6y(Tv!`oQY!Z;*P;F6b$jCzZ$RZK2s~!H99)(`W;i2)<}{VX;+`2F7#8 z>oMoy-9R$8nAGXkas95x{;oBE`}$%ufqj~6uDU*SA<^r7nm+vRdPmZ^+o-kFN4?+l z11}_crvswCj!3f4UZ(}(j8Pqb9TIJf?9C=xAUlqC|J0MmjSILfFcshH3l(3lck0UW zYPCtSQ6UgOK=raw1gDu6j+%r9v|%GkA6;mOx8H0waH^JxIe3}?jQc`ufk`S^vsUYY zfagv0fT6&SC=sD>Tj=#cZ*$&hwEM#jZR+~T|M}5 zV!_No*QRt_#qCMG(}i6J99**r3QF2sUFKX-AvEx>cS;3eJgn7$sn8Zgsdt$j!6?*k z_XQcd{T|H1wGkWN?0_u_U5;w40a{JDB^}~v;yw_BFd8KTJU+I9aTa3^d@6^$-UKzr zd)Ka^wN)Y-tjb2e6qDb{0mzPhNLTPtvU=eAD%wU zcIf0z*+`SyOus3$f4vV}EcyY;zt5eaPP19>pcp9=mhyB2e1UFV7+TG`W@)v7ZoDJl z7Wp{#TNqk0*p;K;`Y@S#jlMLsT0PCwq6Wy)YLUipLFbrS%+hLfo6^z(@upc?!YS+m zWA%JYSzu`~^1+5QbJ48c>#2qt}t7aol1R0n91vzmR)&gyjeP`2u5PkZ1N*jdc9 zYLO)2e>a-SvLagXKO3za&;=9+7=1lDv8y*!O6iUXjyi*ona~=H(O~Bm1WtdZjK4m&G$kz3^_N) zg6ibwK~)Bin{GgKa{cg>ZQ#qug=i^bbFhmxQ;pAIzz3s)%kjIx!El7zsK(0>X4GO@ z*(+5McB{R8cQPE0Js^VZQM$UhO`u_lmt3H8@|3c8jQR!$Ma~inuUupAc0%Q z7iY8~PxLXLoo#9;0=vDni{#=ihl2i%U{507&Ny1lBCYLF1p71ZBA6CaTGHVgIkg4= z+gUUMiKEg^(u36;wrK)895Z>T=MA!ZfVf;h{tN`yni3#1)|5aw;uOKP6ike!DveZ- zH}N3KCMd9z<>@unRN16gSRE@-uR}moKE@O5I=EouOVhy+T$K%$ChvpUuak6nn!H`4 ztHjD6GzbV3d7Z||1h(uZ8pQJyCh!j_6oSgj3*4@I6yL?FgvJCz0sZTq(1Hs{&e&en zZ~^;w`EKGc3!=p$U1R}_L@-}OpP5?=@LGJuuWJ8D*^ zcBPU7cOEWahy-B%iMvr3su8OyZpjta4{;CHVXyicZpL1X!w%Jz3JK;v22)9UL$9Q=^0m zf#kmWDN4JU2000)>{U*2y^0`2T^*k7$#VW0xw{CrD&Ag;CZkH9qf zUWf5Z*i9eLri(}r#x0@uxQJ7*e_sm=Fzjg7SiB)IMl5v1^XPDl!xx9M1CS`LSb)1Z$QW?dlM~xJw83Lr?<%dV@8v#@|WO!<&KXMw}#$VUIq1C zEj`1OzXaxVXAqtPi1!sXNLcEpO7NVIS#<$_f)A^u+&C#$nDSxQf{j{W+dugvKkSH( z<=`X>0$R`)Y*Qw|-%!G7^=n@L1P>u71SGx@&IY)PY9+82MGgE#;sbghIaqW-CT!RT zS+7JVWLcvZGPP_s@{wV4t^_8sphANsJst-+txKRG%Nm%-)UwEE5QRjLb5A6Q*=MBP zxM_R_mS+G_u|#)wWh;7rWuokExz2tKzM2KOmZlPpCNiCJB^K$(=o#D_zzmqY63WDJ z03CyloE_frV{&);mky3uiRce4;yIZ#w^o8t+T8-^GuD0?thB_883SeOZtoPgsLr(9 zas&4~<#2@Ko2@+$qc>t17KA%bD6-jH{FFzcaJ&xTq~KKLaMadR6K#|v1V1cy5X~`W z01jxhF$D^s3;p^~;<^P5g9{r_UmW_{N_rc@6txi^%;4VyK194|d>exEt=p!hF}7h} zB-v_C(}_bZMHOn~r(=lx9Ky!k?TT^4_a!^j8k|U%y0Y^@N9z-Mo~#g*VMTPqiRXlzF$=)fz$0onl01!%C6WpP+8RuTpJe=!<^t8}&WwMrRAbL@EW z#WKcsPoDo-H27wf) zL@Ali&r)H|n^io;nZ^)>K37SdyuCO)An!tHS1MUOijo`9MbGwwy1+fR&_4LodZAJy zHN;RBj?~#Kf{p|kAqJr>rsseTyzkYD8UpS2HHd)ApQ_a$qxfpswmsV3`Kk6nwQFd9tOCd6mv4YkFzNU4@)r1h_+<%#rKv(@vI)}pp|kcBE$IId6${`yxN36P**!6ENFdIXaI8(|HU97bp0 zjP4nzR>LG_*2?+)JPMv!GVFw5tJEdZhOmb}noBk?vDFiG> zLrW8aonm+sT02a#IYq!AdYnwt&l{6Y{NY%Yz;Y%@9kbJtTEfWrJ&Rm3>9ss}EFWF+ zVF@(d2FX+y51OT^7u3b^1nAoxPre{SD+J@E7FT03%3F&_!IpEOq5IF zGGwcy^z@H#Ns21KO)11cZ<(P6vn$PA2Am~mi(a0Y*IHA^QS zt@;`83id-S8qi_@4*eal4kWOwU`kxLtHH;@bSVau10Qf2LBc(YczZB}mge9nit&<5 z4f?VJHVD;uTh>SuZHEj^<=d!y0maHi>d|(9?N8ytvAdx~*B1BbvcX~z-dAZ!`t*9c zX!T>)0a*P_biWh)(ysvZZav?3>;5jBts?R?llMubqBs^a()}h`Y5q<;Dj!kKS{b|XWWQS7HUB>_!L4}E~O|_t_Ek+b`@df3cfe2!{H=06ApH42=Lqr#J`0D*&^V z+cWi19j~q!i0#_0o_+)^2_ehm)6UM`<|dMYSkf@Db;&fHtUwejvp4CCym)a3)iC)K zFVY0_(5z+I%sO`q;5HP%j1{UL-yaC5JC5?Yjjvi34Tiu-u}2qsuoF{g>; zPU7JDo%aCXuY#0pDuXuUl}_NwF|u9HQ|7t?QWP-Q^R33juo(rq$$glEctN(|eU+Nb zwq@4=Ca7X&pxz0P%i;y|-szOt^eBRPHHo&rd->gN@ZJ0O-|Z9+&MZwo zuI4B$#0bzDD^yU!qR_d3Fdsl|4AO^`UsD?uV-3X_H+3X0@OyX+& z$+2z-5)2#u%Z);%c<`?<8RW8*``3kdRIk|ms z@aGNL&B&;L9cST)3sJ_ypkd8fv#FacjVR_^;tV0kXrK_Ahc{uIDDV0Kvpip%k$fkt zRjf$LZX920zA!C>eO6JX=R9iT3NoC1LIGIqp$R1Ma_u$q)(RH3B-20oOcz>)i7G{Z z3Ng-_@cNF&Uo9YLeA2%aoIOv0vFk^}qzB-nX;$6|u4 zi@#sQERD+`q$`>=GTjZlxd2(GN<-8stl-*X;=}Qm-iC^VUCIMBMbqdt+#@=RzR20c z+!KR$O3jsu3fJ+$HrRp>tj!&~DUB$lCufB#QG$P*V`Ev;|a_@A9RdyIjf^ zA1JLrSF2wESE@xCV@*ab6j68#JB!Z81plJ=IbQh%5%b#sN>E@8`FH|RM+w4d^P8;T z*}tOYuJx;3Cft0E9g`snK{KPdow8`rYByZW7qMvz&PVW|p|OB4P^=Qc^z1*vK(31@3@1 z_Gn{cS+hz=_vP6oU?P;ZJU7<;LjJC2iHBI4UtzYY1f}yCmE@oY05w{&WsZA8o%6NZ z@MaN_-jli?7cU$K)&)V)`|@i3iPSs8ODXmTv9tJn3$W>}C{6=vvIY0hO;$HTsG2CI#6B}7M_^3^ola*czKZ`QlwLEfH z-;B>qitp-SPz-04L{R_oi83y-XzhF^)$QxUV1he74W4;aR&wgrZF zm#GO~U{JiSaUenN2XEzW8kuUdpG!6rd_&$3UOU@%pg$4i_);xw#hIXq%-3bfVbIsj7Az=dTzl=B3lefwe@rb|sEwuv4>;9A(LOOD1bv;ub6`B54_8SU**V zJ+>sj^~$AL4bj+qh}Etn&r>+1+ZM~8AvhWH)tv9UBQ=8eJ&<@~vr=DvBY`Rsq!QKv z^I_&g^?QQKf#aGt`3NDLGCaM)d`?E#{#gp5XhVWTcPgT7a}-jvlIb|2l%5X?6<0NIt;Y7{RB6j?vzUG-C@mW_%< zP1n>=UVBy88yoTi*Q+_5R~^}1i0$2O z%#ot&EDjAm1%{+R!TUJyJ-Q4G3DkfwWKJoH1fXu4e?V?lm$aW^PjW~t1{ z$q)x=;P?Z42w0pM=P~&@2*?#+d*#j(m9noK)x~yN$w})I0X{7S!%--Jpic|F?S@Uv zbdGaN$f7OR$uyJ+;WL=gM6(4+g-nWlqLspkZzaY+Htq47-ao&E4HNH^4DJKMr26{= zTV|EZoJDXn9`O}D{s%J=V2FW&bfB)|_y*-oW7q3tlzak5_t9|>Ccx}{cVCP3j}?P} z4#}bS?mRY*sfRMV^>JInc&S&>F67a4u$Cu~G zE1@2aCo#!Sif$iNp_is*8}nZbRKT(%{0PG{9{`ks<157H!>Y5*b( zxUVnT_A=29FvwyvE_X;`2*M{rY%fPq(xHn{^ruw}uF@H?JZ=9=rbk-FAen&IkRn`D zV&<&pd4N81WRE-Dm*Gd+kt7`$J~L3UDG3n6RA&*A$!dYH$=-q06*^%P1-Bu2T5OIm zdQpR=3Ghzvg(DN(vL6^1sj({HO}F-_m|OEuQ!HD=9lzMmZ}E}qUD@Yw&SFzDc&p>Z zZAfS1wkb%pgBAupB(Kun#c$#rP@Cyu8sl-jtc<0?4V9AdZ)+O)q))LRe4*u5VNaI+ zd2fFHc{eahf8KexktoK4f#P-{>x^wNZex~#CA+Dp)E+?lXZBA5GW+RI{*1{xo7<`K zoLr3Kf3J=aP9cr}qfM7ikhP&Nsm*4xAO%bCzBW~r8Gt-8q~8_8TvH?dU|jT4Wj8SX z(me)YojLuryaP^YK-ay|VI!7CTSe9u&;tGgWPQz6tS^QLQp1Y=h30984GE!5sEODXq-HGJ{`Y8;l9m902a`%8L;9*4AEg@tQSpj8Eebk&$DZ$b=T?JZ2#lbkW&{ z5?26`p1A?mUItRXEo*&@+6snrJg{IL2B!1`Lp(_gvqQ=val{j1LpMp9L5MD^p0RD0 z)iKP-<#t6JJgi1v=z-Ul>?q!@6)18ST~s`W_WbM>tY)p*cBiwt={&!NXwyPtl>Cd( z+_GhFH`6<0u&WDl-DLo71^3{4Zc+Uzk7G+_=#ZcxKLyjsN|r$Ys9m&yHU1k*3Q*Egb( z%{EMK@Q58-e&x80q6{M7lgPO*=qL@Rkm7Ff-KA~D>Gie?Q=iUnfh4>os;a)x$WdQA zhl-NhCQdthCfUz94KFnI+O~jKfzU~Y9L{U2>IaN0hj;8j1E*@Tz<#C?lH7HCo=%Mj)(7$Gtz z*L!&W-1G(Y3LmQaz21I(PW$|Tvf??TfR%680J!Nk>>>6n?mS=u`av3I|I=>LyvnG51&o| z=prON1Pf$DN>h{^LxmA8iKFpyr+@4#MCslM+@TINljZk%9b@y&7_NGPjxCQlJQvol4Ex+>@Qm;^S ztE~z079F`dtsFC^$}t>=JIXWHkG_h;I=txsQ!_vRxph!OR6i1nhWpkLn`5g$RqT?m zg^?)u(+3UN{i3l6e&x%p!ks<~NRlvK1$PD6rt}#jUG&RZw~J4)t3IxNWjq+18KYA*y~4tHd^gsX0)#uPNLj( z57D+EkMu`5ob?oux%S|{P|ybG#H){0KI^``hOy}64l7F2Kuw~_auv>K!HU{vQqr}! zVXs3fHwV!*g92Qb@c^}KxUAD6`n!W<6Bn?=e~t(n!U0MauR`gIbR3Pn;u_}L9tMsj zS042BHRNMPOGP}qZ;3srf$XhF1%IfQHfCZM?Yi|!d!z+Jm_LKCYu_)q$~8a=*79_q zRnZSJZ?qf$xxs*`59h2vE>5yVX-}y|=e@PN$zbIpV~&Ti4rtW0vC)n7U^~VYU3zf_ z{`p=T4l2%{_j&$27BjEVwUV_-_aT7oc&EfRTE-Z~%S)_`Slh8}DwfMHsSNh@VtcM{ zMlQr0c8Vc$)0+yWG`0_3UISwMn8+dnk-+d`<;lKW^TyHVTMP_sGwjro7b=%r&x4oV zAq`}*Ez9|^er;8f!(U(HPp|C$Y6p*4#iH<0{-vS{HKty3eF~Eb`kS8qTlU0QrPuV@ znz*MCt1xANBcnDjkWyAaeTpgpFajx8H{~O4_-pJbd2-eafU*;7lsQ#mi*q6;cd=F# z6@Z*E*HO?%-tUy=?~8GpVqJ8xWt^+hH`@|`Kew*owCb$!AivdoFV^YVCJwB-mIY&j zXZsSJ*_gn%S}nB|uR!LAMJ~Jx6j+urEN=DMRTIoH`SsB=jh09@Ag96k1cR}@iQJCb zKDtIT8`VB+Fzf|5j&QTJL~m!Kx(>To9kUetT8)RY(jRNkC&RU!n;(i+fv$Nbu<~D2 zoZ-8Mg+*B3ii_YT+nf^O5AjYN;dHk43A?-yDy}3N5gk;quw?*qk||oK@bA4A>>;x0 z;J6#c$!WrZiN<%%&taivj<@)V8&=^z+)OSGmzZ{wc8PN+|0Fv~|NdTo5Yl*16OAfW z(D5xZzzO51s)%>TAq0!{7IL0weWfZE-YY#CzCJxZ9-bV)Q?wT+hvz?v2PWWF=>e|n zaz}rq!QMgF>_y#&T^<*+*`#_#7aXWvJD(U})aTR*q0oWRAkDscnU#6qW(V=B@HVrm z=O}=S5NxUycQiF>^Kk81pX1)9VZttGIe!832rz?Oc25I+ zPJwaZ$XW7e1eEEDzVLN?vs$nbuav%SLtUu2mRr?(!LM?5emTM3jB8lSp{LyncM#xV zg96FS+o2M<%&+;z%Hxw8K%Ri5QNvq!F`Pp(0O)YU3?5jS3BG3Qxl%-ZmpyhwskPe} zgy~{(drwCK)R7bttXP5q=g!0SbVlW|2q;d?PgiMpPb%|y+E1h-e9J7(3nFh z3FdOyV>0(*INou_)SvU{vSFHwA3D=%4Ul9-1xp=o(Zp6m-wv>!6o3!>+`Kr!WumsxCZEj&3^t}spYqdalRIrUns(M} z?uC=@HLhgo6?ka`Wpwjs_!c%>ot@!%!12YKH-~?~H!do(=mvzx)8Pwm%RddigVC`M z-*9pFr1;`X_fLcHyTQqU4`bY<`$&}41M6NKEnkJ9EH@71;afqdk3@`~b}zt;`AD0i zMsS}3H{4+wA+l1UC08u_};DEQ+#o5jJkrsoI z3l(Tz5ncI{5fNTpFAhEPrBS7QcwEr=xn4AdxIL#}%I!@j5T&~4tbjmO`Q^s?bimfi z#(K@EgLcf~{r&YSAATlv{1D;kIJsr#Y1LRc{b^jPr($rPFg}`bKJ(l*U)@znwSoH@ z$Tzi^Q8>2u(UP}H0YJWXOzUi%N6`l(ER2V|f`{@P4UBJLLFJZMTv$tT$4Uwg(Zdye zqV9%EbhoibNPT7;Dl9fR@a+9nv7%KmYkA^&g;VM4$4MO_>`i z*8M6EQCRxcCx<5AlqA4I|H%~jCVfp8|G}K_^ePZt4Y+FOGa^5k>;4{I^++zLt?F<(WkRxuh<3AA;7`T?_HWa&8+r~jn38VxT@Ce^|wo}{Z)4O z5kxYluPDBLLyX44>;DdJCrgafH}L)I6pnVpQ&`<9!}%1Fw@A3lTn4(WiyO2di{MkA z<3z^TIDnMs&5iI*l8O$?!{*6`vXoVEoAf6dRq-c2g`rUARPK+}io()EH zGJV5YW%|FUX8h%Zk*mt(4(2zQzJz7&{H5Fy6W9lt`jrcra!Wwg7unBKHirAAz<9wr zv4Ollhtl}fi->+jbHvaiP1LsWu|2NCOU0W^6 zneDXA=<~FVgY@trKttdlz?kJJ5wN8HL`vK6UoQI3Q)m?XMe(u=T>U(X@8adFyw|4W ztoJR?@zd>lYnQOadff5g4~NGW$Cnr5;pp;*Q{;3|@aKvsmw=$id`+~~r{MqeiITtdb#J@^vet?n3?&5)|pVqT}|I*P|HF|Xgt#dJ=7_`$zd zXxBLUD9+5`NEMuQ(Q3Bz{e%J$xBh-EV?q0mc*g~QiqCAs%O0I7 zp+4}pR(>a`!~jS1CjJy9lA#0(Fq6w2`(PWY!!F_3J@5O@)@DN4Hsgd=H#gx6A#K}t zs%)vJqb!BbwU)kcyYymY%F}#=HVmTWahEVA)+-Ku&qZk?0FTD9vg6hDb^ImDq~3sJ zMCiuU70Hr9_QGha?de%8T&wa7ew$7y2>Fu2k4Q|EIC4obqvjzQQa(n`oDQ{Vuz@}8$6kxZ|NDL%sTrZvkA4hU3eFLpY{zemeS5A?w0*lBy&2 zu<Cy&Lc+%(POLmu!c`eFp#_l_1 zmnYFv5wx$H1LtRB*a-%C(mgBj3I;UC?^Q8Du?tnFVy`t<4T6#(?>WFU%eb##NgZe) zW8W`DT%zT>Z{xaJL;<|Vf-s?sCd4@9-+3i^%)ZuMd8L{&?!DqX(m2@hyjEtm@XWpE zz|ToIPqg_1H_uU$hC;zp{4T#4x)KaYA1I5r% zG9e-93kA>%r<>lg=#Yi05th!~`LzVz;Ep3US8P%izS!Y?jwbI3q}(T@Xl+dOMAnoK zOX;%2d{;`A<;niXan+0I?nwv%0cyG=&$H|peEu|%+f%71L>3*3DEqD@5><>cI})+W z+fxsvezSKjX;gUQ>fsLq8~u$`h1Z5Qz@uLTv0nvQZ#0&^bJDq-$9HFt$<6$xBjhSs zauXQ!icI5;|f zH#mS(qq`ca<{43UbvXCtO+zV(QeLgJ{t{0RV^y4JJ36 zHHufm*%dwjuLhZ2CkFSwZdWep-^%*x?9xW4$eNWJLlOe!`Q_*Ov1hal@1)x&sA=n)3)Q7V2vw4J%2EiX7y62gAq8hKN;)hltwgtWh zN^a6jVa8VgAtrt!4rnVdqqjd`L@G*fM}S9)=<*C+{5*%lNP`gwk+b3Ji=)AaOB3I0 zCpyW7yhLRzWDqo$sG?hV*Q@|qU4XuoA2<5P)lTp-XjW_2B_qS$wsI!ZG0!fIb16pP zP}Pho|MV>9jU-K8C_%ulQx;kxqbPL{3h$0wL>|qx&+OZEckSlbz4rKU2`H;OSf-#R z2?>Efc~&A0!i~WX=QYw&YcG`Mx@t2;k(QjbD4_AYRwGJ7fZU@V-Zh5CX~41e*-JPG^y5H>Ax=4`b?+T0}-LBuK8i)Z+w3Y zHwWE0?^>k0R^;HH?Hy~6(=cqGC-EPu`@%q@Yr7XZ1QL%OOgb34J2>$Y>e>z}MmyS# zG4bcIouo;VZaX*_uLTKM>m-ijxQ^|_PqTCe3yU^~RRM@{zdqxTIB`4+KPuQ-_6J~F zq3Fl(zB+3uQZr9Yi;uFk)^&@sGP(qUD${x;RBfzj4)@M&Gph&hL;zQ#(9oJ%Z^bD$ zZ*F~!{qE|5o8W3A5ak=VZ8loo{OY*sHluSe%fL0rbf)-`I;&Dl9`I0fhKhF`{T1*iW`tkVAGSF}^LTaFc|em+Ym2 zwzt-b^Ge%hHSx>hlK8GEx<}r|C)@Abf-hMx_4B+k%lsj?)9{~!5}C#4-gTT?)ew&c!-tQ~0Ho71K<+&|I~zTDdo+Uk+)sxu2lyfG=|IPK?+uPO z!_bO)do&yzKPUrs)&ok!JOi)6$;s%X+>)omh#btP_fJO0$FeoIuQtc!5zpJq+C>~J zO0Aqkg$&rY$SL0k$MmSrHQLl$p8NCDUWs+x<+y|XIdcYqx)(oU7-EvbyHD{gaOi#_;#C9w zW8=N*HiMDmR4dsNpemaeLx9~fyPNvsXu7#K0#Q1n-$q{~2RC+w)4aJSggC+kZ?ZS4 zrFT{-P^+q7s7d%JVz~iK>1ra$gwKWOA@vEWqvNPc>01@x-10@^CNl?Aqkruz3M(rt z(=0sCPZ{EShG zw#<=Mi^WZ&l~AP-vvw*+bT3PnxsXU8wz@jY^)Dn{0V7g`*Lzx)DwK@v!at2Lv_QQd=A zQzf(}q4eU#Knu0NT0d6d%ZK3#aBTo<^-G0$BiLH8_s`>K*{H11R4Sau;rx9`gSytd za8!j^l$O~yuu-`yxVB*y6@AJegjr{hgvxL)HQ7uM^5u?U@WFfL$$&j~JXwil!&e)w zFPD3DwMlr4J7`k)NKH>?iy5>@`$r0bh06GX6vKJS6ilAJic5)7(jXx@ZVPw% zW)a3lv{{77Ch6;L+A}Fc`6$h3E#?h?sy1GdmaERd8U?sv?qW)xMrHoLQ~cZ~i6!*~y18@t0)4g7+M$Eret(R}j)9z}A!-=lD&EVn8XA-)Fq&$xq%zIg7Lq;d5L- zB34VZkA~=rr-2cecujVs05)wOfN+A3{V^De^l{nL4ZpR7&AdJgZN7=oHiUT+U+R?< zUImPx2ZaWkH`_p=A}KK?AWkB7yg`hW0+EWg%&ootbt}SrR4(HW%j-vZU;e~u-VIc6 z3t{jPCWGgRw-!nKX%PweKx!u}`v6yS@stFLlomA6v6-4&MxhSKhHfkxjr&Z>9^4gO znlW^|u?xk}9l&-Ha1B?&nomw$UurK9H&+A+rD=|Y2;&I_+m&@^E6rpjh4yCX&jsRy zkVx80S4^5AinUcDF81Rho(6`bGIT|8F^Et*iKsZz3|yF1GSkoCNZxTY2YaN3CthQB z4V{bC=+lLH6|Y~pZ_pfi_3-M}nK!ltlx+;0?{R2b+viG|*q<>=QVf`rvP4-}02CjB zA_HlG3tMO76zDUKxYZ-1Q{nQaH?%5gy=q^3 z0OA=GV=~ZlhM{NTuvE1qk+bS-pE#NuVbt+U`uQciL{R=Kw6gcU-Sivz*!v$^vD3 z&Dlv`e_+9#`4Jsp7D+%Xul{ZkhlkcS)~G*DlT>&W@#2c8qtYrPn)${ikXWRNmvl@PiYCm4Kt$(N8$MxSqNzm{00UrKs@7Mn>3LQ(z zTg-&nV(zfP7al1PE7jZdyvpJ0R~{_slOwJp*+DN#^n*>EmG0MYRW zj8;$S9m7pjy_&PjS^&qD@X&{FM)e)LDl&v0DLVoIuPBg-TEbtvq6jZYGi-v6XNWgI zlZAB$5R(DN^a6(D*%k{7!krV zn;?%7j}7GM6y)*wDZ(_P+0$m;Y9PxL9`;3!EGT(J9xoFfaeq$j;ce7VErM#ka!IE2 z=@cE7oq~v4*S1DrhUV8lM2teyU^oHaLaXZ;>NmurEVr6Pgcc_ zTVBB9=Xk9w#VAVINJ6oR6cFb*SJY6D&SF}{)z|nG=e22t5n!d~d;&;FCx1z3(>RV& zAl@Ql;x?MIYXXyCx(JDWS-JpEeGXhXr{9#?B9919s0Snp(_n!I9g0Ye_wzX8N%;opo+i`)HUR(?%Ah6y literal 15949 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 Date: Thu, 7 Mar 2019 16:19:50 -0800 Subject: [PATCH 3/3] update avatar exporter package --- .../avatarExporter.unitypackage | Bin 15720 -> 15944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tools/unity-avatar-exporter/avatarExporter.unitypackage b/tools/unity-avatar-exporter/avatarExporter.unitypackage index aada1d3515d3ee1a165a97e0eee41c92a058e6b0..281cc80ddb4680277c4a84f68a44788bae88ba0d 100644 GIT binary patch literal 15944 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 literal 15720 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