// Warning: Some assembly references could not be resolved automatically. This might lead to incorrect decompilation of some parts, // for ex. property getter/setter access. To get optimal decompilation results, please manually add the missing references to the list of loaded assemblies. // EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // Eden.AutoMorpher.BodyPoseMatchSetupUtil using System.Collections.Generic; using System.Linq; using Eden.AutoMorpher; using Eden.AutoMorpher.profile; using UnityEngine; public class BodyPoseMatchSetupUtil { public void AdjustAvatarScaleByNeck(Transform avatarRoot, Dictionary> humanBoneMap, float targetHeight) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)avatarRoot == (Object)null) { Debug.LogWarning((object)"[AvatarBodyMatchUtil] NormalizeAvatarScaleByNeck: avatar == null"); return; } Transform boneFromBoneMap = new BodyPoseMatch_CommonUtil().GetBoneFromBoneMap(humanBoneMap, (HumanBodyBones)9); if ((Object)(object)boneFromBoneMap == (Object)null) { Debug.LogWarning((object)("[AvatarBodyMatchUtil] " + ((Object)avatarRoot).name + " 에서 Neck 본을 찾지 못했습니다. 스케일 정규화를 건너뜁니다.")); return; } Transform transform = ((Component)avatarRoot).transform; float num = boneFromBoneMap.position.y - transform.position.y; if (Mathf.Approximately(num, 0f)) { Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num})"); return; } float num2 = targetHeight / num; Vector3 localScale = transform.localScale; localScale *= num2; transform.localScale = localScale; } public GameObject CreateBodyProxy(Animator sourceAvatar, IReadOnlyList sourceBodyMeshes, out List proxyBodyMeshes, out Dictionary sourceToProxy) { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) proxyBodyMeshes = null; if ((Object)(object)sourceAvatar == (Object)null) { Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null"); sourceToProxy = new Dictionary(); return null; } GameObject clone = Object.Instantiate(((Component)sourceAvatar).gameObject); ((Object)clone).name = ((Object)sourceAvatar).name + "_BodyProxy"; HashSet remainTransforms = new HashSet(); remainTransforms.Add(clone.transform); Animator component = clone.GetComponent(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; remainTransforms.Add(((Component)component).transform); } if ((Object)(object)component != (Object)null && (Object)(object)component.avatar != (Object)null && component.avatar.isHuman) { for (int i = 0; i < 55; i++) { HumanBodyBones val = (HumanBodyBones)i; Transform boneTransform = component.GetBoneTransform(val); if ((Object)(object)boneTransform != (Object)null) { remainTransforms.Add(boneTransform); } } } HashSet hashSet = new HashSet(); if (sourceBodyMeshes != null) { foreach (SkinnedMeshRenderer sourceBodyMesh in sourceBodyMeshes) { if (!((Object)(object)sourceBodyMesh == (Object)null) && !((Object)(object)sourceBodyMesh.sharedMesh == (Object)null)) { hashSet.Add(sourceBodyMesh.sharedMesh); } } } SkinnedMeshRenderer[] componentsInChildren = clone.GetComponentsInChildren(true); List list = new List(); SkinnedMeshRenderer[] array = componentsInChildren; foreach (SkinnedMeshRenderer val2 in array) { if (!((Object)(object)val2 == (Object)null)) { Mesh sharedMesh = val2.sharedMesh; if (!((Object)(object)sharedMesh == (Object)null) && hashSet.Contains(sharedMesh)) { list.Add(val2); } } } if (list.Count == 0) { Debug.LogWarning((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone에서 동일 sharedMesh를 가진 BodyMesh를 찾지 못했습니다."); } if (list.Count > 0) { MeshClassifier meshClassifier = new MeshClassifier(); foreach (SkinnedMeshRenderer item in list) { if ((Object)(object)item == (Object)null) { continue; } remainTransforms.Add(((Component)item).transform); HashSet activeBones = meshClassifier.GetActiveBones(item); if (activeBones == null) { string[] obj = new string[5] { "[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone smr '", ((Object)item).name, "' has null bones array (mesh='", null, null }; Mesh sharedMesh2 = item.sharedMesh; obj[3] = ((sharedMesh2 != null) ? ((Object)sharedMesh2).name : null); obj[4] = "')"; Debug.LogWarning((object)string.Concat(obj)); continue; } foreach (Transform item2 in activeBones) { if (!((Object)(object)item2 == (Object)null)) { remainTransforms.Add(item2); } } } } foreach (Transform item3 in remainTransforms.ToList()) { AddWithParents(item3); } Transform[] componentsInChildren2 = clone.GetComponentsInChildren(true); for (int num = componentsInChildren2.Length - 1; num >= 0; num--) { Transform val3 = componentsInChildren2[num]; if (!((Object)(object)val3 == (Object)null) && !((Object)(object)val3 == (Object)(object)clone.transform) && !remainTransforms.Contains(val3)) { Object.DestroyImmediate((Object)(object)((Component)val3).gameObject); } } proxyBodyMeshes = list; new BoneMatchUtil().BuildSourceToProxyBoneMap(sourceAvatar, component, out sourceToProxy); return clone; void AddWithParents(Transform t) { while ((Object)(object)t != (Object)null && (Object)(object)t != (Object)(object)clone.transform) { remainTransforms.Add(t); t = t.parent; } } } public Vector3 GetComprehensiveScale(Transform rootT, Dictionary> clothHumanoidBoneMap, ProfileData profileData) { //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)rootT == (Object)null) { throw new AutoMorpherException("Root Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - rootT is null"); } if (profileData.bones == null || profileData.bones.Count == 0) { throw new AutoMorpherException("Profile Bones are Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData.bones is null or empty"); } Transform val = null; if (clothHumanoidBoneMap.TryGetValue((HumanBodyBones)0, out var value) && value != null && value.Count > 0) { foreach (Transform item in value) { if ((Object)(object)item != (Object)null) { val = item; break; } } } if ((Object)(object)val == (Object)null) { throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - failed to get [hip] transform from clothHumanoidBoneMap"); } BoneData val2 = null; for (int i = 0; i < profileData.bones.Count; i++) { BoneData val3 = profileData.bones[i]; if (val3 != null && (int)val3.hBone == 0) { val2 = val3; break; } } if (val2 == null) { throw new AutoMorpherException("Hip Bone Data is Missing in Profile", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData bones does not contain Hips"); } Vector3 rootLocalScale = val2.rootLocalScale; Vector3 lossyScale = rootT.lossyScale; Vector3 lossyScale2 = val.lossyScale; Vector3 val4 = default(Vector3); ((Vector3)(ref val4))._002Ector(lossyScale2.x / lossyScale.x, lossyScale2.y / lossyScale.y, lossyScale2.z / lossyScale.z); return new Vector3(val4.x / rootLocalScale.x, val4.y / rootLocalScale.y, val4.z / rootLocalScale.z); } }