// Decompiled with JetBrains decompiler // Type: Eden.AutoMorpher.BodyPoseMatchSetupUtil // Assembly: EdenAutoMorpherScript, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // MVID: D39968B3-E151-4276-BDB4-E82752BBAFF0 // Assembly location: D:\dev\AutoMorpher\Assets\@Eden_Tools\Eden_AutoMorpher\Script\EdenAutoMorpherScript.dll using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Eden.AutoMorpher { public class BodyPoseMatchSetupUtil { public void AdjustAvatarScaleByNeck( Transform avatarRoot, Dictionary> humanBoneMap, float targetHeight) { if (Object.op_Equality((Object)avatarRoot, (Object)null)) { Debug.LogWarning((object)"[AvatarBodyMatchUtil] NormalizeAvatarScaleByNeck: avatar == null"); } else { Transform boneFromBoneMap = new BodyPoseMatch_CommonUtil().GetBoneFromBoneMap(humanBoneMap, (HumanBodyBones)9); if (Object.op_Equality((Object)boneFromBoneMap, (Object)null)) { Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} 에서 Neck 본을 찾지 못했습니다. 스케일 정규화를 건너뜁니다."); } else { Transform transform = ((Component)avatarRoot).transform; float num1 = boneFromBoneMap.position.y - transform.position.y; if (Mathf.Approximately(num1, 0.0f)) { Debug.LogWarning((object)$"[AvatarBodyMatchUtil] {((Object)avatarRoot).name} Neck Y가 0에 가까워 스케일 계산을 건너뜁니다. (neckY = {num1})"); } else { float num2 = targetHeight / num1; Vector3 vector3 = Vector3.op_Multiply(transform.localScale, num2); transform.localScale = vector3; } } } } public GameObject CreateBodyProxy( Animator sourceAvatar, IReadOnlyList sourceBodyMeshes, out List proxyBodyMeshes, out Dictionary sourceToProxy) { proxyBodyMeshes = (List)null; if (Object.op_Equality((Object)sourceAvatar, (Object)null)) { Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null"); sourceToProxy = new Dictionary(); return (GameObject)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.op_Inequality((Object)component, (Object)null)) { ((Behaviour)component).enabled = false; remainTransforms.Add(((Component)component).transform); } if (Object.op_Inequality((Object)component, (Object)null) && Object.op_Inequality((Object)component.avatar, (Object)null) && component.avatar.isHuman) { for (int index = 0; index < 55; ++index) { HumanBodyBones humanBodyBones = (HumanBodyBones)index; Transform boneTransform = component.GetBoneTransform(humanBodyBones); if (Object.op_Inequality((Object)boneTransform, (Object)null)) remainTransforms.Add(boneTransform); } } HashSet meshSet = new HashSet(); if (sourceBodyMeshes != null) { foreach (SkinnedMeshRenderer sourceBodyMesh in (IEnumerable)sourceBodyMeshes) { if (!Object.op_Equality((Object)sourceBodyMesh, (Object)null) && !Object.op_Equality((Object)sourceBodyMesh.sharedMesh, (Object)null)) meshSet.Add(sourceBodyMesh.sharedMesh); } } SkinnedMeshRenderer[] componentsInChildren1 = clone.GetComponentsInChildren(true); List skinnedMeshRendererList = new List(); foreach (SkinnedMeshRenderer skinnedMeshRenderer in componentsInChildren1) { if (!Object.op_Equality((Object)skinnedMeshRenderer, (Object)null)) { Mesh sharedMesh = skinnedMeshRenderer.sharedMesh; if (!Object.op_Equality((Object)sharedMesh, (Object)null) && meshSet.Contains(sharedMesh)) skinnedMeshRendererList.Add(skinnedMeshRenderer); } } if (skinnedMeshRendererList.Count == 0) Debug.LogWarning((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone에서 동일 sharedMesh를 가진 BodyMesh를 찾지 못했습니다."); if (skinnedMeshRendererList.Count > 0) { MeshClassifier meshClassifier = new MeshClassifier(); foreach (SkinnedMeshRenderer smr in skinnedMeshRendererList) { if (!Object.op_Equality((Object)smr, (Object)null)) { remainTransforms.Add(((Component)smr).transform); HashSet activeBones = meshClassifier.GetActiveBones(smr); if (activeBones == null) { Debug.LogWarning((object)$"[AvatarBodyMatchUtil] CreateSourceBodyProxy: clone smr '{((Object)smr).name}' has null bones array (mesh='{((Object)smr.sharedMesh)?.name}')"); } else { foreach (Transform transform in activeBones) { if (!Object.op_Equality((Object)transform, (Object)null)) remainTransforms.Add(transform); } } } } } foreach (Transform t in remainTransforms.ToList()) AddWithParents(t); Transform[] componentsInChildren2 = clone.GetComponentsInChildren(true); for (int index = componentsInChildren2.Length - 1; index >= 0; --index) { Transform transform = componentsInChildren2[index]; if (!Object.op_Equality((Object)transform, (Object)null) && !Object.op_Equality((Object)transform, (Object)clone.transform) && !remainTransforms.Contains(transform)) Object.DestroyImmediate((Object)((Component)transform).gameObject); } proxyBodyMeshes = skinnedMeshRendererList; new BoneMatchUtil().BuildSourceToProxyBoneMap(sourceAvatar, component, out sourceToProxy); return clone; void AddWithParents(Transform t) { for (; Object.op_Inequality((Object)t, (Object)null) && Object.op_Inequality((Object)t, (Object)clone.transform); t = t.parent) remainTransforms.Add(t); } } public Vector3 GetComprehensiveScale( Transform rootT, Dictionary> clothHumanoidBoneMap, ProfileData profileData) { if (Object.op_Equality((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 transform1 = (Transform)null; HashSet transformSet; if (clothHumanoidBoneMap.TryGetValue((HumanBodyBones)0, out transformSet) && transformSet != null && transformSet.Count > 0) { foreach (Transform transform2 in transformSet) { if (Object.op_Inequality((Object)transform2, (Object)null)) { transform1 = transform2; break; } } } if (Object.op_Equality((Object)transform1, (Object)null)) throw new AutoMorpherException("Hip Transform is Missing", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - failed to get [hip] transform from clothHumanoidBoneMap"); BoneData boneData = (BoneData)null; for (int index = 0; index < profileData.bones.Count; ++index) { BoneData bone = profileData.bones[index]; if (bone != null && bone.hBone == null) { boneData = bone; break; } } Vector3 vector3_1 = boneData != null ? boneData.rootLocalScale : throw new AutoMorpherException("Hip Bone Data is Missing in Profile", "[BodyPoseMatch_CommonUtil] GetComprehensiveScale\n - profileData bones does not contain Hips"); Vector3 lossyScale1 = rootT.lossyScale; Vector3 lossyScale2 = transform1.lossyScale; Vector3 vector3_2; // ISSUE: explicit constructor call ((Vector3)ref vector3_2).\u002Ector(lossyScale2.x / lossyScale1.x, lossyScale2.y / lossyScale1.y, lossyScale2.z / lossyScale1.z); return new Vector3(vector3_2.x / vector3_1.x, vector3_2.y / vector3_1.y, vector3_2.z / vector3_1.z); } } }