Files
AutoMorpherDecompiled/Assets/@Eden_Tools/Eden_AutoMorpher/Script/BodyPoseMatchSetupUtil.cs

192 lines
10 KiB
C#

// 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<HumanBodyBones, HashSet<Transform>> 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<SkinnedMeshRenderer> sourceBodyMeshes,
out List<SkinnedMeshRenderer> proxyBodyMeshes,
out Dictionary<Transform, Transform> sourceToProxy)
{
proxyBodyMeshes = (List<SkinnedMeshRenderer>)null;
if (Object.op_Equality((Object)sourceAvatar, (Object)null))
{
Debug.LogError((object)"[AvatarBodyMatchUtil] CreateSourceBodyProxy: sourceAvatar == null");
sourceToProxy = new Dictionary<Transform, Transform>();
return (GameObject)null;
}
GameObject clone = Object.Instantiate<GameObject>(((Component)sourceAvatar).gameObject);
((Object)clone).name = ((Object)sourceAvatar).name + "_BodyProxy";
HashSet<Transform> remainTransforms = new HashSet<Transform>();
remainTransforms.Add(clone.transform);
Animator component = clone.GetComponent<Animator>();
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<Mesh> meshSet = new HashSet<Mesh>();
if (sourceBodyMeshes != null)
{
foreach (SkinnedMeshRenderer sourceBodyMesh in (IEnumerable<SkinnedMeshRenderer>)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<SkinnedMeshRenderer>(true);
List<SkinnedMeshRenderer> skinnedMeshRendererList = new List<SkinnedMeshRenderer>();
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<Transform> 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<Transform>())
AddWithParents(t);
Transform[] componentsInChildren2 = clone.GetComponentsInChildren<Transform>(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<HumanBodyBones, HashSet<Transform>> 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<Transform> 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);
}
}
}