// Decompiled with JetBrains decompiler // Type: Eden.AutoMorpher.BodyPoseToClothApplier // 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; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Eden.AutoMorpher { public class BodyPoseToClothApplier { public void ApplyBodyPoseToClothes( Transform bodyProxyRoot, Transform clothesRoot, Dictionary clothToBodyMatched, Dictionary sourceToProxy, bool copyPosition = true, bool copyRotation = false, bool copyScale = true) { if (Object.op_Equality((Object)bodyProxyRoot, (Object)null)) throw new AutoMorpherException("Body Proxy Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot is null"); if (Object.op_Equality((Object)clothesRoot, (Object)null)) throw new AutoMorpherException("Clothes Root is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothesRoot is null"); if (clothToBodyMatched == null || clothToBodyMatched.Count == 0) throw new AutoMorpherException("Cloth To Body Matched Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - clothToBodyMatched is null or empty"); if (sourceToProxy == null) throw new AutoMorpherException("Source To Proxy Map is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - sourceToProxy is null"); clothesRoot.localScale = bodyProxyRoot.localScale; Animator component = ((Component)bodyProxyRoot).GetComponent(); Transform transform = !Object.op_Equality((Object)component, (Object)null) ? ((Component)component).transform : throw new AutoMorpherException("Body Proxy Animator is Missing", "[BodyToClothPoseApplier] ApplyDeformedProxyPoseToCloth\n - bodyProxyRoot has no Animator"); Dictionary proxyDepthMap = this.BuildDepthMap(transform); Dictionary proxyToCloth = new Dictionary(); List boneMappingList = new List(); HashSet transformSet = new HashSet(); foreach (KeyValuePair keyValuePair in clothToBodyMatched) { Transform key1 = keyValuePair.Key; BoneMatchUtil.BoneRootLocalData boneRootLocalData = keyValuePair.Value; if (!Object.op_Equality((Object)key1, (Object)null) && boneRootLocalData != null) { Transform t = boneRootLocalData.t; Transform key2; if (!Object.op_Equality((Object)t, (Object)null) && sourceToProxy.TryGetValue(t, out key2) && !Object.op_Equality((Object)key2, (Object)null)) { HumanBodyBones hBone = boneRootLocalData.hBone; if (transformSet.Add(key1)) { int num1 = 999; int num2; if (proxyDepthMap != null && proxyDepthMap.TryGetValue(key2, out num2)) num1 = num2; boneMappingList.Add(new BodyPoseToClothApplier.BoneMapping() { proxyBone = key2, clothBone = key1, depth = num1, humanBone = hBone != 55 ? new HumanBodyBones?(hBone) : new HumanBodyBones?() }); } if (!proxyToCloth.ContainsKey(key2)) proxyToCloth.Add(key2, key1); } } } this.MirrorBoneMarkers(transform, proxyToCloth, proxyDepthMap, boneMappingList); foreach (BodyPoseToClothApplier.BoneMapping boneMapping in boneMappingList.Where((Func)(m => m != null && Object.op_Inequality((Object)m.proxyBone, (Object)null) && Object.op_Inequality((Object)m.clothBone, (Object)null))).OrderBy((Func)(m => m.depth)).ToList()) { if (!Object.op_Equality((Object)boneMapping.proxyBone, (Object)null) && !Object.op_Equality((Object)boneMapping.clothBone, (Object)null)) { if (copyPosition) boneMapping.clothBone.position = boneMapping.proxyBone.position; if (copyRotation) boneMapping.clothBone.rotation = boneMapping.proxyBone.rotation; if (copyScale) boneMapping.clothBone.localScale = boneMapping.proxyBone.localScale; } } } private Dictionary BuildDepthMap(Transform root) { Dictionary dictionary = new Dictionary(); if (Object.op_Equality((Object)root, (Object)null)) return dictionary; foreach (Transform componentsInChild in ((Component)root).GetComponentsInChildren(true)) { if (!Object.op_Equality((Object)componentsInChild, (Object)null)) dictionary[componentsInChild] = this.GetDepthFromRoot(componentsInChild, root); } return dictionary; } private int GetDepthFromRoot(Transform t, Transform root) { int depthFromRoot = 0; for (Transform transform = t; Object.op_Inequality((Object)transform, (Object)null) && Object.op_Inequality((Object)transform, (Object)root); transform = transform.parent) ++depthFromRoot; return depthFromRoot; } private void MirrorBoneMarkers( Transform proxyArmature, Dictionary proxyToCloth, Dictionary proxyDepthMap, List mappings) { if (Object.op_Equality((Object)proxyArmature, (Object)null) || proxyToCloth == null || mappings == null) return; TempBoneMarker[] componentsInChildren = ((Component)proxyArmature).GetComponentsInChildren(true); if (componentsInChildren == null || componentsInChildren.Length == 0) return; HashSet transformSet = new HashSet(); for (int index = 0; index < mappings.Count; ++index) { BodyPoseToClothApplier.BoneMapping mapping = mappings[index]; if (mapping != null && Object.op_Inequality((Object)mapping.proxyBone, (Object)null)) transformSet.Add(mapping.proxyBone); } int num1; foreach (TempBoneMarker tempBoneMarker1 in ((IEnumerable)componentsInChildren).Where((Func)(bm => Object.op_Inequality((Object)bm, (Object)null) && Object.op_Inequality((Object)((Component)bm).transform, (Object)null))).OrderBy((Func)(bm => proxyDepthMap != null && proxyDepthMap.TryGetValue(((Component)bm).transform, out num1) ? num1 : int.MaxValue)).ToList()) { Transform transform1 = ((Component)tempBoneMarker1).transform; if (!Object.op_Equality((Object)transform1, (Object)null)) { Transform originalParent = tempBoneMarker1.originalParent; Transform transform2; if (!Object.op_Equality((Object)originalParent, (Object)null) && proxyToCloth.TryGetValue(originalParent, out transform2) && !Object.op_Equality((Object)transform2, (Object)null)) { List transformList = this.CollectDirectChilds(transform2); Transform transform3 = this.FindMarkerInChild(transform2); TempBoneMarker tempBoneMarker2; if (Object.op_Equality((Object)transform3, (Object)null)) { transform3 = new GameObject(((Object)transform1).name).transform; transform3.SetParent(transform2, true); tempBoneMarker2 = ((Component)transform3).gameObject.AddComponent(); } else tempBoneMarker2 = ((Component)transform3).GetComponent(); transform3.position = transform1.position; transform3.rotation = transform1.rotation; transform3.localScale = transform1.localScale; tempBoneMarker2.originalParent = transform2; tempBoneMarker2.additionalInfo = tempBoneMarker1.additionalInfo; tempBoneMarker2.wrappedChildNames = tempBoneMarker1.wrappedChildNames; for (int index = 0; index < transformList.Count; ++index) { Transform transform4 = transformList[index]; if (!Object.op_Equality((Object)transform4, (Object)null) && !Object.op_Equality((Object)transform4, (Object)transform3)) transform4.SetParent(transform3, true); } if (!proxyToCloth.ContainsKey(transform1)) proxyToCloth.Add(transform1, transform3); if (transformSet.Add(transform1)) { int num2 = 999; int num3; if (proxyDepthMap != null && proxyDepthMap.TryGetValue(transform1, out num3)) num2 = num3; mappings.Add(new BodyPoseToClothApplier.BoneMapping() { proxyBone = transform1, clothBone = transform3, depth = num2, humanBone = new HumanBodyBones?() }); } } } } } private Transform FindMarkerInChild(Transform parent) { if (Object.op_Equality((Object)parent, (Object)null)) return (Transform)null; for (int index = 0; index < parent.childCount; ++index) { Transform child = parent.GetChild(index); if (!Object.op_Equality((Object)child, (Object)null) && Object.op_Inequality((Object)((Component)child).GetComponent(), (Object)null)) return child; } return (Transform)null; } private List CollectDirectChilds(Transform parentTransform) { int childCount = parentTransform.childCount; List transformList = new List(childCount); for (int index = 0; index < childCount; ++index) transformList.Add(parentTransform.GetChild(index)); return transformList; } private class BoneMapping { public Transform proxyBone; public Transform clothBone; public int depth; public HumanBodyBones? humanBone; } } }